Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

mlview-xml-document-view.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 "mlview-xml-document-view.h"
00020 
00021 struct _MlViewXMLDocumentViewPrivate {
00022         /*The xml document the view is connected to*/
00023         MlViewXMLDocument * mlview_xml_document ;
00024  
00025         /*The name of this view*/
00026         gchar *view_name ;
00027 
00028         /*the interactif name edition widget*/
00029         GnomeDialog * name_edition_dialog ;
00030 } ;
00031 
00032 
00033 /*signals*/
00034 enum {
00035         NAME_CHANGED,
00036         NUMBER_OF_SIGNALS/*must be the last one!*/
00037 } ;
00038 
00039 static GtkVBoxClass * parent_class = NULL ;
00040 static gint gv_mlview_xml_document_view_signals [NUMBER_OF_SIGNALS] = {0} ;
00041 
00042 /*This table lists the callbacks of the xml document signals*/
00043 static SignalCallbackDescriptor * gv_signals_fired_by_document = NULL ;
00044 
00045 
00046 
00047 static void 
00048 mlview_xml_document_view_class_init (MlViewXMLDocumentViewClass * a_klass) ;
00049 
00050 static void 
00051 mlview_xml_document_view_init (MlViewXMLDocumentView * a_mlview_xml_doc) ;
00052 
00053 static enum MLVIEW_XML_DOCUMENT_VIEW_STATUS
00054 mlview_xml_document_view_connect_to_document (MlViewXMLDocumentView * a_tree_view,
00055                                               MlViewXMLDocument * a_xml_doc) ;
00056 
00057 static enum MLVIEW_XML_DOCUMENT_VIEW_STATUS
00058 mlview_xml_document_view_disconnect_from_document (MlViewXMLDocumentView * a_doc_view,
00059                                                    MlViewXMLDocument * a_xml_doc) ;
00060 
00061 
00062 static GtkWidget *
00063 build_name_edition_dialog (MlViewAppContext *a_app_context) ;
00064 
00065 static void
00066 set_name_edition_widget_value (GtkWidget * a_edition_widget,
00067                               gchar *a_value) ;
00068 static gchar *
00069 get_name_edition_widget_value (GtkWidget *a_edition_widget) ;
00070 
00071 
00072 static const char * NAME_EDITION_ENTRY_FIELD_KEY = "name-edition-entry-field" ;
00073 
00074 #define PRIVATE(object) ((object)->private)
00075 
00076 
00077 /****************************************************
00078  *Private (static) methods of this class.
00079  ****************************************************/
00080 
00081 /*
00082  *mlview_xml_document_view_class_init:
00083  *@a_klass: the current class
00084  *
00085  *Private initializer of the class. Part of the Gtk typing system framework.
00086  */
00087 static void
00088 mlview_xml_document_view_class_init (MlViewXMLDocumentViewClass * a_klass)
00089 {
00090         GtkObjectClass * object_class = GTK_OBJECT_CLASS (a_klass) ;
00091 
00092         g_return_if_fail (a_klass != NULL) ;
00093         parent_class = gtk_type_class (GTK_TYPE_VBOX) ;
00094         object_class->destroy = mlview_xml_document_view_destroy ;
00095 
00096         /*now, create the signals*/
00097         gv_mlview_xml_document_view_signals [NAME_CHANGED] = gtk_signal_new ("name-changed",
00098                                                                              GTK_RUN_FIRST,
00099                                                                              object_class->type,
00100                                                                              GTK_SIGNAL_OFFSET (MlViewXMLDocumentViewClass, name_changed),
00101                                                                              gtk_marshal_NONE__NONE,
00102                                                                              GTK_TYPE_NONE, 0) ;
00103 
00104         gtk_object_class_add_signals (object_class, gv_mlview_xml_document_view_signals, NUMBER_OF_SIGNALS) ;
00105         a_klass->name_changed = NULL ;
00106 }
00107 
00108 
00109 /*
00110  *mlview_xml_document_view_init:
00111  *@a_xml_doc_view: the current instance of MlViewXMLDocumentView.
00112  *
00113  *The initialyzer of the MlViewXMLDocumentView object. Part of the gtk typing system
00114  *framework.
00115  */
00116 static void
00117 mlview_xml_document_view_init (MlViewXMLDocumentView *a_xml_doc_view) 
00118 {
00119         g_return_if_fail (a_xml_doc_view != NULL) ;
00120         g_return_if_fail (MLVIEW_XML_DOCUMENT_VIEW (a_xml_doc_view)) ;
00121 
00122         g_return_if_fail (PRIVATE (a_xml_doc_view) == NULL) ;
00123         
00124         PRIVATE (a_xml_doc_view) = g_malloc0 (sizeof (MlViewXMLDocumentViewPrivate)) ;
00125 }
00126 
00127 static enum MLVIEW_XML_DOCUMENT_VIEW_STATUS
00128 mlview_xml_document_view_connect_to_document (MlViewXMLDocumentView * a_doc_view,
00129                                               MlViewXMLDocument * a_xml_doc)
00130 {
00131         int i = 0 ;
00132 
00133         g_return_val_if_fail (a_doc_view != NULL, MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00134 
00135         g_return_val_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_doc_view), 
00136                               MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00137 
00138         g_return_val_if_fail (a_xml_doc != NULL, 
00139                               MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00140 
00141         g_return_val_if_fail (MLVIEW_IS_XML_DOCUMENT (a_xml_doc), 
00142                               MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00143 
00144         g_return_val_if_fail (gv_signals_fired_by_document != NULL, 
00145                               MLVIEW_XML_DOCUMENT_VIEW_DOC_SIGNAL_HANDLERS_NOT_SET) ;
00146 
00147         for (i=0 ; gv_signals_fired_by_document [i].signal_name ; i++) {
00148 
00149                 if (!gv_signals_fired_by_document [i].signal_handler)
00150                         continue ;
00151 
00152                 gtk_signal_connect (GTK_OBJECT (a_xml_doc),
00153                                     gv_signals_fired_by_document [i].signal_name,
00154                                     GTK_SIGNAL_FUNC (gv_signals_fired_by_document [i].signal_handler),
00155                                     a_doc_view) ;
00156         }
00157 
00158         return MLVIEW_XML_DOCUMENT_VIEW_OK ;
00159 }
00160 
00161 static enum MLVIEW_XML_DOCUMENT_VIEW_STATUS
00162 mlview_xml_document_view_disconnect_from_document (MlViewXMLDocumentView * a_doc_view,
00163                                                    MlViewXMLDocument * a_xml_doc)
00164 {
00165         int i = 0 ;
00166 
00167         g_return_val_if_fail (a_doc_view != NULL, MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00168         g_return_val_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_doc_view),
00169                               MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00170         g_return_val_if_fail (a_xml_doc != NULL, MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00171         g_return_val_if_fail (MLVIEW_IS_XML_DOCUMENT (a_xml_doc),
00172                               MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00173         g_return_val_if_fail (gv_signals_fired_by_document,
00174                               MLVIEW_XML_DOCUMENT_VIEW_DOC_SIGNAL_HANDLERS_NOT_SET) ;
00175 
00176         for (i=0 ; gv_signals_fired_by_document [i].signal_name ; i++) {
00177 
00178                 if (!gv_signals_fired_by_document [i].signal_handler)
00179                         continue ;
00180 
00181                 gtk_signal_disconnect_by_func (GTK_OBJECT (a_xml_doc),
00182                                                GTK_SIGNAL_FUNC (gv_signals_fired_by_document [i].signal_handler),
00183                                                a_doc_view) ;
00184         }
00185 
00186         return MLVIEW_XML_DOCUMENT_VIEW_OK ;
00187 }
00188 
00189 
00198 static GtkWidget *
00199 build_name_edition_dialog (MlViewAppContext * a_app_context)
00200 {
00201         GnomeDialog * result = NULL ;
00202         GtkEntry * name_entry_field = NULL ;
00203 
00204         g_return_val_if_fail (a_app_context != NULL, NULL) ;
00205         g_return_val_if_fail (MLVIEW_IS_APP_CONTEXT (a_app_context), NULL) ;
00206 
00207         result = 
00208                 GNOME_DIALOG (gnome_dialog_new (_("Type the name of the current view"),
00209                                                 _("OK"), _("Cancel"), NULL)) ;
00210 
00211         gnome_dialog_close_hides (result, TRUE) ;
00212 
00213         name_entry_field =
00214                 GTK_ENTRY (gtk_entry_new ()) ;
00215 
00216         gtk_widget_show_all (GTK_WIDGET (name_entry_field)) ;
00217 
00218         gtk_object_set_data (GTK_OBJECT (result),
00219                              NAME_EDITION_ENTRY_FIELD_KEY,
00220                              name_entry_field) ;
00221 
00222         gtk_box_pack_start_defaults (GTK_BOX (result->vbox),
00223                                      GTK_WIDGET (name_entry_field)) ;
00224 
00225         gtk_widget_realize (GTK_WIDGET (result)) ;
00226         mlview_app_context_set_window_icon (a_app_context, GTK_WIDGET (result)) ;
00227 
00228         gtk_widget_show_all (GTK_WIDGET (result->vbox)) ;
00229         
00230         return GTK_WIDGET (result) ;
00231 }
00232 
00233 
00237 static void
00238 set_name_edition_widget_value (GtkWidget * a_edition_widget,
00239                                gchar *a_value)
00240 {
00241         GtkEntry * name_entry = NULL ;
00242 
00243         g_return_if_fail (a_edition_widget != NULL) ;
00244         g_return_if_fail (GNOME_IS_DIALOG (a_edition_widget)) ;
00245 
00246         name_entry = 
00247                 gtk_object_get_data (GTK_OBJECT (a_edition_widget),
00248                                      NAME_EDITION_ENTRY_FIELD_KEY) ;
00249 
00250         g_return_if_fail (name_entry != NULL) ;
00251         g_return_if_fail (GTK_IS_ENTRY (name_entry)) ;
00252         if (a_value)
00253                 gtk_entry_set_text (name_entry, a_value) ;
00254         else
00255                 gtk_entry_set_text (name_entry, "") ;
00256 }
00257 
00258 
00259 static gchar *
00260 get_name_edition_widget_value (GtkWidget *a_edition_widget)
00261 {
00262         GtkEntry *name_entry = NULL ;
00263 
00264         g_return_val_if_fail (a_edition_widget != NULL, NULL) ;
00265         g_return_val_if_fail (GNOME_IS_DIALOG (a_edition_widget), NULL) ;
00266 
00267         name_entry =
00268                 gtk_object_get_data (GTK_OBJECT (a_edition_widget),
00269                                      NAME_EDITION_ENTRY_FIELD_KEY) ;
00270 
00271         g_return_val_if_fail (name_entry != NULL, NULL) ;
00272         g_return_val_if_fail (GTK_IS_ENTRY (name_entry), NULL) ;
00273 
00274         return gtk_entry_get_text (name_entry) ;
00275 }
00276 
00277 
00278 /*********************************************
00279  *Public methods of this class.
00280  *********************************************/
00281 
00282 enum MLVIEW_XML_DOCUMENT_VIEW_STATUS
00283 mlview_xml_document_view_construct (MlViewXMLDocumentView * a_doc_view,
00284                                     MlViewXMLDocument *a_mlview_xml_doc)
00285 {
00286         g_return_val_if_fail (a_doc_view != NULL, 
00287                               MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00288         g_return_val_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_doc_view), 
00289                               MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00290         g_return_val_if_fail (a_mlview_xml_doc != NULL, 
00291                               MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00292         g_return_val_if_fail (MLVIEW_IS_XML_DOCUMENT (a_mlview_xml_doc), 
00293                               MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00294         g_return_val_if_fail (PRIVATE (a_doc_view) != NULL, 
00295                               MLVIEW_XML_DOCUMENT_VIEW_BAD_PARAMETER) ;
00296         
00297         PRIVATE (a_doc_view)->mlview_xml_document = a_mlview_xml_doc ;
00298         return mlview_xml_document_view_connect_to_document (a_doc_view,
00299                                                              a_mlview_xml_doc) ;
00300 }
00301 
00302 MlViewXMLDocumentView *
00303 mlview_xml_document_view_new (MlViewXMLDocument *a_mlview_doc)
00304 {
00305         MlViewXMLDocumentView * result = NULL ;
00306         g_return_val_if_fail (a_mlview_doc != NULL, NULL) ;
00307         
00308         result = gtk_type_new (MLVIEW_TYPE_XML_DOCUMENT_VIEW) ;
00309 
00310         if (mlview_xml_document_view_construct (result, a_mlview_doc) == MLVIEW_XML_DOCUMENT_VIEW_OK)
00311                 return result ;
00312         else
00313                 return NULL ;
00314         
00315 }
00316 
00325 void
00326 mlview_xml_document_view_set_document (MlViewXMLDocumentView *a_xml_doc_view,
00327                                        MlViewXMLDocument *a_mlview_xml_doc)
00328 {
00329         g_return_if_fail (a_xml_doc_view != NULL) ;
00330         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_xml_doc_view)) ;
00331         g_return_if_fail (PRIVATE (a_xml_doc_view) != NULL) ;
00332 
00333         PRIVATE (a_xml_doc_view)->mlview_xml_document = a_mlview_xml_doc ;
00334 }
00335 
00336 
00343 MlViewXMLDocument *
00344 mlview_xml_document_view_get_document (MlViewXMLDocumentView *a_xml_doc_view)
00345 {
00346         g_return_val_if_fail (a_xml_doc_view != NULL, NULL) ;
00347         g_return_val_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_xml_doc_view), NULL) ;
00348         g_return_val_if_fail (PRIVATE (a_xml_doc_view) != NULL, NULL) ;
00349 
00350         return PRIVATE (a_xml_doc_view)->mlview_xml_document ;
00351 }
00352 
00353 
00359 gint
00360 mlview_xml_document_view_get_type (void)
00361 {
00362         static gint type_id = 0 ;
00363         
00364         if (type_id == 0) {
00365                 static const GtkTypeInfo type_info = {
00366                         "MlViewXMLDocumentView",
00367                         sizeof (MlViewXMLDocumentView),
00368                         sizeof (MlViewXMLDocumentViewClass),
00369                         (GtkClassInitFunc) mlview_xml_document_view_class_init,
00370                         (GtkObjectInitFunc) mlview_xml_document_view_init,
00371                         NULL, NULL, NULL
00372                 } ;
00373                 type_id = gtk_type_unique (gtk_vbox_get_type (), &type_info) ;
00374         }
00375         return type_id ;
00376 }
00377 
00388 void
00389 mlview_xml_document_view_set_name (MlViewXMLDocumentView *a_doc_view, 
00390                                    gchar *a_name)
00391 {
00392         g_return_if_fail (a_doc_view != NULL) ;
00393         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_doc_view)) ;
00394         g_return_if_fail (PRIVATE (a_doc_view) != NULL) ;
00395  
00396         if (PRIVATE (a_doc_view)->view_name) {
00397                 g_free (PRIVATE (a_doc_view)->view_name) ;
00398                 PRIVATE (a_doc_view)->view_name = NULL ;
00399         }
00400 
00401         if (a_name)
00402                 PRIVATE (a_doc_view)->view_name = g_strdup (a_name) ;
00403 
00404         gtk_signal_emit (GTK_OBJECT (a_doc_view),
00405                          gv_mlview_xml_document_view_signals [NAME_CHANGED]) ;
00406 }
00407 
00414 void
00415 mlview_xml_document_view_set_name_interactive (MlViewXMLDocumentView * a_view)
00416 {
00417         gint button = 0 ;
00418         gchar * view_name = NULL ;
00419         MlViewAppContext *app_context = NULL ;
00420 
00421         g_return_if_fail (a_view != NULL) ;
00422         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_view)) ;
00423         g_return_if_fail (PRIVATE (a_view) != NULL) ;
00424         g_return_if_fail (PRIVATE (a_view)->mlview_xml_document != NULL) ;
00425 
00426         app_context = 
00427                 mlview_xml_document_get_app_context (PRIVATE (a_view)->mlview_xml_document) ;
00428         
00429         g_return_if_fail (app_context != NULL) ;
00430 
00431         if (PRIVATE (a_view)->name_edition_dialog == NULL) {
00432                 PRIVATE (a_view)->name_edition_dialog = 
00433                         GNOME_DIALOG (build_name_edition_dialog (app_context)) ;
00434         }
00435 
00436         g_return_if_fail (PRIVATE (a_view)->name_edition_dialog != NULL) ;
00437 
00438         set_name_edition_widget_value (GTK_WIDGET (PRIVATE (a_view)->name_edition_dialog),
00439                                        mlview_xml_document_view_get_name (a_view)) ;
00440 
00441         button = 
00442                 gnome_dialog_run (PRIVATE (a_view)->name_edition_dialog) ;
00443 
00444         switch (button) {
00445         case 0:/*user clicked ok*/
00446                 view_name = 
00447                         get_name_edition_widget_value (GTK_WIDGET (PRIVATE (a_view)->name_edition_dialog)) ;
00448 
00449                 if (view_name != NULL)
00450                         mlview_xml_document_view_set_name (a_view, 
00451                                                            view_name) ;
00452                 break ;
00453         default :
00454                 break ;
00455         }
00456         gnome_dialog_close (PRIVATE (a_view)->name_edition_dialog) ;
00457 }
00458 
00459 
00467 gchar *
00468 mlview_xml_document_view_get_name (MlViewXMLDocumentView *a_doc_view)
00469 {
00470         g_return_val_if_fail (a_doc_view != NULL, NULL) ;
00471         g_return_val_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_doc_view), NULL) ;
00472         g_return_val_if_fail (PRIVATE (a_doc_view) != NULL, NULL) ;
00473         
00474         return PRIVATE (a_doc_view)->view_name ;
00475 }
00476 
00486 void
00487 mlview_xml_document_view_set_document_signal_handlers (SignalCallbackDescriptor *a_signals)
00488 {
00489         if (gv_signals_fired_by_document == NULL)
00490                 gv_signals_fired_by_document = a_signals ;
00491 }
00492 
00499 MlViewFileDescriptor * 
00500 mlview_xml_document_view_get_file_descriptor (MlViewXMLDocumentView * a_doc_view)
00501 {
00502         g_return_val_if_fail (a_doc_view != NULL, NULL) ;
00503         g_return_val_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_doc_view), NULL) ;
00504         g_return_val_if_fail (PRIVATE (a_doc_view) != NULL, NULL) ;
00505         
00506         return mlview_xml_document_get_file_descriptor (PRIVATE (a_doc_view)->mlview_xml_document) ;
00507 }
00508 
00509 /*
00510  *mlview_xml_docuement_view_destroy:
00511  *@a_object: the object to destroy.
00512  *
00513  *The destroyer of this object.
00514  */
00515 void 
00516 mlview_xml_document_view_destroy (GtkObject *a_mlview_xml_doc_view)
00517 {
00518         MlViewXMLDocumentView * mlview_xml_doc_view = NULL ;
00519         MlViewXMLDocument *mlview_xml_doc = NULL ;
00520 
00521         g_return_if_fail (a_mlview_xml_doc_view != NULL) ;
00522         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT_VIEW (a_mlview_xml_doc_view)) ;
00523 
00524         mlview_xml_doc_view = MLVIEW_XML_DOCUMENT_VIEW (a_mlview_xml_doc_view) ;
00525         g_return_if_fail (PRIVATE (mlview_xml_doc_view)) ;
00526 
00527         mlview_xml_doc = mlview_xml_document_view_get_document (mlview_xml_doc_view) ;
00528         if (mlview_xml_doc)
00529                 mlview_xml_document_view_disconnect_from_document (mlview_xml_doc_view,
00530                                                                    mlview_xml_doc) ;
00531 
00532         if (PRIVATE (mlview_xml_doc_view)->view_name) {
00533                 g_free (PRIVATE (mlview_xml_doc_view)->view_name) ;
00534                 PRIVATE (mlview_xml_doc_view)->view_name = NULL ;
00535         }
00536 
00537         if (PRIVATE (mlview_xml_doc_view)) {
00538                 g_free (PRIVATE (mlview_xml_doc_view)) ;
00539                 PRIVATE (mlview_xml_doc_view) = NULL ;
00540         }
00541 
00542         if (GTK_OBJECT_CLASS (parent_class)->destroy)
00543                 (*GTK_OBJECT_CLASS (parent_class)->destroy) (a_mlview_xml_doc_view) ;
00544 }

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