00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mlview-xml-document-view.h"
00020
00021 struct _MlViewXMLDocumentViewPrivate {
00022
00023 MlViewXMLDocument * mlview_xml_document ;
00024
00025
00026 gchar *view_name ;
00027
00028
00029 GnomeDialog * name_edition_dialog ;
00030 } ;
00031
00032
00033
00034 enum {
00035 NAME_CHANGED,
00036 NUMBER_OF_SIGNALS
00037 } ;
00038
00039 static GtkVBoxClass * parent_class = NULL ;
00040 static gint gv_mlview_xml_document_view_signals [NUMBER_OF_SIGNALS] = {0} ;
00041
00042
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
00079
00080
00081
00082
00083
00084
00085
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
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
00111
00112
00113
00114
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
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:
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
00511
00512
00513
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 }