Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

mlview-editor.c

Go to the documentation of this file.
00001 /*
00002  *This file is part of MlView.
00003  *
00004  *MlView is free software; you can redistribute it and/or modify it under the terms of 
00005  *the GNU General Public License as published by the Free Software Foundation; either version 2, 
00006  *or (at your option) any later version.
00007  *
00008  *MlView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
00009  *without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00010  *See the GNU General Public License for more details.
00011  *
00012  *You should have received a copy of the GNU General Public License along with MlView; 
00013  *see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00014  *
00015  *
00016  *Copyright 2001-2002 Dodji Seketeli
00017  */
00018 
00019 #include <libxml/uri.h>
00020 #include <libxml/tree.h>
00021 
00022 #include "mlview-editor.h"
00023 #include "mlview-xml-doc-tree-view.h"
00024 #include "mlview-file-descriptor.h"
00025 #include "mlview-settings-builder.h"
00026 #include "mlview-global-settings.h"
00027 #include "mlview-xml-document.h"
00028 
00029 #include "utils.h"
00030 
00031 
00037 enum
00038 {
00039         DOCUMENT_CHANGED,
00040         SIGNAL_NUM
00041 };
00042 
00043 enum ContextualMenuEntry {
00044         CONTEXTUAL_MENU_ENTRY_START_BOUND,
00045         OPEN_FILE,
00046         CLOSE_FILE,
00047         SAVE_FILE,
00048         SEARCH,
00049         LAST_CONTEXTUAL_MENU_ENTRY_END_BOUND
00050 } ;
00051 
00052 /*======================================================
00053  *Some private (static) data structures used by
00054  *MlViewEditor widget.
00055  *=====================================================*/
00056 
00062 struct _MlViewEditorPrivate
00063 {
00069         GHashTable *mlview_xml_docs ;
00070         
00076         GHashTable *mlview_xml_doc_views ;
00077 
00081         GtkNotebook *notebook ;
00082 
00086         MlViewXMLDocumentView * current_xml_doc_view ;
00087 
00094         GHashTable *opened_file_base_names ;
00095 
00101         GHashTable *opened_file_paths ;
00102         
00107         GHashTable *opened_document_label_names ;
00108 
00110         guint untitled_docs_num ;
00111 
00113         guint opened_docs_num ;
00114 
00116         MlViewSettingsManager *settings_manager ;
00117 
00119         MlViewSettingsBuilder *settings_builder ;
00120 
00122         MlViewAppContext * app_context ;
00123 
00124         /*the editor contextual menu*/
00125         GtkMenu * contextual_menu ;
00126 } ;
00127 
00128 #define PRIVATE(editor) (editor->private)
00129 
00130 static void 
00131 mlview_editor_class_init                         (MlViewEditorClass *a_klass) ;
00132 
00133 static void 
00134 mlview_editor_init                               (MlViewEditor *a_editor) ;
00135 
00136 static void 
00137 mlview_editor_destroy (GtkObject *a_object) ;
00138 
00139 /*signal callbacks and default handlers*/
00140 static void 
00141 mlview_editor_switch_notebook_page_cb            (GtkNotebook *a_notebook,GtkNotebookPage *a_page,
00142                                                   gint a_page_num, MlViewEditor *a_editor) ;
00143 
00144 static gboolean 
00145 mlview_editor_event_cb (GtkWidget * a_widget, GdkEvent *a_event,
00146                                         gpointer a_user_data) ;
00147 
00148 static void 
00149 menu_open_local_file_activate_cb (GtkMenuItem * a_menu_item,
00150                                               gpointer *a_user_data) ;
00151 
00152 static void 
00153 menu_close_file_activate_cb (GtkMenuItem * a_menu_item,
00154                              gpointer *a_user_data) ;
00155 
00156 static void 
00157 menu_save_file_activate_cb (GtkMenuItem * a_menu_item,
00158                             gpointer *a_user_data) ;
00159 
00160 static void 
00161 menu_search_activate_cb (GtkMenuItem * a_menu_item,
00162                          gpointer *a_user_data) ;
00163 
00164 static void 
00165 menu_new_document_activate_cb (GtkMenuItem * a_menu_item,
00166                                gpointer *a_user_data) ;
00167 
00168 static void 
00169 view_name_changed_cb (MlViewXMLDocumentView *a_view,
00170                       gpointer a_editor) ;
00171 
00172 static GList *
00173 build_view_list_from_hashtable (GHashTable *a_views) ;
00174 
00175 static void
00176 add_hash_key_to_list (gpointer a_key,
00177                       gpointer a_value,
00178                       GList ** a_list) ;
00179 
00180 static GtkVBoxClass *parent_class = NULL ;
00181 static guint mlview_editor_signals[SIGNAL_NUM] = {0} ;
00182 
00183 
00184 
00185 /*============================================================
00186  *private method required by the GTK typing system
00187  *=============================================================*/
00188 
00189 
00195 static void
00196 mlview_editor_class_init (MlViewEditorClass * a_klass)
00197 {
00198         GtkObjectClass *object_class = GTK_OBJECT_CLASS (a_klass) ;
00199   
00200         parent_class = gtk_type_class (GTK_TYPE_VBOX) ;
00201   
00202         object_class->destroy = mlview_editor_destroy; /*overload the destroy method of GtkObject*/
00203   
00204         /*define the signals*/
00205         mlview_editor_signals[DOCUMENT_CHANGED] = gtk_signal_new ("document-changed",
00206                                                                   GTK_RUN_FIRST,
00207                                                                   object_class->type,
00208                                                                   GTK_SIGNAL_OFFSET(MlViewEditorClass,document_changed),
00209                                                                   gtk_marshal_NONE__NONE,
00210                                                                   GTK_TYPE_NONE,
00211                                                                   0);
00212         gtk_object_class_add_signals (object_class, mlview_editor_signals, SIGNAL_NUM) ;
00213         a_klass->document_changed = NULL ;
00214 }
00215 
00216 
00224 static void
00225 mlview_editor_init (MlViewEditor *a_editor)
00226 {
00227         g_assert (a_editor != NULL);
00228         PRIVATE (a_editor) = g_malloc0(sizeof(MlViewEditorPrivate));
00229 
00230         PRIVATE (a_editor)->notebook = GTK_NOTEBOOK(gtk_notebook_new()) ;
00231         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_editor)->notebook),
00232                             "switch-page",
00233                             GTK_SIGNAL_FUNC (mlview_editor_switch_notebook_page_cb),
00234                             a_editor) ;
00235         gtk_box_pack_start (GTK_BOX (a_editor),
00236                             GTK_WIDGET (PRIVATE(a_editor)->notebook),
00237                             TRUE,TRUE,0) ;
00238         
00239         PRIVATE (a_editor)->opened_file_base_names = g_hash_table_new(g_str_hash,g_str_equal) ;
00240         PRIVATE (a_editor)->opened_file_paths = g_hash_table_new(g_str_hash, g_str_equal) ;
00241         PRIVATE (a_editor)->opened_document_label_names = g_hash_table_new(g_str_hash, g_str_equal) ;
00242         PRIVATE (a_editor)->mlview_xml_docs = g_hash_table_new(g_direct_hash, g_direct_equal) ;
00243         PRIVATE (a_editor)->mlview_xml_doc_views = g_hash_table_new(g_direct_hash, g_direct_equal) ;
00244         PRIVATE (a_editor)->untitled_docs_num = 0 ;
00245         PRIVATE (a_editor)->opened_docs_num = 0 ;
00246 }
00247 
00248 
00249 /*================================================
00250  *private helper functions
00251  *
00252  *=================================================*/
00253 
00262 static void
00263 free_mlview_xml_doc_views_hash_elements (gpointer a_key, gpointer a_value, gpointer a_user_data)
00264 {
00265         MlViewXMLDocumentView *mlview_xml_doc_view ;
00266         g_return_if_fail (a_key) ;
00267 
00268         mlview_xml_doc_view = (MlViewXMLDocumentView *) a_key ;
00269         mlview_xml_document_view_destroy (a_key) ;
00270 }
00271 
00272 
00279 static void
00280 mlview_editor_build_contextual_menu (MlViewEditor * a_editor)
00281 {
00282         GtkWidget * menu_item = NULL ;
00283 
00284         g_return_if_fail (a_editor != NULL) ;
00285         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
00286         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00287 
00288         if (PRIVATE (a_editor)->contextual_menu) {
00289                 gtk_widget_destroy (GTK_WIDGET (PRIVATE (a_editor)->contextual_menu)) ;
00290                 PRIVATE (a_editor)->contextual_menu = NULL ;
00291         }
00292 
00293         PRIVATE (a_editor)->contextual_menu = GTK_MENU (gtk_menu_new ()) ;
00294 
00295         menu_item = gtk_menu_item_new_with_label (_("Open File")) ;
00296         gtk_signal_connect (GTK_OBJECT (menu_item),"activate",
00297                             GTK_SIGNAL_FUNC (menu_open_local_file_activate_cb),
00298                             a_editor) ;
00299         gtk_menu_append (GTK_MENU (PRIVATE (a_editor)->contextual_menu), 
00300                          menu_item) ;
00301         gtk_widget_show (menu_item) ;
00302 
00303 
00304         menu_item = gtk_menu_item_new_with_label (_("Close File")) ;
00305         gtk_signal_connect (GTK_OBJECT (menu_item),"activate",
00306                             GTK_SIGNAL_FUNC (menu_close_file_activate_cb), 
00307                             a_editor) ;
00308         gtk_menu_append (GTK_MENU (PRIVATE (a_editor)->contextual_menu), 
00309                          menu_item) ;
00310         gtk_widget_show (menu_item) ;
00311 
00312         menu_item = gtk_menu_item_new_with_label (_("Save File")) ;
00313         gtk_signal_connect (GTK_OBJECT (menu_item),"activate",
00314                             GTK_SIGNAL_FUNC (menu_save_file_activate_cb),
00315                             a_editor) ;
00316         gtk_menu_append (GTK_MENU (PRIVATE (a_editor)->contextual_menu), 
00317                          menu_item) ;
00318         gtk_widget_show (menu_item) ;
00319 
00320         /*separator*/
00321         menu_item = gtk_menu_item_new () ;
00322         gtk_menu_append (GTK_MENU (PRIVATE (a_editor)->contextual_menu), 
00323                          menu_item) ;
00324         gtk_widget_show (menu_item) ;
00325 
00326         menu_item = gtk_menu_item_new_with_label (_("Search")) ;
00327         gtk_signal_connect (GTK_OBJECT (menu_item),"activate",
00328                             GTK_SIGNAL_FUNC (menu_search_activate_cb),
00329                             a_editor) ;
00330         gtk_menu_append (GTK_MENU (PRIVATE (a_editor)->contextual_menu), 
00331                          menu_item) ;
00332         gtk_widget_show (menu_item) ;
00333 
00334         /*separator*/
00335         menu_item = gtk_menu_item_new () ;
00336         gtk_menu_append (GTK_MENU (PRIVATE (a_editor)->contextual_menu), 
00337                          menu_item) ;
00338         gtk_widget_show (menu_item) ;
00339 
00340         menu_item = gtk_menu_item_new_with_label (_("New Document")) ;
00341         gtk_signal_connect (GTK_OBJECT (menu_item),"activate",
00342                             GTK_SIGNAL_FUNC (menu_new_document_activate_cb),
00343                             a_editor) ;
00344         gtk_menu_append (GTK_MENU (PRIVATE (a_editor)->contextual_menu), 
00345                          menu_item) ;
00346         gtk_widget_show (menu_item) ;
00347 
00348         if (PRIVATE (a_editor)->current_xml_doc_view) {
00349                 mlview_xml_doc_tree_view_update_contextual_menu (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view),
00350                                                                  &PRIVATE (a_editor)->contextual_menu) ;
00351         }
00352 }
00353 
00354 /*================================================
00355  *signal callbacks and default handlers
00356  *
00357  *=================================================*/
00358 
00369 static void
00370 mlview_editor_switch_notebook_page_cb (GtkNotebook *a_notebook, GtkNotebookPage *a_page,
00371                                        gint a_page_num, MlViewEditor *a_editor)
00372 {
00373         MlViewXMLDocumentView *doc_view ;
00374 
00375         g_return_if_fail (a_editor != NULL) ;
00376         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
00377         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00378 
00379         doc_view = MLVIEW_XML_DOCUMENT_VIEW (a_page->child) ;
00380         g_return_if_fail (doc_view != NULL) ;
00381         PRIVATE (a_editor)->current_xml_doc_view = doc_view ;
00382 }
00383 
00384 
00391 static gboolean
00392 mlview_editor_event_cb (GtkWidget * a_widget,
00393                         GdkEvent *a_event,
00394                         gpointer a_user_data) {
00395 
00396         MlViewEditor * editor = NULL ;
00397 
00398         g_return_val_if_fail (a_widget != NULL, FALSE) ;
00399         g_return_val_if_fail (GTK_IS_WIDGET (a_widget), FALSE) ;
00400         g_return_val_if_fail (a_user_data != NULL, FALSE) ;
00401         g_return_val_if_fail (MLVIEW_IS_EDITOR (a_user_data), FALSE) ;
00402         g_return_val_if_fail (a_event != NULL, FALSE) ;
00403 
00404         editor = MLVIEW_EDITOR (a_user_data) ;
00405         g_return_val_if_fail (editor != NULL, FALSE) ;
00406         g_return_val_if_fail (PRIVATE (editor), FALSE) ;
00407         
00408         switch (a_event->type) {
00409         case GDK_BUTTON_PRESS :
00410                 if (a_event->button.button == 3) { 
00411                         /*user pressed the right mouse button*/
00412                         mlview_editor_build_contextual_menu (editor) ;
00413                         g_return_val_if_fail (PRIVATE (editor)->contextual_menu != NULL, FALSE) ;
00414 
00415                         gtk_menu_popup (PRIVATE (editor)->contextual_menu, NULL, NULL, NULL, 
00416                                         editor, a_event->button.button, a_event->button.time) ;
00417                 }
00418                 break ;
00419         default :
00420                 break ;
00421         }
00422         return FALSE ;
00423 }
00424 
00432 static void
00433 menu_open_local_file_activate_cb (GtkMenuItem * a_menu_item,
00434                                   gpointer *a_user_data)
00435 {
00436         MlViewEditor * editor = NULL ;
00437         g_return_if_fail (a_menu_item != NULL) ;
00438         g_return_if_fail (GTK_IS_MENU_ITEM (a_menu_item)) ;
00439         g_return_if_fail (a_user_data != NULL) ;
00440         g_return_if_fail (MLVIEW_IS_EDITOR (a_user_data)) ;
00441 
00442         editor = MLVIEW_EDITOR (a_user_data) ;
00443         mlview_editor_open_local_xml_document_interactive (editor) ;
00444 }
00445 
00446 
00454 static void
00455 menu_close_file_activate_cb (GtkMenuItem * a_menu_item,
00456                              gpointer *a_user_data)
00457 {
00458         MlViewEditor * editor = NULL ;
00459 
00460         g_return_if_fail (a_menu_item != NULL) ;
00461         g_return_if_fail (GTK_IS_MENU_ITEM (a_menu_item)) ;
00462         g_return_if_fail (a_user_data != NULL) ;
00463         g_return_if_fail (MLVIEW_IS_EDITOR (a_user_data)) ;
00464 
00465         editor = MLVIEW_EDITOR (a_user_data) ;
00466         mlview_editor_close_xml_document_interactive (editor) ;
00467 }
00468 
00476 static void
00477 menu_save_file_activate_cb (GtkMenuItem * a_menu_item,
00478                             gpointer *a_user_data)
00479 {
00480         MlViewEditor * editor = NULL ;
00481 
00482         g_return_if_fail (a_menu_item != NULL) ;
00483         g_return_if_fail (GTK_IS_MENU_ITEM (a_menu_item)) ;
00484         g_return_if_fail (a_user_data != NULL) ;
00485         g_return_if_fail (MLVIEW_IS_EDITOR (a_user_data)) ;
00486 
00487         editor = MLVIEW_EDITOR (a_user_data) ;
00488         mlview_editor_save_xml_document (editor) ;
00489 }
00490 
00491 
00499 static void
00500 menu_search_activate_cb (GtkMenuItem * a_menu_item,
00501                          gpointer *a_user_data)
00502 {
00503         MlViewEditor * editor = NULL ;
00504 
00505         g_return_if_fail (a_menu_item != NULL) ;
00506         g_return_if_fail (GTK_IS_MENU_ITEM (a_menu_item)) ;
00507         g_return_if_fail (a_user_data != NULL) ;
00508         g_return_if_fail (MLVIEW_IS_EDITOR (a_user_data)) ;
00509 
00510         editor = MLVIEW_EDITOR (a_user_data) ;
00511         mlview_editor_find_xml_node_that_contains_str_interactive (editor) ;
00512 }
00513 
00514 
00522 static void
00523 menu_new_document_activate_cb (GtkMenuItem * a_menu_item,
00524                                gpointer *a_user_data)
00525 {
00526         MlViewEditor * editor = NULL ;
00527 
00528         g_return_if_fail (a_menu_item != NULL) ;
00529         g_return_if_fail (GTK_IS_MENU_ITEM (a_menu_item)) ;
00530         g_return_if_fail (a_user_data != NULL) ;
00531         g_return_if_fail (MLVIEW_IS_EDITOR (a_user_data)) ;
00532 
00533         editor = MLVIEW_EDITOR (a_user_data) ;
00534         mlview_editor_create_new_xml_document (editor) ;
00535 }
00536 
00537 
00546 static void 
00547 view_name_changed_cb (MlViewXMLDocumentView *a_view,
00548                       gpointer a_editor) {
00549 
00550         MlViewEditor *editor = NULL ;
00551         gchar * new_view_name = NULL ;
00552 
00553         g_return_if_fail (a_view != NULL) ;
00554         g_return_if_fail (MLVIEW_XML_DOCUMENT_VIEW (a_view)) ;
00555         g_return_if_fail (a_editor != NULL) ;
00556         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
00557 
00558         editor = MLVIEW_EDITOR (a_editor) ;
00559         g_return_if_fail (PRIVATE (editor) != NULL) ;
00560         g_return_if_fail (PRIVATE (editor)->notebook != NULL) ;
00561 
00562         new_view_name = 
00563                 mlview_xml_document_view_get_name (a_view) ;
00564 
00565         gtk_notebook_set_tab_label_text (PRIVATE (editor)->notebook,
00566                                          GTK_WIDGET (a_view),
00567                                          new_view_name) ;
00568 
00569 }
00570 
00571 
00572 static GList *
00573 build_view_list_from_hashtable (GHashTable *a_views)
00574 {
00575         GList * result = NULL ;
00576         g_hash_table_foreach (a_views, 
00577                               (GHFunc) add_hash_key_to_list,
00578                               &result) ;
00579         return result ;
00580 }
00581 
00582 
00583 static void
00584 add_hash_key_to_list (gpointer a_key,
00585                         gpointer a_value,
00586                         GList ** a_list)
00587 {
00588 
00589         g_return_if_fail (a_list != NULL) ;
00590         *a_list  = g_list_append (*a_list, a_key) ;
00591 }
00592 
00593 /*=================================================
00594  *public methods
00595  *=================================================*/
00596 
00601 guint
00602 mlview_editor_get_type (void)
00603 {
00604         static guint mlview_editor_type = 0;
00605         if (!mlview_editor_type) {
00606                 static const GtkTypeInfo mlview_editor_type_info = {
00607                         "MlViewEditor",
00608                         sizeof(MlViewEditor),
00609                         sizeof(MlViewEditorClass),
00610                         (GtkClassInitFunc) mlview_editor_class_init,
00611                         (GtkObjectInitFunc) mlview_editor_init,
00612                         NULL,
00613                         NULL,
00614                         (GtkClassInitFunc) NULL
00615                 };
00616                 mlview_editor_type = gtk_type_unique(gtk_vbox_get_type(), &mlview_editor_type_info);
00617         }
00618         return mlview_editor_type ;
00619 }
00620 
00621 
00628 GtkWidget*
00629 mlview_editor_new (gchar * a_title, MlViewAppContext * a_context)
00630 {
00631         MlViewEditor *editor = NULL ;
00632         gpointer tmp = NULL ;   
00633         editor = gtk_type_new (MLVIEW_TYPE_EDITOR) ;
00634 
00635         PRIVATE(editor)->app_context = a_context ;
00636         g_return_val_if_fail (a_context != NULL, NULL) ;
00637 
00638         /*handles mlview editor settings stufs. Therefore, instanciate the mlview settings management*/ 
00639         PRIVATE (editor)->settings_builder = mlview_settings_builder_new (PRIVATE (editor)->app_context) ;
00640         g_return_val_if_fail (PRIVATE (editor)->settings_builder != NULL, NULL) ;
00641 
00642         mlview_settings_builder_build_settings (PRIVATE (editor)->settings_builder) ;
00643 
00644         PRIVATE (editor)->settings_manager = mlview_settings_builder_get_settings_manager (PRIVATE (editor)->settings_builder) ;
00645 
00646         tmp = mlview_app_context_get_element (a_context, "GnomeApp") ;
00647         if (tmp && GTK_IS_WIDGET (tmp)) {
00648                 GtkWidget * parent_app = NULL ;
00649 
00650                 parent_app = GTK_WIDGET (tmp) ;
00651                 gtk_widget_add_events (parent_app, GDK_BUTTON3_MOTION_MASK) ;
00652                 gtk_signal_connect (GTK_OBJECT (parent_app), "button_press_event",
00653                                     GTK_SIGNAL_FUNC (mlview_editor_event_cb),
00654                                     editor) ;
00655         }
00656 
00657         return GTK_WIDGET(editor) ;
00658 }
00659 
00660 
00668 void 
00669 mlview_editor_set_app_context (MlViewEditor * a_editor, 
00670                                MlViewAppContext *a_context)
00671 {
00672         g_return_if_fail (a_editor != NULL) ;
00673         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
00674         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00675         g_return_if_fail (a_context != NULL) ;
00676         g_return_if_fail (MLVIEW_IS_APP_CONTEXT (a_context)) ;
00677 
00678         PRIVATE (a_editor)->app_context = a_context ;   
00679 }
00680 
00681 
00689 MlViewAppContext *
00690 mlview_editor_get_app_context (MlViewEditor *a_editor)
00691 {
00692         g_return_val_if_fail (a_editor != NULL, NULL) ;
00693         g_return_val_if_fail (MLVIEW_IS_EDITOR (a_editor), NULL) ;
00694         g_return_val_if_fail (PRIVATE (a_editor) != NULL, NULL) ;
00695 
00696         return PRIVATE (a_editor)->app_context ;
00697 }
00698 
00699 
00707 void
00708 mlview_editor_load_xml_file (MlViewEditor *a_editor, gchar * a_file_path)
00709 {
00710         MlViewXMLDocument * mlview_xml_document = NULL ;
00711 
00712         g_return_if_fail (a_editor != NULL) ;
00713         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
00714         g_return_if_fail (PRIVATE (a_editor)) ;
00715 
00716         if (a_file_path == NULL)
00717                 return ;
00718 
00719         mlview_app_context_sbar_push_message (PRIVATE (a_editor)->app_context, 
00720                                               _("Opening file %s ..."), a_file_path) ;
00721         
00722         mlview_xml_document =
00723                 mlview_xml_document_open (a_file_path, PRIVATE (a_editor)->app_context) ;
00724 
00725         if (mlview_xml_document) {
00726 
00727                 MlViewXMLDocumentView * new_view = NULL ;
00728                 GtkWidget * parent_window = NULL ;
00729 
00730                 new_view =
00731                         MLVIEW_XML_DOCUMENT_VIEW (mlview_xml_doc_tree_view_new (mlview_xml_document, a_file_path,
00732                                                                                 PRIVATE (a_editor)->app_context)) ;
00733                 g_return_if_fail (new_view != NULL) ;
00734                 PRIVATE(a_editor)->current_xml_doc_view =  new_view ;
00735 
00736                 parent_window = gtk_widget_get_toplevel (GTK_WIDGET (a_editor)) ;
00737 
00738                 gtk_widget_add_events (parent_window, GDK_BUTTON3_MOTION_MASK) ;
00739 
00740                 gtk_signal_connect (GTK_OBJECT (parent_window), "button_press_event",
00741                                     GTK_SIGNAL_FUNC (mlview_editor_event_cb),
00742                                     a_editor) ;
00743 
00744                 mlview_editor_add_xml_document_view (a_editor,
00745                                                      MLVIEW_XML_DOCUMENT_VIEW (PRIVATE(a_editor)->current_xml_doc_view)) ;
00746         }
00747 
00748         /*
00749          *FIXME: add support for exception thrown by mlview_xml_document_open in case 
00750          *of error and display that error => BIG DEAL
00751          */
00752 
00753         mlview_app_context_sbar_pop_message (PRIVATE (a_editor)->app_context) ;
00754 }
00755 
00756 
00761 void
00762 mlview_editor_open_local_xml_document_interactive (MlViewEditor * a_editor)
00763 {
00764         MlViewFileSelection * file_selector ;
00765         enum MLVIEW_SELECTED_BUTTON button ;
00766         gchar * file_name = NULL ;
00767 
00768         g_return_if_fail (a_editor != NULL) ;
00769         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
00770         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00771         g_return_if_fail (PRIVATE (a_editor)->app_context != NULL) ;
00772 
00773         file_selector = 
00774                 mlview_app_context_get_file_selector (PRIVATE (a_editor)->app_context, 
00775                                                       _("Open xml document")) ;
00776         g_return_if_fail (file_selector != NULL) ;
00777 
00778         mlview_app_context_sbar_push_message (PRIVATE (a_editor)->app_context,
00779                                               _("Choose the xml file to open")) ;
00780 
00781         gtk_widget_realize (GTK_WIDGET (file_selector)) ;
00782         mlview_app_context_set_window_icon (PRIVATE (a_editor)->app_context, GTK_WIDGET (file_selector)) ;
00783         button = mlview_file_selection_run (MLVIEW_FILE_SELECTION (file_selector),
00784                                             TRUE) ;
00785         switch ( button ) {
00786         case OK_BUTTON:
00787                 file_name = gtk_file_selection_get_filename (GTK_FILE_SELECTION (file_selector)) ;
00788                 if ( file_name  &&  strcmp (file_name, "") )
00789                         mlview_editor_load_xml_file (a_editor, file_name) ;
00790         case CANCEL_BUTTON:
00791         case WINDOW_CLOSED:
00792         default :
00793                 break ;
00794         }
00795 
00796         mlview_app_context_sbar_pop_message (PRIVATE (a_editor)->app_context) ; 
00797 }
00798 
00799 
00808 MlViewXMLDocumentView *
00809 mlview_editor_create_new_view_on_document (MlViewEditor *a_editor,
00810                                            MlViewXMLDocument *a_xml_doc,
00811                                            enum MLVIEW_XML_DOC_VIEW_TYPE a_view_type)
00812 
00813 {
00814         MlViewXMLDocumentView * result = NULL ;
00815 
00816         g_return_val_if_fail (a_editor != NULL, NULL) ;
00817         g_return_val_if_fail (MLVIEW_IS_EDITOR (a_editor), NULL) ;
00818         g_return_val_if_fail (PRIVATE (a_editor) != NULL, NULL) ;
00819         g_return_val_if_fail (a_xml_doc != NULL, NULL) ;
00820         g_return_val_if_fail (MLVIEW_IS_XML_DOCUMENT (a_xml_doc), NULL) ;
00821 
00822         switch (a_view_type) {
00823         case MLVIEW_XML_DOC_TREE_VIEW:
00824                 result = 
00825                         MLVIEW_XML_DOCUMENT_VIEW (mlview_xml_doc_tree_view_new (a_xml_doc, NULL, 
00826                                                                                 PRIVATE (a_editor)->app_context)) ;
00827                 mlview_editor_add_xml_document_view (a_editor, result) ;
00828                 break ;
00829         default :
00830                 break ;
00831         }
00832 
00833         return result ;
00834 }
00835 
00836 
00846 MlViewXMLDocumentView *
00847 mlview_editor_create_new_view_on_current_document_interactive (MlViewEditor *a_editor)
00848 {
00849         MlViewXMLDocument * xml_document = NULL ;
00850 
00851         g_return_val_if_fail (a_editor != NULL, NULL) ;
00852         g_return_val_if_fail (MLVIEW_IS_EDITOR (a_editor), NULL) ;
00853         g_return_val_if_fail (PRIVATE (a_editor) != NULL, NULL) ;
00854         
00855         
00856         if (PRIVATE (a_editor)->current_xml_doc_view == NULL)
00857                 return NULL ;
00858 
00859         xml_document = 
00860                 mlview_xml_document_view_get_document (PRIVATE (a_editor)->current_xml_doc_view) ;
00861 
00862         return mlview_editor_create_new_view_on_document (a_editor, xml_document, 
00863                                                           MLVIEW_XML_DOC_TREE_VIEW) ;
00864 
00865 }
00866 
00867 
00874 void
00875 mlview_editor_set_current_view_name (MlViewEditor *a_editor, 
00876                                      gchar * a_name)
00877 {
00878         g_return_if_fail (a_editor != NULL) ;
00879         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
00880         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00881 
00882         if (PRIVATE (a_editor)->current_xml_doc_view == NULL)
00883                 return ;
00884 
00885         mlview_xml_document_view_set_name (PRIVATE (a_editor)->current_xml_doc_view,
00886                                            a_name) ;
00887 }
00888 
00889 
00896 void
00897 mlview_editor_set_current_view_name_interactive (MlViewEditor *a_editor)
00898 {
00899         g_return_if_fail (a_editor != NULL) ;
00900         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
00901         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00902 
00903         if (PRIVATE (a_editor)->current_xml_doc_view == NULL)
00904                 return ;
00905 
00906         mlview_xml_document_view_set_name_interactive (PRIVATE (a_editor)->current_xml_doc_view) ;
00907 }
00908 
00909 
00926 void
00927 mlview_editor_add_xml_document_view (MlViewEditor * a_editor,
00928                                      MlViewXMLDocumentView * a_xml_doc_view)
00929 {
00930           MlViewFileDescriptor * file_desc = NULL ;
00931           gchar *file_path = NULL, *base_name = NULL ;
00932           MlViewXMLDocument * mlview_xml_document = NULL ;
00933           GHashTable *views_associated_to_document = NULL ;
00934           gpointer ptr = NULL ;
00935           gboolean is_new_document = TRUE ;
00936           GtkWidget *label = NULL ;
00937 
00938           g_return_if_fail (a_editor != NULL) ;
00939           g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
00940           g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00941           g_return_if_fail (PRIVATE (a_editor)->notebook != NULL) ;
00942           g_return_if_fail (a_xml_doc_view != NULL) ;
00943 
00944           g_return_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_xml_doc_view)) ;
00945           g_return_if_fail (PRIVATE (a_editor)->mlview_xml_docs != NULL) ;
00946           g_return_if_fail (PRIVATE (a_editor)->mlview_xml_doc_views != NULL) ;
00947 
00948           if (PRIVATE (a_editor)->current_xml_doc_view == NULL)
00949                   PRIVATE (a_editor)->current_xml_doc_view = a_xml_doc_view ;
00950 
00951           file_desc = mlview_xml_document_view_get_file_descriptor (a_xml_doc_view) ;
00952           if (file_desc)
00953                   file_path = mlview_file_descriptor_get_file_path (file_desc) ;
00954           mlview_xml_document = mlview_xml_document_view_get_document (a_xml_doc_view) ;
00955           g_return_if_fail (mlview_xml_document != NULL) ;
00956 
00957           /*check if a view on the same document has been added to
00958            *the editor already.
00959            */
00960           views_associated_to_document = 
00961                   g_hash_table_lookup (PRIVATE (a_editor)->mlview_xml_docs, 
00962                                        mlview_xml_document) ;
00963 
00964           if (views_associated_to_document) {
00965                   is_new_document = FALSE ;
00966           }
00967 
00968           if (file_path == NULL) {
00969                   gchar *tmp_str = NULL, *label_str = NULL ;
00970                   
00971                   if (is_new_document == TRUE)
00972                           PRIVATE (a_editor)->untitled_docs_num ++ ;
00973                   tmp_str = g_strdup_printf ("%d", PRIVATE (a_editor)->untitled_docs_num) ;
00974                   label_str = g_strconcat ("untitled", tmp_str, NULL) ;
00975                   label = gtk_label_new (label_str) ;
00976                   g_free (label_str) ;
00977                   g_free (tmp_str) ;
00978 
00979           } else {
00980 
00981                   gint base_name_nb = 0 ;
00982                 
00983                   gboolean file_is_already_opened = FALSE ;
00984                   base_name = g_basename (file_path) ;
00985 
00986                   
00987                   if (is_new_document
00988                       && (ptr = g_hash_table_lookup (PRIVATE (a_editor)->opened_file_paths, file_path)) != NULL) {
00989                           /*This document is already opened. So, reopen it.
00990                            *that is, remove it previous instance and add
00991                            *the new one.
00992                            */
00993                           GtkWidget *old_label = NULL ;
00994                           gchar *old_label_str_tmp = NULL, *old_label_str = NULL ;
00995 
00996                           /*get the old label string because this document
00997                            *must have the same label as the one alreay opened
00998                            */
00999                           old_label = gtk_notebook_get_tab_label (PRIVATE (a_editor)->notebook,
01000                                                                   GTK_WIDGET ((MlViewXMLDocumentView *)ptr)) ;
01001                           g_assert (old_label != NULL) ;
01002                           gtk_label_get (GTK_LABEL (old_label), &old_label_str_tmp) ;
01003 
01004                           /*make a copy of the label string because
01005                            *mlview_editor_remove_xml_document ()
01006                            *will destroy this label.
01007                            */
01008 
01009                           /*old_label_str_tmp belongs to label,
01010                            *and will be freed by him
01011                            */
01012                           old_label_str = g_strdup (old_label_str_tmp) ;
01013 
01014                           mlview_editor_remove_xml_document_view (a_editor,
01015                                                                   (MlViewXMLDocumentView *)ptr) ;
01016 
01017                           /*create the label of this document notebook page*/
01018                           label = gtk_label_new (old_label_str) ;
01019                           g_free (old_label_str) ;/*old_label_str has been strduped*/
01020                           gtk_label_get (GTK_LABEL (label),
01021                                          &old_label_str) ;
01022 
01023                           /*old_label_str belongs to label and will be freed by him
01024                            *so we can use as key in a hash table without any need of
01025                            *freeing it.
01026                            */
01027                           g_hash_table_insert (PRIVATE(a_editor)->opened_document_label_names,
01028                                                g_strdup (old_label_str), a_xml_doc_view) ;
01029                           file_is_already_opened = TRUE ;
01030 
01031                   } else if ((ptr = g_hash_table_lookup (PRIVATE (a_editor)->opened_file_base_names, base_name)) == NULL) {
01032                           /*It is the first time a document with this basename is opened*/
01033                           base_name_nb = 1 ;
01034 
01035                   } else if (ptr != NULL) {
01036                           /*some documents with the this basename are already opened*/
01037                           base_name_nb = GPOINTER_TO_INT (ptr) ;
01038                           if (!is_new_document)
01039                                   base_name_nb ++ ;
01040                   } 
01041                   
01042                   g_hash_table_insert (PRIVATE (a_editor)->opened_file_base_names, 
01043                                        base_name, GINT_TO_POINTER (base_name_nb)) ;
01044 
01045                   g_hash_table_insert (PRIVATE (a_editor)->opened_file_paths,
01046                                        file_path, a_xml_doc_view) ;
01047 
01048                   if (base_name_nb > 1) {
01049                           gchar * tmp_str = NULL, *label_str = NULL ;
01050 
01051                           while (1) {
01052 
01053                                   tmp_str = g_strdup_printf ("%d", base_name_nb) ;
01054                                   label_str = g_strconcat (base_name,
01055                                                            "<", tmp_str,">",
01056                                                            NULL) ;
01057 
01058                                   if (g_hash_table_lookup (PRIVATE (a_editor)->opened_document_label_names, 
01059                                                            label_str)) {
01060                                           base_name_nb++ ;
01061                                           g_free(tmp_str) ;
01062                                           continue ;
01063                                   }
01064                                   break ;
01065                           }
01066                           mlview_xml_document_view_set_name (a_xml_doc_view, label_str) ;
01067 
01068                           label = gtk_label_new (label_str) ;
01069                           g_hash_table_insert (PRIVATE (a_editor)->opened_document_label_names,
01070                                                g_strdup (label_str), a_xml_doc_view) ;
01071                           g_free (tmp_str) ;
01072                           g_free (label_str) ;
01073 
01074                   } else if (file_is_already_opened == FALSE) {
01075 
01076                           label = gtk_label_new (base_name) ;
01077                           g_hash_table_insert (PRIVATE (a_editor)->opened_document_label_names,
01078                                                g_strdup (base_name), a_xml_doc_view) ;
01079                   }
01080           }
01081 
01082           /*update the view->document index*/
01083           g_hash_table_insert (PRIVATE (a_editor)->mlview_xml_doc_views,
01084                                a_xml_doc_view, mlview_xml_document) ;
01085 
01086           /*update the document->views index*/
01087           views_associated_to_document = g_hash_table_lookup (PRIVATE (a_editor)->mlview_xml_docs, mlview_xml_document) ;
01088           if (!views_associated_to_document) {
01089 
01090                   views_associated_to_document = g_hash_table_new (g_direct_hash, g_direct_equal) ;
01091                   g_assert (views_associated_to_document != NULL) ;
01092                   
01093                   g_hash_table_insert (PRIVATE (a_editor)->mlview_xml_docs, 
01094                                        mlview_xml_document, 
01095                                        views_associated_to_document) ;
01096           }
01097 
01098           g_hash_table_insert (views_associated_to_document, 
01099                                a_xml_doc_view, mlview_xml_document) ;
01100 
01101           if (is_new_document == TRUE)
01102                   PRIVATE (a_editor)->opened_docs_num ++ ;
01103 
01104           /*now, visually add the view*/
01105           gtk_notebook_append_page (PRIVATE (a_editor)->notebook,
01106                                     GTK_WIDGET (a_xml_doc_view),
01107                                     label) ;
01108 
01109           gtk_signal_connect (GTK_OBJECT (a_xml_doc_view),
01110                               "name-changed",
01111                               GTK_SIGNAL_FUNC (view_name_changed_cb),
01112                               a_editor) ;
01113 
01114           gtk_widget_show_all (GTK_WIDGET (a_editor)) ;
01115 
01116           mlview_xml_doc_tree_view_set_all_paned_proportions (MLVIEW_XML_DOC_TREE_VIEW (a_xml_doc_view),
01117                                                               30, 20) ;
01118 }
01119 
01120 
01128 void
01129 mlview_editor_remove_xml_document_view (MlViewEditor * a_editor, 
01130                                         MlViewXMLDocumentView * a_xml_doc_view)
01131 {
01132         GtkWidget *label = NULL ;
01133         gpointer *ptr = NULL ;
01134         gint notebook_page_num ;
01135         MlViewFileDescriptor *file_desc = NULL ;
01136         MlViewXMLDocument * mlview_xml_doc = NULL ;
01137         GHashTable *views_related_to_document = NULL ;
01138         gboolean doc_closed = FALSE ;
01139         gchar *file_path = NULL, *base_name = NULL, *label_str = NULL ;
01140 
01141         g_return_if_fail (a_editor != NULL) ;
01142         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01143         g_return_if_fail (PRIVATE(a_editor) != NULL) ;
01144         g_return_if_fail (PRIVATE (a_editor)->mlview_xml_doc_views != NULL) ;
01145 
01146         g_return_if_fail (a_xml_doc_view != NULL) ;
01147         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_xml_doc_view)) ;
01148         
01149         file_desc = mlview_xml_document_view_get_file_descriptor (a_xml_doc_view) ;
01150         if (file_desc)
01151                 file_path  = mlview_file_descriptor_get_file_path (file_desc) ;
01152 
01153         if (file_path != NULL)
01154                 base_name = g_basename (file_path) ;
01155 
01156         mlview_xml_doc = mlview_xml_document_view_get_document (a_xml_doc_view) ;
01157         g_return_if_fail (mlview_xml_doc != NULL) ;
01158 
01159         label = gtk_notebook_get_tab_label (PRIVATE(a_editor)->notebook,
01160                                                     GTK_WIDGET (a_xml_doc_view)) ;
01161         gtk_label_get (GTK_LABEL(label), &label_str) ;
01162         label_str = g_strdup (label_str) ;
01163 
01164         g_return_if_fail (label != NULL) ;
01165 
01166         /*check if the document view a_xml_doc_view
01167          *is opened in this instance of MlViewEditor.
01168          */
01169         ptr = g_hash_table_lookup (PRIVATE (a_editor)->mlview_xml_doc_views, a_xml_doc_view) ;
01170         g_return_if_fail (ptr != NULL) ;
01171 
01172         /*removes a_xml_doc_view from the hashtable of the opened document views.
01173          *and from the opened_file_paths hash_table.
01174          */
01175         g_hash_table_remove (PRIVATE (a_editor)->mlview_xml_doc_views, a_xml_doc_view) ;
01176 
01177         views_related_to_document = 
01178                 g_hash_table_lookup (PRIVATE (a_editor)->mlview_xml_docs, mlview_xml_doc) ;
01179         g_return_if_fail (views_related_to_document != NULL) ;
01180         
01181         ptr = g_hash_table_lookup (views_related_to_document, a_xml_doc_view) ;
01182         g_return_if_fail (ptr != NULL) ;
01183         
01184         g_hash_table_remove (views_related_to_document, a_xml_doc_view) ;
01185 
01186         /*removes the notebook page that contains the view*/
01187         notebook_page_num = gtk_notebook_page_num (PRIVATE(a_editor)->notebook, 
01188                                                    GTK_WIDGET (a_xml_doc_view)) ;
01189 
01190         g_return_if_fail (notebook_page_num != -1) ;
01191         gtk_notebook_remove_page ( PRIVATE(a_editor)->notebook, notebook_page_num) ;
01192         
01193         if (g_hash_table_size (views_related_to_document) == 0 ) {
01194                 /*no views are opened on the current doc anymore=>close the doc*/
01195                 g_hash_table_remove (PRIVATE (a_editor)->mlview_xml_docs, mlview_xml_doc) ;
01196                 gtk_object_destroy (GTK_OBJECT (mlview_xml_doc)) ;
01197                 mlview_xml_doc = NULL ;
01198                 doc_closed = TRUE ;
01199 
01200                 if (file_path != NULL) {
01201                         g_hash_table_remove (PRIVATE (a_editor)->opened_file_paths, file_path) ;
01202                 }
01203                 
01204                 PRIVATE (a_editor)->opened_docs_num-- ;
01205         }
01206 
01207         if (doc_closed && label_str) {
01208                 /*remove the entry in the opened_document_label_names hash table*/
01209                 g_hash_table_remove (PRIVATE (a_editor)->opened_document_label_names, label_str) ;
01210                 g_free (label_str) ;
01211                 label_str = NULL ;
01212         }
01213 
01214         /*if there are several docs that have the save base name as this one,
01215          *decrement their number, and if the number reaches 0, remove the entry matching this base name
01216          *from the hash table.
01217          */
01218         if (doc_closed == TRUE && file_path != NULL) {
01219                 gint tmp_int ;
01220                 ptr = g_hash_table_lookup (PRIVATE (a_editor)->opened_file_base_names, base_name)  ;
01221                 tmp_int = GPOINTER_TO_INT (ptr) ;
01222                 tmp_int-- ;
01223                 if (tmp_int == 0)
01224                         g_hash_table_remove( PRIVATE (a_editor)->opened_file_base_names, base_name) ;
01225                 else {
01226                         ptr = GINT_TO_POINTER (tmp_int) ;
01227                         g_hash_table_insert (PRIVATE (a_editor)->opened_file_base_names, base_name, ptr) ;
01228                 }
01229         } else if (doc_closed == TRUE && !file_path) {
01230                 PRIVATE (a_editor)->untitled_docs_num -- ;
01231         }
01232 }
01233 
01234 
01242 void
01243 mlview_editor_create_new_xml_document (MlViewEditor * a_editor)
01244 {
01245         MlViewXMLDocument * mlview_doc ;
01246         GtkWidget * label,*entry,* table ;
01247         gint res ;
01248         GtkWidget *dialog ;
01249         gchar *element_name ;
01250         xmlDocPtr xml_doc=NULL ;
01251         xmlNodePtr xml_node=NULL ;
01252         gchar * validation_is_on = NULL ;
01253         
01254         g_return_if_fail (a_editor != NULL) ;
01255         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01256         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01257         g_return_if_fail (PRIVATE (a_editor)->app_context != NULL) ;
01258 
01259         validation_is_on = 
01260                 mlview_app_context_get_settings_value (PRIVATE (a_editor)->app_context, 
01261                                                        MLVIEW_STG_K_IS_VALIDATION_ON) ;
01262 
01263         dialog = 
01264                 gnome_dialog_new (_("Name of the root element"),
01265                                   GNOME_STOCK_BUTTON_YES,
01266                                   GNOME_STOCK_BUTTON_CANCEL,
01267                                   NULL) ;
01268         
01269         gtk_window_set_wmclass (GTK_WINDOW (dialog), "root-element-dialog", "MlView") ;
01270 
01271         gnome_dialog_close_hides (GNOME_DIALOG (dialog), FALSE) ;
01272         
01273         label = gtk_label_new (_("Root element name:")) ;
01274         entry = gtk_entry_new () ;
01275         table = gtk_table_new (1,2,TRUE) ;
01276 
01277         gtk_table_attach_defaults (GTK_TABLE(table), label,
01278                                    0,1,0,1) ;
01279         gtk_table_attach_defaults (GTK_TABLE(table), entry,
01280                                    1,2,0,1) ;
01281         gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox),table,TRUE,TRUE,0) ;
01282         gtk_widget_show_all (table) ;
01283         gtk_widget_grab_focus (entry) ;
01284         gnome_dialog_set_default (GNOME_DIALOG(dialog),0) ;
01285 
01286         gtk_widget_realize (GTK_WIDGET (dialog)) ;
01287         mlview_app_context_set_window_icon (PRIVATE (a_editor)->app_context, GTK_WIDGET (dialog)) ;
01288         res = gnome_dialog_run (GNOME_DIALOG (dialog)) ;
01289 
01290         if (res == 0) {/*pressed ok*/
01291                 element_name = gtk_entry_get_text (GTK_ENTRY(entry)) ;
01292                 if (!utils_is_white_string (element_name)) {
01293                         xml_node = xmlNewNode (NULL, g_strdup(element_name)) ;
01294                         xml_doc = xmlNewDoc ("1.0") ;
01295                         xml_doc->name = g_strdup ("untitled") ;
01296                         mlview_doc = mlview_xml_document_new (xml_doc, PRIVATE(a_editor)->app_context) ;
01297                         
01298                         if (mlview_doc != NULL
01299                             && (validation_is_on != NULL)
01300                             && (strcmp (validation_is_on, MLVIEW_STG_V_YES) == 0)) {
01301                                 mlview_xml_document_associate_dtd_interactive (mlview_doc) ;
01302                         }
01303 
01304                         xml_node = 
01305                                 mlview_xml_document_add_child_node (mlview_doc, (xmlNode*)xml_doc,
01306                                                                     xml_node, TRUE) ;
01307 
01308                         g_return_if_fail (xml_node != NULL) ;
01309                         xmlDocSetRootElement (xml_doc, xml_node) ;
01310                         gnome_dialog_close (GNOME_DIALOG(dialog)) ;
01311                                                 
01312 
01313                         if (mlview_doc != NULL) {
01314                                 MlViewXMLDocumentView *view = NULL ;
01315                                 view = 
01316                                         MLVIEW_XML_DOCUMENT_VIEW (mlview_xml_doc_tree_view_new (mlview_doc,"", 
01317                                                                                                 PRIVATE (a_editor)->app_context)) ;
01318                                 mlview_editor_add_xml_document_view(a_editor, view) ;
01319                         }
01320                 }
01321         } else if (res == 1) {/*pressed cancel button*/
01322                 gnome_dialog_close (GNOME_DIALOG (dialog)) ;
01323         } else if (res == -1) {
01324                 gnome_dialog_close (GNOME_DIALOG (dialog)) ;
01325         }
01326 }
01327 
01337 void
01338 mlview_editor_edit_xml_document (MlViewEditor *a_editor, 
01339                                  xmlDocPtr a_doc, 
01340                                  gchar * a_doc_name)
01341 {
01342         MlViewXMLDocumentView * doc_view = NULL ;
01343         MlViewXMLDocument * mlview_xml_doc = NULL ;
01344 
01345         g_return_if_fail (a_editor != NULL) ;
01346         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01347         g_return_if_fail (PRIVATE(a_editor) != NULL) ;
01348         g_return_if_fail(a_doc != NULL) ;
01349 
01350         mlview_xml_doc = 
01351                 mlview_xml_document_new (a_doc, PRIVATE (a_editor)->app_context) ;
01352         doc_view = 
01353                 MLVIEW_XML_DOCUMENT_VIEW (mlview_xml_doc_tree_view_new (mlview_xml_doc, "",
01354                                                                         PRIVATE (a_editor)->app_context)) ;
01355         mlview_editor_add_xml_document_view (a_editor, doc_view) ;
01356 }
01357 
01358 
01367 void
01368 mlview_editor_add_child_node_interactive (MlViewEditor *a_editor)
01369 {       
01370         g_return_if_fail (a_editor != NULL) ;
01371         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01372         g_return_if_fail (PRIVATE(a_editor) != NULL) ;
01373 
01374         if(PRIVATE (a_editor)->current_xml_doc_view)
01375                 mlview_xml_doc_tree_view_add_child_node_interactive (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view)) ;
01376 }
01377 
01378 
01385 void
01386 mlview_editor_insert_prev_sibling_node_interactive (MlViewEditor *a_editor)
01387 {
01388         g_return_if_fail (a_editor != NULL) ;
01389         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01390         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01391         
01392         if (PRIVATE(a_editor)->current_xml_doc_view)
01393                 mlview_xml_doc_tree_view_insert_prev_sibling_node_interactive (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view)) ;
01394 }
01395 
01396 
01403 void
01404 mlview_editor_insert_next_sibling_node_interactive (MlViewEditor *a_editor)
01405 {
01406         g_return_if_fail(a_editor != NULL) ;
01407         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01408         g_return_if_fail(PRIVATE(a_editor) != NULL) ;
01409         
01410         if (PRIVATE (a_editor)->current_xml_doc_view)
01411                 mlview_xml_doc_tree_view_insert_next_sibling_node_interactive (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view)) ;
01412 }
01413 
01414 
01421 void
01422 mlview_editor_cut_node (MlViewEditor *a_editor)
01423 {
01424         g_return_if_fail (a_editor != NULL) ;
01425         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01426         g_return_if_fail (PRIVATE(a_editor) != NULL) ;
01427 
01428         if (PRIVATE (a_editor)->current_xml_doc_view)
01429                 mlview_xml_doc_tree_view_cut_node (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view)) ;
01430 }
01431 
01432 
01439 void
01440 mlview_editor_copy_node (MlViewEditor *a_editor)
01441 {
01442         g_return_if_fail (a_editor != NULL) ;
01443         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01444         g_return_if_fail (PRIVATE(a_editor) != NULL) ;
01445 
01446         if (PRIVATE (a_editor)->current_xml_doc_view)
01447                 mlview_xml_doc_tree_view_copy_node (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view)) ;
01448 }
01449 
01450 
01458 void 
01459 mlview_editor_paste_node_as_child (MlViewEditor *a_editor)
01460 {
01461         g_return_if_fail (a_editor != NULL) ;
01462         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01463         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01464         
01465         mlview_xml_doc_tree_view_paste_node_as_child (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view)) ;
01466 }
01467 
01474 void 
01475 mlview_editor_paste_node_as_prev_sibling (MlViewEditor *a_editor)
01476 {
01477         g_return_if_fail (a_editor != NULL) ;
01478         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01479         g_return_if_fail (PRIVATE (a_editor)) ;
01480 
01481         mlview_xml_doc_tree_view_paste_node_as_prev_sibling (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view)) ;
01482 }
01483 
01484 
01491 void 
01492 mlview_editor_paste_node_as_next_sibling (MlViewEditor *a_editor)
01493 {
01494         g_return_if_fail (a_editor != NULL) ;
01495         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01496         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01497         
01498         mlview_xml_doc_tree_view_paste_node_as_next_sibling (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view)) ;
01499 }
01500 
01501 
01508 void 
01509 mlview_editor_expand_tree_to_depth_interactive (MlViewEditor *a_editor)
01510 {
01511         g_return_if_fail (a_editor != NULL) ;
01512         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01513         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01514         
01515         if (PRIVATE (a_editor)->current_xml_doc_view == NULL
01516             || MLVIEW_IS_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view) == FALSE)
01517                 return ;
01518 
01519         mlview_xml_doc_tree_view_expand_tree_to_depth_interactive (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view)) ;
01520 }
01521 
01522 
01529 gchar *
01530 mlview_editor_get_current_xml_doc_file_path (MlViewEditor *a_editor)
01531 {
01532         MlViewXMLDocument * doc = NULL ;
01533 
01534         g_return_val_if_fail (a_editor != NULL, NULL) ;
01535         g_return_val_if_fail (MLVIEW_IS_EDITOR (a_editor), NULL) ;
01536         g_return_val_if_fail (PRIVATE (a_editor) != NULL, NULL) ;
01537 
01538         doc = mlview_xml_document_view_get_document (PRIVATE (a_editor)->current_xml_doc_view) ;
01539         g_return_val_if_fail (doc != NULL, NULL) ;
01540 
01541         return mlview_xml_document_get_file_path (doc) ;
01542 }
01543 
01544 
01553 void
01554 mlview_editor_save_xml_document (MlViewEditor *a_editor)
01555 {
01556         MlViewXMLDocument *xml_doc = NULL ;
01557         gchar *file_path = NULL ;
01558 
01559         g_return_if_fail (a_editor != NULL) ;
01560         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01561         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01562         g_return_if_fail (PRIVATE (a_editor)->current_xml_doc_view != NULL) ;
01563 
01564         xml_doc = mlview_xml_document_view_get_document (PRIVATE (a_editor)->current_xml_doc_view) ;
01565 
01566         if ( xml_doc == NULL )
01567                 return ;
01568 
01569         file_path = mlview_editor_get_current_xml_doc_file_path (a_editor) ;
01570 
01571         if(file_path == NULL)
01572                 mlview_editor_save_xml_document_as_interactive (a_editor) ;
01573         else
01574                 mlview_xml_document_save (xml_doc) ;
01575 }
01576 
01585 void
01586 mlview_editor_save_xml_document_as (MlViewEditor *a_editor,
01587                                     gchar *a_file_path)
01588 {
01589         MlViewXMLDocument * mlview_xml_document = NULL ;
01590         gchar *base_name = NULL ;
01591         gboolean file_was_untitled = FALSE ;
01592 
01593         g_return_if_fail (a_editor != NULL) ;
01594         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01595         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01596         g_return_if_fail (PRIVATE (a_editor)->current_xml_doc_view != NULL) ;
01597         g_return_if_fail (a_file_path != NULL) ;
01598 
01599         mlview_xml_document =
01600                 mlview_xml_document_view_get_document (PRIVATE (a_editor)->current_xml_doc_view) ;
01601 
01602         mlview_app_context_sbar_push_message (PRIVATE (a_editor)->app_context,
01603                                               _("Saving xml document as file %s ..."), a_file_path) ;
01604 
01605         file_was_untitled = 
01606                 ( mlview_xml_document_view_get_file_descriptor (PRIVATE (a_editor)->current_xml_doc_view) 
01607                   == 
01608                   NULL ) ;
01609 
01610         mlview_xml_document_save_as (mlview_xml_document, 
01611                                      a_file_path) ;
01612 
01613         g_return_if_fail (PRIVATE (a_editor)->notebook != NULL) ;
01614 
01615         if (file_was_untitled) {
01616                 base_name = g_basename (a_file_path) ;
01617                 mlview_xml_document_view_set_name (PRIVATE (a_editor)->current_xml_doc_view,
01618                                                    base_name) ;
01619         }
01620 
01621         mlview_app_context_sbar_pop_message (PRIVATE (a_editor)->app_context) ;
01622 }
01623 
01624 
01632 void 
01633 mlview_editor_save_xml_document_as_interactive (MlViewEditor *a_editor)
01634 {
01635         MlViewFileSelection * file_sel ;
01636         enum MLVIEW_SELECTED_BUTTON button ;
01637         gchar * file_name=NULL ;
01638 
01639         g_return_if_fail (a_editor != NULL) ;   
01640         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01641         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01642         g_return_if_fail (PRIVATE (a_editor)->app_context != NULL) ;
01643 
01644         file_sel = mlview_app_context_get_file_selector(PRIVATE (a_editor)->app_context,
01645                                                         _("Choose a xml document")) ;
01646 
01647         g_return_if_fail (file_sel) ;
01648         gtk_widget_realize (GTK_WIDGET (file_sel)) ;
01649         mlview_app_context_set_window_icon (PRIVATE (a_editor)->app_context, GTK_WIDGET (file_sel)) ;
01650         button = mlview_file_selection_run (file_sel,TRUE) ;
01651 
01652         switch ( button ) {
01653         case OK_BUTTON:
01654                 file_name = gtk_file_selection_get_filename (GTK_FILE_SELECTION (file_sel)) ;
01655                 if ( file_name  &&  strcmp(file_name, "") ) {
01656                         mlview_editor_save_xml_document_as (a_editor,file_name) ;
01657                 }
01658                 break ;
01659         case CANCEL_BUTTON:
01660         case WINDOW_CLOSED:
01661         default :
01662                 break ;
01663         }
01664 }
01665 
01671 void 
01672 mlview_editor_close_xml_document_without_saving (MlViewEditor * a_editor)
01673 {
01674         g_return_if_fail(a_editor != NULL) ;
01675         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01676         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01677 
01678         mlview_editor_remove_xml_document_view (a_editor, PRIVATE (a_editor)->current_xml_doc_view) ;
01679 }
01680 
01681 
01688 void 
01689 mlview_editor_save_and_close_xml_document (MlViewEditor *a_editor)
01690 {
01691         MlViewFileSelection * file_sel = NULL ;
01692         MlViewXMLDocument * mlview_xml_document = NULL ;
01693         enum MLVIEW_SELECTED_BUTTON button ;
01694         gchar * file_name = NULL ;
01695 
01696         g_return_if_fail (a_editor != NULL) ;
01697         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01698         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01699         g_return_if_fail (PRIVATE (a_editor)->current_xml_doc_view != NULL) ;
01700         g_return_if_fail (PRIVATE (a_editor)->app_context != NULL) ;
01701 
01702         file_sel = mlview_app_context_get_file_selector (PRIVATE (a_editor)->app_context,
01703                                                         _("Choose a xml document")) ;
01704         g_return_if_fail (file_sel) ;
01705 
01706         mlview_xml_document = mlview_xml_document_view_get_document (PRIVATE (a_editor)->current_xml_doc_view) ;
01707         g_return_if_fail (mlview_xml_document != NULL) ;
01708 
01709         gtk_widget_realize (GTK_WIDGET (file_sel)) ;
01710         mlview_app_context_set_window_icon (PRIVATE (a_editor)->app_context, GTK_WIDGET (file_sel)) ;
01711         button = mlview_file_selection_run (file_sel, TRUE) ;
01712 
01713         switch (button) {
01714         case OK_BUTTON:
01715                 file_name = gtk_file_selection_get_filename (GTK_FILE_SELECTION(file_sel)) ;
01716                 if ( file_name  &&  strcmp(file_name, "") ) {
01717                         mlview_xml_document_save_as (mlview_xml_document, file_name) ;
01718                         mlview_editor_close_xml_document_without_saving (a_editor) ;
01719                 }
01720                 break ;
01721         case CANCEL_BUTTON:
01722         case WINDOW_CLOSED:
01723                 break ;
01724         }
01725 }
01726 
01727 
01734 void
01735 mlview_editor_close_all_xml_documents_interactive (MlViewEditor *a_editor)
01736 {
01737         GList * views = NULL, *mobile_view_ptr = NULL ;
01738 
01739         g_return_if_fail (a_editor != NULL) ;
01740         g_return_if_fail (MLVIEW_EDITOR (a_editor)) ;
01741         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
01742         g_return_if_fail (PRIVATE (a_editor)->mlview_xml_doc_views != NULL) ;
01743 
01744         views = 
01745                 build_view_list_from_hashtable (PRIVATE (a_editor)->mlview_xml_doc_views) ;
01746 
01747         if (views == NULL) return ;
01748 
01749         for (mobile_view_ptr = views ; 
01750              mobile_view_ptr ;
01751              mobile_view_ptr = mobile_view_ptr->next) {
01752                 PRIVATE (a_editor)->current_xml_doc_view = (MlViewXMLDocumentView*) mobile_view_ptr->data ;
01753                 mlview_editor_close_xml_document_interactive (a_editor) ;
01754                 
01755         }
01756         
01757 }
01758 
01759 
01766 void
01767 mlview_editor_close_xml_document_interactive (MlViewEditor * a_editor)
01768 {
01769         MlViewXMLDocument *doc ;
01770         GtkWidget * dialog, *label ;
01771         guint go = 1 ;
01772 
01773         g_return_if_fail (a_editor != NULL) ;
01774         g_return_if_fail (MLVIEW_IS_EDITOR (a_editor)) ;
01775         g_return_if_fail (PRIVATE(a_editor)) ;
01776 
01777         
01778         doc = mlview_xml_document_view_get_document (PRIVATE (a_editor)->current_xml_doc_view) ;
01779         g_return_if_fail (doc != NULL) ;
01780 
01781         if(mlview_xml_document_needs_saving (doc) == FALSE) {
01782                 mlview_editor_close_xml_document_without_saving (a_editor) ;
01783                 return ;
01784         }
01785         
01786         dialog = gnome_dialog_new (_("Document has changed"),
01787                                    _("Save before closing"), _("Close without saving"),
01788                                    NULL) ;
01789         gtk_window_set_wmclass (GTK_WINDOW (dialog), "document-has-changed-dialog", "MlView") ;
01790 
01791         label = gtk_label_new (_("The document has been modifed. Should I save it before closing it ?")) ;
01792         gtk_widget_show_all (label) ;
01793         gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), 
01794                             label,TRUE,TRUE,0) ;
01795         gnome_dialog_close_hides (GNOME_DIALOG (dialog), TRUE) ;
01796         
01797         while (go) {
01798                 int res ;
01799                 gtk_widget_realize (GTK_WIDGET (dialog)) ;
01800                 mlview_app_context_set_window_icon (PRIVATE (a_editor)->app_context, GTK_WIDGET (dialog)) ;
01801                 res = gnome_dialog_run (GNOME_DIALOG (dialog)) ;
01802                 if (res == 0) {
01803                         gtk_widget_destroy (dialog) ;
01804                         mlview_editor_save_and_close_xml_document (a_editor) ;
01805                         go = 0 ;
01806                 } else if (res == 1) {
01807                         gtk_widget_destroy (dialog) ;
01808                         mlview_editor_close_xml_document_without_saving (a_editor) ;
01809                         go = 0 ;
01810                 }
01811         }
01812 }
01813 
01814 
01824 GtkCTreeNode *
01825 mlview_editor_find_xml_node_that_contains_str_interactive (MlViewEditor *a_editor)
01826 {
01827         g_return_val_if_fail(a_editor != NULL, NULL) ;
01828         g_return_val_if_fail (MLVIEW_IS_EDITOR (a_editor), NULL) ;
01829         g_return_val_if_fail(PRIVATE(a_editor) != NULL, NULL) ;
01830 
01831         if(PRIVATE(a_editor)->current_xml_doc_view == NULL)
01832                 return NULL ;
01833         return mlview_xml_doc_tree_view_find_xml_node_that_contains_str_interactive (MLVIEW_XML_DOC_TREE_VIEW (PRIVATE (a_editor)->current_xml_doc_view)) ;
01834 }
01835 
01841 void
01842 mlview_editor_edit_settings_interactive (MlViewEditor *a_editor)
01843 {
01844         g_return_if_fail(a_editor != NULL) ;
01845         g_return_if_fail(MLVIEW_IS_EDITOR(a_editor)) ;
01846         g_return_if_fail(PRIVATE(a_editor) != NULL) ;
01847         g_return_if_fail(PRIVATE(a_editor)->settings_manager != NULL) ;
01848 
01849         mlview_settings_manager_edit_settings_interactive (PRIVATE (a_editor)->settings_manager) ;
01850 }
01851 
01852 
01859 gint
01860 mlview_editor_associate_dtd_interactive ( MlViewEditor *a_editor ) {
01861         
01862         MlViewXMLDocument * mlview_xml_doc = NULL ;
01863         g_return_val_if_fail (a_editor != NULL, -1) ;
01864         g_return_val_if_fail (MLVIEW_IS_EDITOR (a_editor), -1) ;
01865         g_return_val_if_fail (PRIVATE (a_editor) != NULL, -1) ;
01866 
01867         if ( ! PRIVATE(a_editor)->current_xml_doc_view )
01868                 return 1 ;
01869 
01870         mlview_xml_doc = mlview_xml_document_view_get_document (PRIVATE (a_editor)->current_xml_doc_view) ;
01871         if (mlview_xml_doc == NULL)
01872                 return 1 ;
01873 
01874         if ( mlview_xml_document_associate_dtd_interactive (mlview_xml_doc))
01875                 return 0 ;
01876 
01877         return 2 ;
01878 }
01879 
01887 gint
01888 mlview_editor_validate (MlViewEditor * a_editor) {
01889 
01890         MlViewXMLDocument * doc = NULL ;
01891 
01892         g_return_val_if_fail(a_editor != NULL, -1) ;
01893         g_return_val_if_fail (MLVIEW_IS_EDITOR (a_editor), -1) ;
01894         g_return_val_if_fail(PRIVATE(a_editor) != NULL, -1) ;
01895 
01896         if (!PRIVATE(a_editor)->current_xml_doc_view)
01897                 return 1 ;
01898         doc = mlview_xml_document_view_get_document (PRIVATE(a_editor)->current_xml_doc_view) ;
01899 
01900         if (doc == NULL)
01901                 return 1 ;
01902 
01903         return mlview_xml_document_validate (doc) ;
01904 }
01905 
01906 
01912 void
01913 mlview_editor_destroy (GtkObject *a_object)
01914 {
01915         MlViewEditor *editor ;
01916   
01917         g_return_if_fail (a_object != NULL) ;
01918         g_return_if_fail (MLVIEW_IS_EDITOR(a_object));
01919 
01920         editor = MLVIEW_EDITOR (a_object) ;
01921 
01922         /*destroy the allocated widgets and other objects*/
01923         if (PRIVATE(editor) != NULL) {          
01924                 if (PRIVATE(editor)->mlview_xml_docs){
01925                         g_hash_table_foreach (PRIVATE(editor)->mlview_xml_doc_views,
01926                                               free_mlview_xml_doc_views_hash_elements,
01927                                               NULL) ;
01928                         g_hash_table_destroy (PRIVATE (editor)->mlview_xml_docs) ;
01929                         PRIVATE (editor)->mlview_xml_docs = NULL ;
01930                 }
01931                 PRIVATE (editor)->current_xml_doc_view = NULL ;/*do not free this element because it has been freed as an element of the link list above*/
01932                 if (PRIVATE (editor)->notebook != NULL) {
01933                         gtk_widget_destroy (GTK_WIDGET (PRIVATE (editor)->notebook)) ;
01934                         PRIVATE (editor)->notebook = NULL ;
01935                 }
01936                 if (PRIVATE (editor)->opened_file_base_names != NULL) {
01937                         g_hash_table_destroy (PRIVATE (editor)->opened_file_base_names);
01938                         PRIVATE (editor)->opened_file_base_names = NULL ;
01939                 }
01940                 if (PRIVATE(editor)->opened_file_paths) {
01941                         g_hash_table_destroy (PRIVATE (editor)->opened_file_paths) ;
01942                         PRIVATE (editor)->opened_file_paths = NULL ;
01943                 }
01944                 if (PRIVATE (editor)->opened_document_label_names) {
01945                         g_hash_table_destroy(PRIVATE(editor)->opened_document_label_names) ;
01946                         PRIVATE(editor)->opened_file_paths = NULL ;
01947                 }               
01948                 if (PRIVATE (editor)->settings_builder) {
01949                         /*remember: this frees also the settings manager.*/
01950                         mlview_settings_builder_destroy (GTK_OBJECT (PRIVATE (editor)->settings_builder)) ;
01951                         PRIVATE (editor)->settings_builder = NULL ;
01952                 }
01953         }
01954         /*call the destroy method of the parent*/
01955         if (GTK_OBJECT_CLASS (parent_class)->destroy)
01956                 (*GTK_OBJECT_CLASS (parent_class)->destroy) (a_object) ;
01957         
01958 }

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