00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 #include <sstream>
00058
00059 using namespace std;
00060
00061
00062 #include <gtk/gtk.h>
00063 #include "config.h"
00064 #include "gxsm/plugin.h"
00065
00066 static void editnc_about( void );
00067 static void editnc_run(GtkWidget *w, void *data);
00068 static void editnc_init( void );
00069 static void editnc_cleanup( void );
00070
00071 GxsmPlugin editnc_pi = {
00072 NULL,
00073 NULL,
00074 0,
00075 NULL,
00076 "NetCDF View",
00077 NULL,
00078 NULL,
00079 "Percy Zahl",
00080 N_("_Tools/"),
00081 N_("NetCDF-View"),
00082 N_("List the contents of NetCDF Files"),
00083 "NetCDF-Dump Utility using a dynamic generated Gtk-Window",
00084 NULL,
00085 NULL,
00086 editnc_init,
00087 NULL,
00088 editnc_about,
00089 NULL,
00090 editnc_run,
00091 editnc_cleanup,
00092 };
00093
00094 static const char *about_text = N_("Gxsm EditNc Plugin:\n"
00095 "EditNc is a NetCDF-Dump Utility using"
00096 " a dynamic generated Gtk-Window:"
00097 "View and (not yet) Edit NetCDF-Data Files");
00098
00099 GxsmPlugin *get_gxsm_plugin_info ( void ){
00100 editnc_pi.description = g_strdup_printf(N_("Gxsm Editnc Plugin %s"), VERSION);
00101 return &editnc_pi;
00102 }
00103
00104
00105
00106
00107
00108
00109
00110
00111 class DumpableNcFile : public NcFile{
00112 public:
00113 DumpableNcFile(const char* path, NcFile::FileMode mode = ReadOnly)
00114 : NcFile(path, mode) { dpath = path; maxvals=0L; } ;
00115 ~DumpableNcFile(){ };
00116 void dumpdims( void );
00117 void dumpvars( void );
00118 void dumpgatts( void );
00119 void dumpdata( void );
00120 void dumpall( void );
00121 static void apply_info_callback(GnomeDialog * dialog, gint button_number, DumpableNcFile *dnc);
00122
00123 static void show_info_callback (GtkWidget *widget, gchar *message){
00124 gtk_widget_show (gnome_message_box_new (message, GNOME_MESSAGE_BOX_INFO, GNOME_STOCK_BUTTON_OK, NULL));
00125 };
00126 static void free_info_elem(gpointer txt, gpointer data){ g_free((gchar*) txt); };
00127
00128 void dump_togtkwin( void );
00129 void setmaxdata(unsigned long maxval) { maxvals=maxval; };
00130 private:
00131 long maxvals;
00132 const char *dpath;
00133 };
00134
00135
00136
00137 static void editnc_about(void)
00138 {
00139 const gchar *authors[] = { editnc_pi.authors, NULL};
00140 gtk_widget_show(gnome_about_new ( editnc_pi.name,
00141 VERSION,
00142 N_("(C) 2000 the Free Software Foundation"),
00143 about_text,
00144 authors,
00145 NULL, NULL, NULL
00146 ));
00147 }
00148
00149 static void editnc_run(GtkWidget *w, void *data)
00150 {
00151 static DumpableNcFile *dnc = NULL;
00152 static gchar *filename = NULL;
00153 if( dnc ) delete dnc;
00154 if( filename ) g_free(filename);
00155 if( data && editnc_pi.app ){
00156 dnc = new DumpableNcFile
00157 ( filename = g_strdup
00158 ( editnc_pi.app->file_dialog
00159 ( N_("NC file to edit"),".", "*.[nN][cC]*", NULL, "ncedit" )
00160 ));
00161 dnc -> setmaxdata(50);
00162 dnc -> dump_togtkwin();
00163 }
00164 else
00165 PI_DEBUG (DBG_L2, "Editnc Plugin: Cleanup 1" );
00166 }
00167
00168 static void editnc_showfile(gchar *filename)
00169 {
00170 static DumpableNcFile *dnc = NULL;
00171 if( dnc ) delete dnc;
00172 if( filename ){
00173 dnc = new DumpableNcFile (filename);
00174 dnc -> setmaxdata(50);
00175 dnc -> dump_togtkwin();
00176 }
00177 else
00178 PI_DEBUG (DBG_L2, "Editnc Plugin: Cleanup 2" );
00179 }
00180
00181 static void editnc_init( void ){
00182 PI_DEBUG (DBG_L2, "editnc_init" );
00183
00184 gapp->ConnectPluginToGetNCInfoEvent (editnc_showfile);
00185 }
00186
00187 static void editnc_cleanup( void ){
00188 editnc_run (NULL, NULL);
00189 editnc_showfile (NULL);
00190 editnc_pi.app->ConnectPluginToGetNCInfoEvent (NULL);
00191 while(gtk_events_pending()) gtk_main_iteration();
00192 }
00193
00194
00195
00196
00197
00198
00199
00200 void DumpableNcFile::dumpdims( void ){
00201 for (int n=0; n < num_dims(); n++) {
00202 NcDim* dim = get_dim(n);
00203 cout << "\t" << dim->name() << " = " ;
00204 if (dim->is_unlimited())
00205 cout << "UNLIMITED" << " ;\t " << "// " << dim->size() <<
00206 " currently\n";
00207 else
00208 cout << dim->size() << " ;\n";
00209 }
00210 }
00211
00212 void dumpatts(NcVar& var){
00213 NcToken vname = var.name();
00214 NcAtt *ap;
00215 for(int n = 0; (ap = var.get_att(n)); n++) {
00216 cout << "\t\t" << vname << ":" << ap->name() << " = " ;
00217 NcValues *vals = ap->values();
00218 cout << *vals << " ;" << endl ;
00219 delete ap;
00220 delete vals;
00221 }
00222 }
00223
00224 void DumpableNcFile::dumpvars( void )
00225 {
00226 int n;
00227 static char *types[] =
00228 {"","byte","char","short","long","float","double"};
00229 NcVar *vp;
00230
00231 for(n = 0; (vp = get_var(n)); n++) {
00232 cout << "\t" << types[vp->type()] << " " << vp->name() ;
00233
00234 if (vp->num_dims() > 0) {
00235 cout << "(";
00236 for (int d = 0; d < vp->num_dims(); d++) {
00237 NcDim* dim = vp->get_dim(d);
00238 cout << dim->name();
00239 if (d < vp->num_dims()-1)
00240 cout << ", ";
00241 }
00242 cout << ")";
00243 }
00244 cout << " ;\n";
00245
00246 dumpatts(*vp);
00247 }
00248 }
00249
00250 void DumpableNcFile::dumpgatts( void )
00251 {
00252 NcAtt *ap;
00253 for(int n = 0; (ap = get_att(n)); n++) {
00254 cout << "\t\t" << ":" << ap->name() << " = " ;
00255 NcValues *vals = ap->values();
00256 cout << *vals << " ;" << endl ;
00257 delete vals;
00258 delete ap;
00259 }
00260 }
00261
00262 void DumpableNcFile::dumpdata( )
00263 {
00264 NcVar *vp;
00265 for (int n = 0; (vp = get_var(n)); n++) {
00266 cout << " " << vp->name() << " = ";
00267 if( maxvals && vp->num_vals() > maxvals)
00268 cout << "more values than " << maxvals << ", output suppressed !" << endl;
00269 else{
00270 NcValues* vals = vp->values();
00271 cout << *vals << " ;" << endl ;
00272 delete vals;
00273 }
00274 }
00275 }
00276
00277
00278
00279 #define PREF_BOX_PACK_MODE FALSE, TRUE, 2
00280 #define INFO_BOX_PACK_MODE FALSE, FALSE, 2
00281 #define PREF_BOXEL_PACK_MODE TRUE, TRUE, 2
00282
00283 void DumpableNcFile::apply_info_callback(GnomeDialog * dialog, gint button_number, DumpableNcFile *dnc){
00284 switch(button_number){
00285 case 0:
00286 dnc->dumpall();
00287 break;
00288 case 1:
00289 GtkWidget *messagedlg;
00290 messagedlg = gnome_message_box_new("Sorry, no write back until now !",
00291 GNOME_MESSAGE_BOX_INFO,
00292 GNOME_STOCK_BUTTON_OK, NULL);
00293 gnome_dialog_run (GNOME_DIALOG (messagedlg));
00294 break;
00295 case 2:
00296 gnome_dialog_close(dialog);
00297 g_slist_foreach (
00298 (GSList*) gtk_object_get_data (
00299 GTK_OBJECT (dialog), "info_list" ),
00300 (GFunc) free_info_elem,
00301 NULL
00302 );
00303 break;
00304 }
00305 }
00306
00307
00308
00309 void DumpableNcFile::dump_togtkwin( void ){
00310 GtkWidget *dialog;
00311 GtkWidget *scrolledwindow;
00312 GtkWidget *sep;
00313 GtkWidget *lab;
00314 GtkWidget *vbox;
00315 GtkWidget *hbox;
00316 GtkWidget *VarName;
00317 GtkWidget *variable;
00318 GtkWidget *info;
00319
00320 dialog = gnome_dialog_new(_("Edit NC File"),
00321 "Dump to stdout",
00322 GNOME_STOCK_BUTTON_APPLY,
00323 GNOME_STOCK_BUTTON_CANCEL,
00324 NULL);
00325
00326 gtk_window_set_policy (GTK_WINDOW (dialog), TRUE, TRUE, FALSE);
00327 gnome_dialog_set_close(GNOME_DIALOG(dialog), FALSE);
00328 gnome_dialog_close_hides(GNOME_DIALOG(dialog), FALSE);
00329 gnome_dialog_set_default(GNOME_DIALOG(dialog), 2);
00330
00331 gtk_widget_set_usize (dialog, 500, 400);
00332
00333 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
00334 gtk_widget_show (scrolledwindow);
00335 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
00336 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
00337 vbox = gtk_vbox_new (FALSE, 0);
00338 gtk_widget_show (vbox);
00339 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW (scrolledwindow), vbox);
00340
00341 gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)->vbox),
00342 scrolledwindow, TRUE, TRUE, GNOME_PAD);
00343
00344 gtk_box_pack_start (GTK_BOX (vbox), lab=gtk_label_new(dpath), PREF_BOX_PACK_MODE);
00345 gtk_widget_show (lab);
00346 gtk_box_pack_start (GTK_BOX (vbox), sep=gtk_hseparator_new(), PREF_BOX_PACK_MODE);
00347 gtk_widget_show (sep);
00348
00349
00350
00351 gtk_box_pack_start (GTK_BOX (vbox), lab=gtk_label_new("Global Attributes"), PREF_BOX_PACK_MODE);
00352 gtk_widget_show (lab);
00353 gtk_box_pack_start (GTK_BOX (vbox), sep=gtk_hseparator_new(), PREF_BOX_PACK_MODE);
00354 gtk_widget_show (sep);
00355 NcAtt *ap;
00356 for(int n = 0; (ap = get_att(n)); n++) {
00357 hbox = gtk_hbox_new (FALSE, 0);
00358 gtk_widget_show (hbox);
00359
00360 gtk_box_pack_start (GTK_BOX (vbox), hbox, PREF_BOX_PACK_MODE);
00361
00362 VarName = gtk_label_new (ap->name());
00363
00364 gtk_widget_set_usize (VarName, 150, -1);
00365 gtk_widget_show (VarName);
00366 gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00367 gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00368 gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00369
00370 gtk_box_pack_start (GTK_BOX (hbox), VarName, PREF_BOXEL_PACK_MODE);
00371
00372 variable = gtk_entry_new ();
00373 gtk_widget_show (variable);
00374 gtk_box_pack_start (GTK_BOX (hbox), variable, PREF_BOXEL_PACK_MODE);
00375
00376 NcValues* vals;
00377 gtk_entry_set_text (GTK_ENTRY (variable), (vals = ap->values())->as_string(0));
00378 delete vals;
00379 delete ap;
00380 }
00381
00382 GSList *infolist=NULL;
00383 static gchar *types[] = {"","byte","char","short","long","float","double"};
00384 NcVar *vp;
00385
00386
00387
00388 gtk_box_pack_start (GTK_BOX (vbox), sep=gtk_hseparator_new(), PREF_BOX_PACK_MODE);
00389 gtk_widget_show (sep);
00390 gtk_box_pack_start (GTK_BOX (vbox), sep=gtk_hseparator_new(), PREF_BOX_PACK_MODE);
00391 gtk_widget_show (sep);
00392
00393
00394
00395
00396
00397 gtk_box_pack_start (GTK_BOX (vbox), lab=gtk_label_new("NC Dimensions"), PREF_BOX_PACK_MODE);
00398 gtk_widget_show (lab);
00399 gtk_box_pack_start (GTK_BOX (vbox), sep=gtk_hseparator_new(), PREF_BOX_PACK_MODE);
00400 gtk_widget_show (sep);
00401 for (int n=0; n < num_dims(); n++) {
00402 hbox = gtk_hbox_new (FALSE, 0);
00403 gtk_widget_show (hbox);
00404
00405 gtk_box_pack_start (GTK_BOX (vbox), hbox, PREF_BOX_PACK_MODE);
00406
00407 NcDim* dim = get_dim(n);
00408 gchar *dimname = g_strconcat((gchar*)dim->name(), " ", NULL);
00409
00410 VarName = gtk_label_new (dimname);
00411 g_free(dimname);
00412
00413 gtk_widget_set_usize (VarName, 150, -1);
00414 gtk_widget_show (VarName);
00415 gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00416 gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00417 gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00418
00419 gtk_box_pack_start (GTK_BOX (hbox), VarName, PREF_BOXEL_PACK_MODE);
00420
00421 variable = gtk_entry_new ();
00422 gtk_widget_show (variable);
00423 gtk_box_pack_start (GTK_BOX (hbox), variable, PREF_BOXEL_PACK_MODE);
00424
00425 gchar *dimval;
00426 if (dim->is_unlimited())
00427 dimval = g_strdup_printf("UNLIMITED, %d currently", (int)dim->size());
00428 else
00429 dimval = g_strdup_printf("%d", (int)dim->size());
00430
00431 gtk_entry_set_text (GTK_ENTRY (variable), dimval);
00432 g_free(dimval);
00433
00434 }
00435
00436
00437
00438 gtk_box_pack_start (GTK_BOX (vbox), sep=gtk_hseparator_new(), PREF_BOX_PACK_MODE);
00439 gtk_widget_show (sep);
00440 gtk_box_pack_start (GTK_BOX (vbox), sep=gtk_hseparator_new(), PREF_BOX_PACK_MODE);
00441 gtk_widget_show (sep);
00442
00443
00444
00445
00446
00447 gtk_box_pack_start (GTK_BOX (vbox), lab=gtk_label_new("NC Data"), PREF_BOX_PACK_MODE);
00448 gtk_widget_show (lab);
00449 gtk_box_pack_start (GTK_BOX (vbox), sep=gtk_hseparator_new(), PREF_BOX_PACK_MODE);
00450 gtk_widget_show (sep);
00451 for (int n = 0; (vp = get_var(n)); n++) {
00452 int unlimited_flag = FALSE;
00453 hbox = gtk_hbox_new (FALSE, 0);
00454 gtk_widget_show (hbox);
00455
00456 gtk_box_pack_start (GTK_BOX (vbox), hbox, PREF_BOX_PACK_MODE);
00457
00458 gchar *vdims = g_strdup(" ");
00459 if (vp->num_dims() > 0) {
00460 g_free(vdims);
00461 vdims = g_strdup("(");
00462 for (int d = 0; d < vp->num_dims(); d++) {
00463 gchar *tmp = g_strconcat(vdims, (gchar*)vp->get_dim(d)->name(),
00464 ((d<vp->num_dims()-1)?", ":")"), NULL);
00465
00466 if (vp->get_dim(d)->is_unlimited())
00467 unlimited_flag = TRUE;
00468
00469 g_free(vdims);
00470 vdims = g_strdup(tmp);
00471 g_free(tmp);
00472 }
00473 }
00474 gchar *vardef = g_strconcat(types[vp->type()], " ", (gchar*)vp->name(), vdims, NULL);
00475 g_free(vdims);
00476 VarName = gtk_label_new (vardef);
00477 std::cout << vardef << std::endl;
00478 g_free(vardef);
00479
00480 gtk_widget_set_usize (VarName, 150, -1);
00481 gtk_widget_show (VarName);
00482 gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00483 gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00484 gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00485
00486 gtk_box_pack_start (GTK_BOX (hbox), VarName, PREF_BOXEL_PACK_MODE);
00487
00488 variable = gtk_entry_new ();
00489 gtk_widget_show (variable);
00490 gtk_box_pack_start (GTK_BOX (hbox), variable, PREF_BOXEL_PACK_MODE);
00491
00492 ostringstream ostr_val;
00493
00494
00495
00496 if (unlimited_flag){
00497 ostr_val << "** Unlimited Data Set, data suppressed **";
00498 } else {
00499 NcValues *v = vp->values();
00500 if(vp->type() == ncChar){
00501 ostr_val << v->as_string(0);
00502 }else{
00503 if(v){
00504 if(v->num() > 1){
00505 if(v->num() > maxvals)
00506 ostr_val << "[#="<< vp->num_vals() << "] " << " ... (too many, suppressed) ";
00507 else
00508 ostr_val << "[#="<< vp->num_vals() << "] " << *v;
00509 }else
00510 ostr_val << *v;
00511 } else
00512 ostr_val << "** Empty **";
00513 }
00514 delete v;
00515 }
00516 ostr_val << ends;
00517 gtk_entry_set_text (GTK_ENTRY (variable), (const gchar*)ostr_val.str().c_str());
00518
00519 NcToken vname = vp->name();
00520 NcAtt *ap;
00521
00522 ostringstream ostr_att;
00523 if((ap=vp->get_att(0))){
00524 delete ap;
00525 ostr_att << "Details and NetCDF Varibale Attributes:" << endl;
00526
00527 for(int n = 0; (ap = vp->get_att(n)); n++) {
00528 NcValues *v;
00529 ostr_att << vname << ":"
00530 << ap->name() << " = "
00531 << *(v=ap->values()) << endl;
00532 delete ap;
00533 delete v;
00534 }
00535 }
00536 else
00537 ostr_att << "Sorry, no info available for \"" << vname << "\" !";
00538
00539 ostr_att << "\nValue(s):\n" << ostr_val.str().c_str();
00540 ostr_att << ends;
00541 gchar *infotxt = g_strdup( (const gchar*)ostr_att.str().c_str() );
00542 infolist = g_slist_prepend( infolist, infotxt);
00543 info = gtk_button_new_with_label (" Details ");
00544 gtk_widget_show (info);
00545 gtk_box_pack_start (GTK_BOX (hbox), info, INFO_BOX_PACK_MODE);
00546 gtk_signal_connect (GTK_OBJECT (info), "clicked",
00547 GTK_SIGNAL_FUNC (show_info_callback),
00548 infotxt);
00549 }
00550
00551 gtk_object_set_data (GTK_OBJECT (dialog), "info_list", infolist);
00552
00553 gtk_signal_connect (GTK_OBJECT(dialog), "clicked",
00554 GTK_SIGNAL_FUNC(apply_info_callback),
00555 this);
00556
00557 gtk_widget_show (dialog);
00558 }
00559
00560 void DumpableNcFile::dumpall( )
00561 {
00562 cout << "netcdf " << dpath << " {" << endl <<
00563 "dimensions:" << endl ;
00564
00565 dumpdims();
00566
00567 cout << "variables:" << endl;
00568
00569 dumpvars();
00570
00571 if (num_atts() > 0)
00572 cout << "// global attributes" << endl ;
00573
00574 dumpgatts();
00575
00576 cout << "data:" << endl;
00577
00578 dumpdata();
00579
00580 cout << "}" << endl;
00581 }