Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione 3.2 1208 git-svn-id: svn://10.65.10.50/trunk@17098 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			228 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <applicat.h>
 | |
| #include <automask.h>
 | |
| #include <defmask.h>
 | |
| #include <execp.h>
 | |
| #include <prefix.h>
 | |
| #include <reprint.h>
 | |
| 
 | |
| #include "ba8400.h"
 | |
| #include "ba8500.h"
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Utility
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| bool cod2app(const char* tok, TString& app)
 | |
| {
 | |
|   if (tok != NULL && isalpha(tok[0]) && isalpha(tok[1]) && atoi(tok+2) > 1000)
 | |
|   {
 | |
|     TFilename f;
 | |
|     f.strncpy(tok, 3);
 | |
|     f.ext("exe");
 | |
|     if (!f.custom_path())
 | |
|       return false;
 | |
| 
 | |
|     app.strncpy(tok, 3);
 | |
|     app << " -" << char(tok[3]-1);
 | |
|     return true;
 | |
|   }
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool get_xml_attr(const TString& line, const char* attr, TString& value)
 | |
| {
 | |
|   TString str; str << ' ' << attr << "=\"";
 | |
|   const int pos = line.find(str);
 | |
|   if (pos >= 0)
 | |
|   {
 | |
|     const int apicia = line.find('"', pos)+1;
 | |
|     const int apicic = line.find('"', apicia);
 | |
|     if (apicic > apicia)
 | |
|     {
 | |
|       value = line.sub(apicia, apicic);
 | |
|       return true;
 | |
|     }
 | |
|   }
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool get_xml_child(const TString& line, const char* tag, TString& value)
 | |
| {
 | |
|   TString80 str; str << '<' << tag << '>';
 | |
|   const int pos = line.find(str);
 | |
|   if (pos >= 0)
 | |
|   {
 | |
|     const int apicia = line.find('>', pos)+1;
 | |
|     const int apicic = line.find('<', apicia);
 | |
|     if (apicic > apicia)
 | |
|     {
 | |
|       value = line.sub(apicia, apicic);
 | |
|       return true;
 | |
|     }
 | |
|   }
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| bool rep2app(const char* name, TString& app, TString& desc)
 | |
| {
 | |
|   app = desc = "";
 | |
| 
 | |
|   TFilename report_name(name);
 | |
|   report_name.ext("rep");
 | |
|   if (!report_name.custom_path())
 | |
|     return false;
 | |
| 
 | |
|   TString stringona;
 | |
|   TScanner scan(report_name);
 | |
|   for (int i = 0; i < 3 && scan.good(); i++) // Leggo solo le prime righe
 | |
|     stringona << scan.line();
 | |
| 
 | |
|   get_xml_child(stringona, "description", desc);
 | |
| 
 | |
|   get_xml_attr(stringona, "command", app);
 | |
|   if (app.not_empty())
 | |
|     return app != "ba8 -4"; //in questo caso e' stata definita nel report l'applicazione per stamparlo ed e' diversa da me stesso (ba8 -4)
 | |
| 
 | |
|   return cod2app(report_name.name(), app);
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TKlarkKent_mask
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TKlarkKent_mask : public TAutomask
 | |
| {
 | |
| protected:
 | |
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | |
| 
 | |
| public:
 | |
|   TKlarkKent_mask() : TAutomask("ba8500a") { }
 | |
| };
 | |
| 
 | |
| bool TKlarkKent_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {
 | |
|   switch (o.dlg())
 | |
|   {
 | |
|   case F_REPORT:
 | |
|     if (e == fe_button)
 | |
|     {
 | |
|       TFilename path;
 | |
|       if (select_custom_file(path, "rep"))
 | |
|       {
 | |
|         o.set(path);
 | |
|         e = fe_modify;
 | |
|       }
 | |
|     }
 | |
|     if (e == fe_init || e == fe_modify)
 | |
|     {
 | |
|       TFilename name = o.get();
 | |
|       TString app, desc; 
 | |
|       rep2app(name, app, desc);
 | |
|       set(F_FORM, desc);
 | |
|       set(F_DOC, app);
 | |
|       enable(DLG_PRINT, desc.not_empty());
 | |
|     }
 | |
|     break;
 | |
|   case DLG_EDIT:
 | |
|     if (e == fe_button && !field(F_REPORT).empty())
 | |
|     {
 | |
|       TString str;
 | |
|       str << "ba8 -2 " << get(F_REPORT);
 | |
|       TExternal_app app(str);
 | |
|       app.run(true);
 | |
|     }
 | |
|     break;
 | |
|   default:
 | |
|     break;
 | |
|   }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TKlarkKent_app
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| TReport* TKlarkKent_app::create_report(const char* name) const
 | |
| {
 | |
|   TReport* r = new TReport;
 | |
|   r->load(name);
 | |
|   return r;
 | |
| }
 | |
| 
 | |
| void TKlarkKent_app::main_loop()
 | |
| {
 | |
|   TString_array arr;
 | |
|   for (int i = 2; i < argc(); i++)
 | |
|     arr.add(argv(i));
 | |
|   if (arr.items() == 0)
 | |
|     arr.add(EMPTY_STRING);
 | |
| 
 | |
|   bool can_repeat = false;
 | |
|   do
 | |
|   {
 | |
|     TReport* report = NULL;
 | |
|     TReport_book book;
 | |
|     FOR_EACH_ARRAY_ROW(arr, r, row)
 | |
|     {  
 | |
|       TFilename report_name = *row;
 | |
|       report_name.ext("rep");
 | |
|       if (row->blank() || !report_name.custom_path()) 
 | |
|       {
 | |
|         TKlarkKent_mask m;
 | |
|         m.set(F_REPORT, report_name);
 | |
|         if (m.run() == K_ENTER)
 | |
|         {
 | |
|           report_name = m.get(F_REPORT);
 | |
|           report_name.ext("rep");
 | |
|           report_name.custom_path();
 | |
|           *row = report_name;
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       TString appname, desc;
 | |
|       const bool custom_app = rep2app(report_name, appname, desc);
 | |
|       if (custom_app)
 | |
|       {
 | |
|         appname << ' ' << report_name;
 | |
|         TExternal_app app(appname);
 | |
|         app.run(true);
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         if (report != NULL)
 | |
|           delete report;
 | |
|         report = create_report(report_name); 
 | |
|         if (report != NULL)
 | |
|         {
 | |
|           const bool ok = book.add(*report);
 | |
|           if (ok && arr.items() == 1)  // Controlla se e' pensabile ripetere la stampa
 | |
|           {
 | |
|             TFilename msk = report_name;
 | |
|             msk.ext("msk");
 | |
|             can_repeat = msk.custom_path();  // Posso ripetere se ho una maschera collegata
 | |
|           }
 | |
|           else
 | |
|             can_repeat = false;
 | |
|         }
 | |
|       }
 | |
|     } // ciclo sulla lista dei report da stampare
 | |
| 
 | |
|     // L'anteprima funziona bene solo se non si distrugge il report corrente
 | |
|     if (report != NULL)
 | |
|     {
 | |
|       if (book.pages() > 0)
 | |
|         book.print_or_preview();
 | |
|       delete report;
 | |
|       report = NULL;
 | |
|     }
 | |
| 
 | |
|   } while (can_repeat);
 | |
| }
 | |
| 
 | |
| int ba8500(int argc, char* argv[])
 | |
| {     
 | |
|   TKlarkKent_app app;
 | |
|   app.run(argc, argv, TR("Stampa Report"));
 | |
|   return 0;
 | |
| }
 |