external_converter.C

Go to the documentation of this file.
00001 /* Gnome gxsm - Gnome X Scanning Microscopy
00002  * universal STM/AFM/SARLS/SPALEED/... controlling and
00003  * data analysis software
00004  * 
00005  * Gxsm Plugin Name: external_converter.C
00006  * ========================================
00007  * 
00008  * Copyright (C) 2006 The Free Software Foundation
00009  *
00010  * Authors: Thorsten Wagner <stm@users.sf.net>
00011  * 
00012  * This program is free software; you can redistribute it and/or modify
00013  * it under the terms of the GNU General Public License as published by
00014  * the Free Software Foundation; either version 2 of the License, or
00015  * (at your option) any later version.
00016  *
00017  * This program is distributed in the hope that it will be useful,
00018  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00019  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020  * GNU General Public License for more details.
00021  *
00022  * You should have received a copy of the GNU General Public License
00023  * along with this program; if not, write to the Free Software
00024  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00025  */
00026 
00027 /* Please do not change the Begin/End lines of this comment section!
00028  * this is a LaTeX style section used for auto generation of the PlugIn Manual 
00029  * Chapter. Add a complete PlugIn documentation inbetween the Begin/End marks!
00030  * --------------------------------------------------------------------------------
00031 % BeginPlugInDocuSection
00032 % PlugInDocuCaption: external_converter 
00033 % PlugInName: external_converter
00034 % PlugInAuthor: Thorsten Wagner
00035 % PlugInAuthorEmail: stm@users.sf.net
00036 % PlugInMenuPath: Tools/external_converter 
00037 % PlugInDescription
00038 Simple plugin to call an external converter
00039 % PlugInUsage
00040 Registers itself. Select source file,a destination folder, a suitable suffix, the external converter (full path) and press okey. You can also path some options to the external program
00041 % EndPlugInDocuSection
00042  * -------------------------------------------------------------------------------- 
00043  */
00044 
00045 #include "external_converter.h"
00046 
00047 // Plugin Prototypes
00048 static void external_converter_init (void);
00049 static void external_converter_query (void);
00050 static void external_converter_about (void);
00051 static void external_converter_configure (void);
00052 static void external_converter_cleanup (void);
00053 
00054 static void external_converter_run(GtkWidget *w, void *data);
00055 
00056 
00057 //
00058 // Gxsm plugin discription
00059 //
00060 GxsmPlugin external_converter_pi = {
00061   NULL,                   // filled in and used by Gxsm, don't touch !
00062   NULL,                   // filled in and used by Gxsm, don't touch !
00063   0,                      // filled in and used by Gxsm, don't touch !
00064   NULL,                   // filled in just after init() is called !!!
00065   "external_converter",
00066   NULL,                      
00067   "Calls an external converter",
00068   "Thorsten Wagner",
00069   N_("_Tools/"),
00070   N_("External Converter"),
00071   NULL,
00072   "No further info",
00073   NULL,
00074   NULL,
00075   external_converter_init,
00076   external_converter_query,
00077   external_converter_about,
00078   external_converter_configure,
00079   NULL,
00080   external_converter_cleanup
00081 };
00082 
00083 //
00084 //Text used in the About Box
00085 //
00086 static const char *about_text = N_("Tool to call an external converter.");
00087                                    
00088         
00089 //
00090 // Symbol "get_gxsm_plugin_info" is resolved by dlsym from Gxsm, used to get Plugin's info!! 
00091 // Essential Plugin Function!!
00092 //
00093 GxsmPlugin *get_gxsm_plugin_info ( void ){ 
00094   external_converter_pi.description = g_strdup_printf(N_("Tool to call an external converter. Version: %s"), VERSION);
00095   return &external_converter_pi; 
00096 }
00097 
00098 //
00099 // Query Function, installs Plugin's in the apropriate menupath
00100 // !!!! make sure the "external_converter_cleanup()" function (see below) !!!!
00101 // !!!! removes the correct menuentries !!!!
00102 //
00103 static void external_converter_query(void)
00104 {
00105   static GnomeUIInfo menuinfo_external_converter[] = { 
00106     { GNOME_APP_UI_ITEM, 
00107       N_("External Converter"), N_("Tool to call an external converter"),
00108       (gpointer) external_converter_run, NULL,
00109       NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN,
00110       0, GDK_CONTROL_MASK, NULL },
00111     GNOMEUIINFO_END
00112   };
00113 
00114   gnome_app_insert_menus (
00115           GNOME_APP(external_converter_pi.app->getApp()), 
00116           N_("Tools/"),
00117           menuinfo_external_converter
00118           );
00119  
00120   if(external_converter_pi.status) g_free(external_converter_pi.status); 
00121   external_converter_pi.status = g_strconcat (
00122           N_("Plugin query has attached "),
00123           external_converter_pi.name, 
00124           N_(": File external_converter is ready to use"),
00125           NULL);
00126 }
00127 
00128 //
00129 // init-Function
00130 //
00131 
00132 static void external_converter_init(void)
00133 {
00134   PI_DEBUG(DBG_L2,"external_converter Plugin Init");
00135 }
00136 
00137 //
00138 // about-Function
00139 //
00140 static void external_converter_about(void)
00141 {
00142   const gchar *authors[] = { external_converter_pi.authors, NULL};
00143   gtk_widget_show(gnome_about_new ( external_converter_pi.name,
00144                                     VERSION,
00145                                     N_("(C) 2006 the Free Software Foundation"),
00146                                     about_text,
00147                                     authors,
00148                                     NULL,NULL,NULL
00149                                     ));
00150 }
00151 
00152 //
00153 // configure-Function
00154 //
00155 static void external_converter_configure(void)
00156 {
00157   if(external_converter_pi.app)
00158     external_converter_pi.app->message("External Converter Plugin Configuration");
00159 }
00160 
00161 //
00162 // cleanup-Function, make sure the Menustrings are matching those above!!!
00163 //
00164 static void external_converter_cleanup(void)
00165 {
00166   PI_DEBUG(DBG_L2,"External Converter Plugin Cleanup");
00167   gnome_app_remove_menus (GNOME_APP (external_converter_pi.app->getApp()),
00168                           N_("Tools/External Converter"), 1);
00169 }
00170 
00171 
00172 //Gtk+ Signal Funktion
00173 static void external_converter_run(GtkWidget *w, void *data)
00174 {
00175   external_converter_Control *Popup = new external_converter_Control();
00176   Popup->run();
00177   PI_DEBUG(DBG_L2,"External Converter dialog opened");
00178 }
00179 
00180 
00182 // ANFANG external_converter
00184 
00185 gchar *select_mask;
00186 
00188 // ENDE external_converter
00190 
00192 // ANFANG external_converter_Control
00194 
00195 gint file_error(const gchar *err_msg, const gchar *dir);
00196 
00197 external_converter_Control::external_converter_Control ()
00198 { 
00199         frontenddata = new external_converter_Data(getenv("PWD"),getenv("PWD"));
00200         XsmRescourceManager xrm("FilePathSelectionHistory","external_converter");
00201         xrm.Get ("SourceFile",&frontenddata->sourceFile, getenv("PWD"));
00202         xrm.Get ("DestFile", &frontenddata->destFile, getenv("PWD"));
00203         xrm.Get ("DestSuffix", &frontenddata->destSuffix, ".txt");
00204         xrm.Get ("ConverterPath", &frontenddata->converterPath, "/usr/local/bin/converter");
00205         xrm.Get ("ConverterOptions", &frontenddata->converterOptions, "PWD");
00206 }
00207 
00208 
00209 external_converter_Control::~external_converter_Control ()
00210 {
00211   delete frontenddata;
00212 }
00213 
00214 
00215 void external_converter_Control::run()
00216 {
00217         GtkWidget *dialog;
00218         GtkWidget *vbox;
00219         GtkWidget *hbox;
00220         GtkWidget *VarName;
00221         GtkWidget *variable;
00222         GtkWidget *help;
00223   
00224   DlgStart();
00225   dialog = gnome_dialog_new(_("External Converter"), _("Convert"), GNOME_STOCK_BUTTON_CANCEL, NULL); 
00226 
00227    gnome_dialog_set_close(GNOME_DIALOG(dialog), FALSE);
00228    gnome_dialog_close_hides(GNOME_DIALOG(dialog), FALSE);
00229    gnome_dialog_set_default(GNOME_DIALOG(dialog), 3);      
00230 
00231         vbox = gtk_vbox_new (FALSE, 0);
00232         gtk_widget_show (vbox);
00233 
00234         gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)->vbox), vbox, TRUE, TRUE, GNOME_PAD);
00235 
00236         // Create entry for source file
00237         hbox = gtk_hbox_new (FALSE, 0);
00238         gtk_widget_show (hbox);
00239         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
00240 
00241         VarName = gtk_label_new (_("Source File"));
00242         gtk_widget_set_usize (VarName, 100, -1);
00243         gtk_widget_show (VarName);
00244         gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00245         gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00246         gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00247         gtk_box_pack_start (GTK_BOX (hbox), VarName, TRUE, TRUE, 0);
00248         
00249         SrcFile = variable = gnome_file_entry_new( NULL, "Choose the source file");
00250         gnome_file_entry_set_default_path( GNOME_FILE_ENTRY ( variable ), frontenddata->sourceFile);
00251         gnome_file_entry_set_directory_entry(GNOME_FILE_ENTRY (variable), FALSE);
00252         gnome_file_entry_set_filename (GNOME_FILE_ENTRY (variable), frontenddata->sourceFile);
00253         gtk_box_pack_start (GTK_BOX (hbox), variable, TRUE, TRUE, 0);
00254         gtk_widget_show(variable);
00255 
00256         // Create entry for destination path
00257         hbox = gtk_hbox_new (FALSE, 0);
00258         gtk_widget_show (hbox);
00259         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
00260 
00261         VarName = gtk_label_new (_("Destination Path"));
00262         gtk_widget_set_usize (VarName, 100, -1);
00263         gtk_widget_show (VarName);
00264         gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00265         gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00266         gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00267         gtk_box_pack_start (GTK_BOX (hbox), VarName, TRUE, TRUE, 0);
00268 
00269         DestinationPath = variable = gnome_file_entry_new( NULL, "Choose the destination directory");
00270         gnome_file_entry_set_default_path( GNOME_FILE_ENTRY ( variable ), frontenddata->destFile);
00271         gnome_file_entry_set_directory_entry(GNOME_FILE_ENTRY (variable), TRUE);
00272         gnome_file_entry_set_filename (GNOME_FILE_ENTRY (variable), frontenddata->destFile);
00273         gtk_box_pack_start (GTK_BOX (hbox), variable, TRUE, TRUE,0 );
00274         gtk_widget_show(variable);
00275 
00276   hbox = gtk_hbox_new (FALSE, 0);
00277   gtk_widget_show (hbox);
00278   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
00279 
00280   VarName = gtk_label_new (_("Suffix of Destination"));
00281   gtk_widget_set_usize (VarName, 100, -1);
00282   gtk_widget_show (VarName);
00283   gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00284   gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00285   gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00286   gtk_box_pack_start (GTK_BOX (hbox), VarName, TRUE, TRUE, 0);
00287 
00288   DestinationSuffix = variable = gtk_entry_new ();
00289   gtk_widget_show (variable);
00290   gtk_box_pack_start (GTK_BOX (hbox), variable, TRUE, TRUE, 0);
00291   gtk_entry_set_text (GTK_ENTRY (variable), frontenddata->destSuffix);
00292 
00293   help = gtk_button_new_with_label (_("Help"));
00294   gtk_widget_show (help);
00295   gtk_box_pack_start (GTK_BOX (hbox), help, TRUE, TRUE, 0);
00296   gtk_signal_connect (GTK_OBJECT (help), "clicked", GTK_SIGNAL_FUNC (show_info_callback),(void*)(_("Enter the file format suffix without any special characters.")));
00297 
00298         gtk_signal_connect(GTK_OBJECT(dialog), "clicked", GTK_SIGNAL_FUNC(external_converter_Control::dlg_clicked), this);
00299 
00300         // Create entry for converter
00301         hbox = gtk_hbox_new (FALSE, 0);
00302         gtk_widget_show (hbox);
00303         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
00304 
00305         VarName = gtk_label_new (_("Path to Converter"));
00306         gtk_widget_set_usize (VarName, 100, -1);
00307         gtk_widget_show (VarName);
00308         gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00309         gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00310         gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00311         gtk_box_pack_start (GTK_BOX (hbox), VarName, TRUE, TRUE, 0);
00312 
00313         ConverterPath = variable = gnome_file_entry_new( NULL, "Choose the path to the external converter");
00314         gnome_file_entry_set_default_path( GNOME_FILE_ENTRY ( variable ), frontenddata->destFile);
00315         gnome_file_entry_set_directory_entry(GNOME_FILE_ENTRY (variable), FALSE);
00316         gnome_file_entry_set_filename (GNOME_FILE_ENTRY (variable), frontenddata->converterPath);
00317         gtk_box_pack_start (GTK_BOX (hbox), variable, TRUE, TRUE,0 );
00318         gtk_widget_show(variable);
00319         gtk_signal_connect(GTK_OBJECT(dialog), "clicked",GTK_SIGNAL_FUNC(external_converter_Control::dlg_clicked),this);
00320 
00321         hbox = gtk_hbox_new (FALSE, 0);
00322         gtk_widget_show (hbox);
00323         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
00324 
00325         VarName = gtk_label_new (_("Converter Options"));
00326         gtk_widget_set_usize (VarName, 100, -1);
00327         gtk_widget_show (VarName);
00328         gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00329         gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00330         gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00331         gtk_box_pack_start (GTK_BOX (hbox), VarName, TRUE, TRUE, 0);
00332 
00333         ConverterOptions = variable = gtk_entry_new ();
00334         gtk_widget_show (variable);
00335         gtk_box_pack_start (GTK_BOX (hbox), variable, TRUE, TRUE, 0);
00336         gtk_entry_set_text (GTK_ENTRY (variable), frontenddata->converterOptions);
00337 
00338         help = gtk_button_new_with_label (_("Help"));
00339         gtk_widget_show (help);
00340         gtk_box_pack_start (GTK_BOX (hbox), help, TRUE, TRUE, 0);
00341         gtk_signal_connect (GTK_OBJECT (help), "clicked", GTK_SIGNAL_FUNC (show_info_callback),(void*)(_("Enter options for the external converter.")));
00342 
00343         gtk_signal_connect(GTK_OBJECT(dialog), "clicked", GTK_SIGNAL_FUNC(external_converter_Control::dlg_clicked), this);
00344         
00345         gtk_widget_show(dialog);
00346 }
00347 
00348 void external_converter_Control::dlg_clicked(GnomeDialog * dialog, gint button_number, external_converter_Control *mic){
00349 
00350         g_free(mic->frontenddata->sourceFile); 
00351         mic->frontenddata->sourceFile = g_strdup(gnome_file_entry_get_full_path(GNOME_FILE_ENTRY (mic->SrcFile),TRUE));
00352         if(mic->frontenddata->sourceFile == NULL && !button_number)
00353                 if(file_error("Source file does not exist",NULL)){
00354                         gnome_dialog_close(dialog);
00355                         goto finish;
00356                 }
00357         
00358         g_free(mic->frontenddata->destFile); 
00359         mic->frontenddata->destFile = g_strdup(gnome_file_entry_get_full_path(GNOME_FILE_ENTRY (mic->DestinationPath),FALSE));
00360         if(access(mic->frontenddata->destFile,F_OK) && !button_number)
00361                 if(file_error("Destination file does not exist",mic->frontenddata->destFile)){
00362                         gnome_dialog_close(dialog); 
00363                         goto finish;
00364                 }
00365 
00366         g_free(mic->frontenddata->destSuffix);
00367         mic->frontenddata->destSuffix = g_strdup(gtk_entry_get_text (GTK_ENTRY (mic->DestinationSuffix)));      
00368 
00369         g_free(mic->frontenddata->converterPath); 
00370         mic->frontenddata->converterPath = g_strdup(gnome_file_entry_get_full_path(GNOME_FILE_ENTRY (mic->ConverterPath),FALSE));
00371         if(access(mic->frontenddata->converterPath,F_OK) && !button_number)
00372                 if(file_error("Destination file does not exist",mic->frontenddata->converterPath)){
00373                         gnome_dialog_close(dialog); 
00374                         goto finish;
00375                 }
00376         
00377         g_free(mic->frontenddata->converterOptions);
00378         mic->frontenddata->converterOptions = g_strdup(gtk_entry_get_text (GTK_ENTRY (mic->ConverterOptions))); 
00379 
00380   switch(button_number){
00381   case 0:       {gnome_dialog_close(dialog);
00382                                 //show_info_callback(NULL, _("Converting ..."));
00383                                 char command[1000];
00384                                 int len = strlen(mic->frontenddata->sourceFile);
00385                                 gchar* fname = g_strndup(mic->frontenddata->sourceFile,1000);
00386                                 gchar* buffer;
00387                                 while(buffer=strstr(fname,"/")){
00388                                         fname = strndup(buffer+1,1000);
00389                                 }
00390                                 buffer = g_strndup(fname,strlen(fname)-strlen(strrchr(fname, '.')));
00391 
00392                                 len = strlen(mic->frontenddata->destFile);
00394                                 if (len > 0) {
00395                                         if(mic->frontenddata->destFile[len-1] != '/') strcat(mic->frontenddata->destFile, "/");
00396                                 }
00397                                 snprintf(command, 1000, "%s %s %s%s.%s %s &", mic->frontenddata->converterPath, mic->frontenddata->sourceFile, mic->frontenddata->destFile, buffer, mic->frontenddata->destSuffix, mic->frontenddata->converterOptions);
00398                                 system(command);
00399                         break;}
00400 
00401         case 1: {gnome_dialog_close(dialog); 
00402                                 break;}
00403         }
00404 finish:
00405         XsmRescourceManager xrm("FilePathSelectionHistory","external_converter");
00406         xrm.Put ("SourceFile", mic->frontenddata->sourceFile);
00407         xrm.Put ("DestFile", mic->frontenddata->destFile);
00408         xrm.Put ("DestSuffix", mic->frontenddata->destSuffix);
00409         xrm.Put ("ConverterPath", mic->frontenddata->converterPath);
00410         xrm.Put ("ConverterOptions", mic->frontenddata->converterOptions);
00411 
00412 mic->DlgDone();
00413 
00414 }
00415 
00417 // ENDE external_converter_Control
00419 
00421 //ANFANG external_converter_Data
00423 
00424 external_converter_Data :: external_converter_Data(gchar *src, gchar *dst)
00425 {
00426         sourceFile   =  g_strdup(src);
00427         destFile     =  g_strdup(dst); 
00428 }
00429         
00430 external_converter_Data :: ~external_converter_Data() 
00431 {
00432         g_free(sourceFile);
00433         g_free(destFile);
00434 }
00435 
00437 // ENDE external_converter_Data
00439 

Generated on Sat Apr 1 09:04:25 2006 for GXSM by  doxygen 1.4.6