00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
00054
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
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
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
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;
00203
00204
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
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
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
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
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
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
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
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
00750
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
00958
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
00990
00991
00992
00993 GtkWidget *old_label = NULL ;
00994 gchar *old_label_str_tmp = NULL, *old_label_str = NULL ;
00995
00996
00997
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
01005
01006
01007
01008
01009
01010
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
01018 label = gtk_label_new (old_label_str) ;
01019 g_free (old_label_str) ;
01020 gtk_label_get (GTK_LABEL (label),
01021 &old_label_str) ;
01022
01023
01024
01025
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
01033 base_name_nb = 1 ;
01034
01035 } else if (ptr != NULL) {
01036
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
01083 g_hash_table_insert (PRIVATE (a_editor)->mlview_xml_doc_views,
01084 a_xml_doc_view, mlview_xml_document) ;
01085
01086
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
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
01167
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
01173
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
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
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
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
01215
01216
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) {
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) {
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
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 ;
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
01950 mlview_settings_builder_destroy (GTK_OBJECT (PRIVATE (editor)->settings_builder)) ;
01951 PRIVATE (editor)->settings_builder = NULL ;
01952 }
01953 }
01954
01955 if (GTK_OBJECT_CLASS (parent_class)->destroy)
01956 (*GTK_OBJECT_CLASS (parent_class)->destroy) (a_object) ;
01957
01958 }