421 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			421 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						|
#include <config.h>
 | 
						|
#include <form.h>
 | 
						|
#include <msksheet.h>
 | 
						|
#include <prefix.h>
 | 
						|
#include <relation.h>
 | 
						|
#include <utility.h>
 | 
						|
#include <urldefid.h>
 | 
						|
 | 
						|
#include "ba2100.h"
 | 
						|
 | 
						|
class TForm_editor : public TApplication
 | 
						|
{
 | 
						|
  TForm* _form;
 | 
						|
  bool _extra;
 | 
						|
 | 
						|
protected:
 | 
						|
  virtual bool create();
 | 
						|
  virtual bool destroy();
 | 
						|
  virtual bool menu(MENU_TAG);
 | 
						|
  virtual void print();
 | 
						|
 | 
						|
  static bool file_handler(TMask_field& f, KEY k);
 | 
						|
  
 | 
						|
  bool edit_relation();
 | 
						|
  bool edit(char s, pagetype p);
 | 
						|
  bool form_config() const;
 | 
						|
 | 
						|
public:
 | 
						|
  TForm_editor();
 | 
						|
  virtual ~TForm_editor();
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
TForm_editor::TForm_editor() : _form(NULL), _extra(FALSE)
 | 
						|
{}
 | 
						|
 | 
						|
TForm_editor::~TForm_editor()
 | 
						|
{}
 | 
						|
 | 
						|
bool TForm_editor::create()
 | 
						|
{
 | 
						|
  TApplication::create();
 | 
						|
 | 
						|
  const char* form = NULL;
 | 
						|
  long code = 0;
 | 
						|
  
 | 
						|
  for (int a = 2; a < argc(); a++)
 | 
						|
  {
 | 
						|
    if (stricmp(argv(a), "-E") == 0)
 | 
						|
    {
 | 
						|
      _extra = TRUE;
 | 
						|
      continue;
 | 
						|
    }  
 | 
						|
    
 | 
						|
    if (form == NULL)
 | 
						|
      form = argv(a);
 | 
						|
    else                  
 | 
						|
      if (code == 0)
 | 
						|
        code = atol(argv(a));
 | 
						|
  }
 | 
						|
  
 | 
						|
  bool go = FALSE;
 | 
						|
  
 | 
						|
  if ((form && code) || (form && code == 0 && _extra))
 | 
						|
  {
 | 
						|
    _form = new TForm(form, code, _extra ? 2 : 1);
 | 
						|
    enable_menu_item(M_FILE_PRINT);
 | 
						|
    if (!_extra) dispatch_e_menu(MENU_ITEM(31));
 | 
						|
  } 
 | 
						|
  else
 | 
						|
  {  
 | 
						|
    TMask m("ba2100b");
 | 
						|
    
 | 
						|
    if (form)
 | 
						|
    {
 | 
						|
      m.set(F_BASE, form);
 | 
						|
      m.disable(F_BASE);
 | 
						|
    }
 | 
						|
    
 | 
						|
    if (code) m.set(F_CODE, code);
 | 
						|
    
 | 
						|
    // choose form from mask 
 | 
						|
    KEY k; 
 | 
						|
    while ((k = m.run()) != K_ESC)
 | 
						|
    {
 | 
						|
      TString16 fform = m.get(F_BASE);
 | 
						|
      TString80 fdesc = m.get(F_DESC);
 | 
						|
      long fcode = m.get_long(F_CODE); 
 | 
						|
      
 | 
						|
      if (k == K_ENTER)
 | 
						|
      {
 | 
						|
        _form = new TForm(fform, fcode, _extra ? 2 :1, fdesc);    
 | 
						|
        go  = TRUE;
 | 
						|
        break;
 | 
						|
      }            
 | 
						|
      else if (k == K_DEL)
 | 
						|
      {
 | 
						|
        if (yesno_box("Confermare la cancellazione del profilo %05ld", fcode))
 | 
						|
        { 
 | 
						|
          TLocalisamfile frm(LF_FORM);
 | 
						|
          frm.zero(); 
 | 
						|
          frm.put("TIPOPROF", fform);
 | 
						|
          frm.put("CODPROF",  fcode);
 | 
						|
          if (frm.read() == NOERR)
 | 
						|
            frm.remove();
 | 
						|
          TLocalisamfile rfr(LF_RFORM);
 | 
						|
          rfr.zero(); 
 | 
						|
          rfr.put("TIPOPROF", fform);
 | 
						|
          rfr.put("CODPROF",  fcode);
 | 
						|
          if (rfr.read() == NOERR)
 | 
						|
          {
 | 
						|
            for ( ; rfr.get_long("CODPROF") == fcode && rfr.get("TIPOPROF") == fform; rfr.next())
 | 
						|
              rfr.remove();
 | 
						|
          }
 | 
						|
          m.set(F_CODE,"");
 | 
						|
          m.set(F_BASE,"");
 | 
						|
          m.set(F_DESC,"");
 | 
						|
        }
 | 
						|
      }                                                        
 | 
						|
    }   
 | 
						|
  }
 | 
						|
  
 | 
						|
  if (go)
 | 
						|
  {
 | 
						|
    enable_menu_item(M_FILE_PRINT);
 | 
						|
    if (!_extra) dispatch_e_menu(MENU_ITEM(31));       
 | 
						|
  }
 | 
						|
  
 | 
						|
  return form != NULL;
 | 
						|
}
 | 
						|
 | 
						|
bool TForm_editor::destroy()
 | 
						|
{
 | 
						|
  if (_form) delete _form;
 | 
						|
  return TApplication::destroy();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TForm_editor::menu(MENU_TAG tag)
 | 
						|
{
 | 
						|
  char sec = 'B';
 | 
						|
  pagetype pt = odd_page;
 | 
						|
  
 | 
						|
  switch(tag)
 | 
						|
  {
 | 
						|
  case MENU_ITEM(11): 
 | 
						|
    sec = 'R'; pt = odd_page; break;
 | 
						|
  case MENU_ITEM(12): 
 | 
						|
    sec = 'D'; pt = odd_page; break;
 | 
						|
  case MENU_ITEM(21): 
 | 
						|
    sec = 'H'; pt = odd_page; break;
 | 
						|
  case MENU_ITEM(22): 
 | 
						|
    sec = 'H'; pt = even_page; break;
 | 
						|
  case MENU_ITEM(23): 
 | 
						|
    sec = 'H'; pt = first_page; break;
 | 
						|
  case MENU_ITEM(24): 
 | 
						|
    sec = 'H'; pt = last_page; break;
 | 
						|
  case MENU_ITEM(31): 
 | 
						|
    sec = 'B'; pt = odd_page; break;
 | 
						|
  case MENU_ITEM(32): 
 | 
						|
    sec = 'B'; pt = even_page; break;
 | 
						|
  case MENU_ITEM(33): 
 | 
						|
    sec = 'B'; pt = first_page; break;
 | 
						|
  case MENU_ITEM(34): 
 | 
						|
    sec = 'B'; pt = last_page; break;
 | 
						|
  case MENU_ITEM(41): 
 | 
						|
    sec = 'F'; pt = odd_page; break;
 | 
						|
  case MENU_ITEM(42): 
 | 
						|
    sec = 'F'; pt = even_page; break;
 | 
						|
  case MENU_ITEM(43): 
 | 
						|
    sec = 'F'; pt = first_page; break;
 | 
						|
  case MENU_ITEM(44): 
 | 
						|
    sec = 'F'; pt = last_page; break;
 | 
						|
  case MENU_ITEM(51): 
 | 
						|
    sec = 'G'; pt = odd_page; break;
 | 
						|
  case MENU_ITEM(52): 
 | 
						|
    sec = 'G'; pt = even_page; break;
 | 
						|
  case MENU_ITEM(53): 
 | 
						|
    sec = 'G'; pt = first_page; break;
 | 
						|
  case MENU_ITEM(54): 
 | 
						|
    sec = 'G'; pt = last_page; break;
 | 
						|
  default: 
 | 
						|
    break;
 | 
						|
  }
 | 
						|
  
 | 
						|
  edit(sec, pt);
 | 
						|
  return _extra;
 | 
						|
} 
 | 
						|
 | 
						|
void TForm_editor::print()
 | 
						|
{
 | 
						|
  _form->print();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TForm_editor::file_handler(TMask_field& f, KEY k)
 | 
						|
{  
 | 
						|
  bool ok = TRUE;
 | 
						|
 | 
						|
  if (k == K_TAB && f.dirty())
 | 
						|
  {               
 | 
						|
    const char* n = f.get();
 | 
						|
    if (*n > ' ')
 | 
						|
    {
 | 
						|
      const char* d = prefix().description(n);
 | 
						|
      if (*d == '\0') ok = error_box("Nome di file o tabella errato"); 
 | 
						|
      f.mask().set(f.dlg()+1, d);
 | 
						|
    }  
 | 
						|
  }
 | 
						|
  
 | 
						|
  return ok;  
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TForm_editor::edit_relation()
 | 
						|
{
 | 
						|
  TMask m("ba2100r");
 | 
						|
  TSheet_field& s = (TSheet_field&)m.field(F_ITEMS);
 | 
						|
  s.sheet_mask().set_handler(101, file_handler);
 | 
						|
  
 | 
						|
  TRelation* & rel = _form->_relation;  
 | 
						|
  TCursor*   & cur = _form->_cursor;  
 | 
						|
  
 | 
						|
  if (rel)
 | 
						|
  {    
 | 
						|
    s.rows_array() = _form->rel_desc().get_all_desc();
 | 
						|
    // Disable meaningless fields for main file
 | 
						|
    s.disable_cell(0, 2);     // Join
 | 
						|
    s.disable_cell(0, 4);     // Alias
 | 
						|
  }  
 | 
						|
 | 
						|
  if (m.run() != K_ENTER || !m.dirty()) 
 | 
						|
    return FALSE;
 | 
						|
  
 | 
						|
  if (rel) 
 | 
						|
  {
 | 
						|
    delete cur; cur = NULL;
 | 
						|
    delete rel; rel = NULL;
 | 
						|
  }  
 | 
						|
  
 | 
						|
  TToken_string& r = s.row(0);
 | 
						|
  TString16 name = r.get(0);
 | 
						|
  
 | 
						|
  if (name.not_empty())
 | 
						|
  {
 | 
						|
    int logicnum = atoi(name);
 | 
						|
    
 | 
						|
    int alias = 0, to = 0, key = r.get_int(3);
 | 
						|
    TString80 exp = r.get(5);
 | 
						|
    
 | 
						|
    rel = (logicnum > 0) ? new TRelation(logicnum) : new TRelation(name);                 
 | 
						|
    cur = new TCursor(rel, exp, key);
 | 
						|
    
 | 
						|
    for (int i = 1; i < s.items(); i++)
 | 
						|
    {
 | 
						|
      TToken_string& r = s.row(i);
 | 
						|
      name = r.get(0); logicnum = atoi(name);
 | 
						|
      r.get();                          // Skip description
 | 
						|
      to = name2log(r.get());           // Join
 | 
						|
      key = r.get_int();                // Key
 | 
						|
      alias = r.get_int();              // Alias
 | 
						|
      exp = r.get();                    // Expression
 | 
						|
      
 | 
						|
      const int l = exp.len();
 | 
						|
      for (int j = 0; j < l; j++) 
 | 
						|
        if (exp[j] == ' ') exp[j] = '|';
 | 
						|
      
 | 
						|
      if (logicnum > 0)
 | 
						|
        rel->add(logicnum, exp, key, to, alias);   // join file
 | 
						|
      else
 | 
						|
        rel->add(name, exp, key, to, alias);       // join table
 | 
						|
    }   
 | 
						|
    
 | 
						|
    _form->rel_desc().change_relation(*rel, s.rows_array());
 | 
						|
  }
 | 
						|
  
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TForm_editor::edit(char s, pagetype t)
 | 
						|
{
 | 
						|
  bool dirty = FALSE;
 | 
						|
  
 | 
						|
  if (s == 'R')
 | 
						|
    dirty = edit_relation();
 | 
						|
  else  
 | 
						|
    if (s == 'D')
 | 
						|
      form_config();
 | 
						|
    else  
 | 
						|
    {                             
 | 
						|
      TString80 caption;
 | 
						|
      switch(s)
 | 
						|
      {
 | 
						|
      case 'F': 
 | 
						|
        caption << "Piede"; break;
 | 
						|
      case 'G': 
 | 
						|
        caption << "Sfondo"; break;
 | 
						|
      case 'H': 
 | 
						|
        caption << "Testa"; break;
 | 
						|
      default:  
 | 
						|
        caption << "Corpo"; break;
 | 
						|
      }                    
 | 
						|
      
 | 
						|
      switch(t)
 | 
						|
      {
 | 
						|
      case first_page:
 | 
						|
        caption << " della prima pagina"; break;
 | 
						|
      case even_page:
 | 
						|
        caption << " delle pagine pari"; break;
 | 
						|
      case last_page:
 | 
						|
        caption << " dell'ultima pagina"; break;
 | 
						|
      default:                            
 | 
						|
        caption << " standard"; break;
 | 
						|
      }                          
 | 
						|
      
 | 
						|
      dirty = TRUE;
 | 
						|
      if (!_form->exist(s, t))
 | 
						|
      {
 | 
						|
        const KEY k = yesnocancel_box("La sezione %s non esiste:\n"
 | 
						|
                                      "si desidera generare quella standard?", 
 | 
						|
                                      (const char*)caption);
 | 
						|
        if (k == K_ESC) 
 | 
						|
          dirty = FALSE;
 | 
						|
        else
 | 
						|
        {
 | 
						|
          TPrint_section* sec = _form->exist(s, t, TRUE);
 | 
						|
          if (k == K_YES) 
 | 
						|
          {
 | 
						|
            const TPrint_section* def = _form->exist(s, odd_page);
 | 
						|
            if (def) *sec = *def;
 | 
						|
            else dirty = FALSE;
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }            
 | 
						|
      if (dirty)
 | 
						|
        dirty = _form->section(s, t).edit(caption);
 | 
						|
    }
 | 
						|
  
 | 
						|
  if (dirty && yesno_box("Salvare le modifiche?"))
 | 
						|
  {
 | 
						|
    if (_form->code() == 0L)
 | 
						|
    {
 | 
						|
      TFilename n(_form->name()); n.ext("frm");
 | 
						|
      TFilename bak(n); bak.ext("bak");
 | 
						|
      rename(n, bak);
 | 
						|
      ofstream out(n);
 | 
						|
      _form->print_on(out);
 | 
						|
    }
 | 
						|
    else 
 | 
						|
      _form->write_profile();
 | 
						|
  }
 | 
						|
 | 
						|
  return dirty;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool TForm_editor::form_config() const
 | 
						|
{                               
 | 
						|
  TFilename cnfnam(_form->name()); cnfnam.ext("ini");
 | 
						|
  
 | 
						|
  TString16 cnfpar;
 | 
						|
  if (_form->code() != 0L)
 | 
						|
    cnfpar << _form->code();
 | 
						|
  else  
 | 
						|
    cnfpar << "Main";
 | 
						|
  
 | 
						|
  TConfig cnf(cnfnam, cnfpar);
 | 
						|
  bool ok = FALSE;
 | 
						|
  
 | 
						|
  const TFilename maskname(cnf.get("EdMask"));
 | 
						|
  if (maskname.empty())
 | 
						|
    return warning_box("Nessun parametro da configurare");
 | 
						|
 | 
						|
  TMask m(maskname);
 | 
						|
  
 | 
						|
  // carica campi
 | 
						|
  for (int i = 0; i < m.fields(); i++)
 | 
						|
  {
 | 
						|
    TMask_field& f = m.fld(i);
 | 
						|
    const TFieldref* fref = f.field();
 | 
						|
    if (fref != NULL)
 | 
						|
    {
 | 
						|
      const char* fname = fref->name();
 | 
						|
      if (fname != NULL)
 | 
						|
      {
 | 
						|
        const TString& oldvl = cnf.get(fname);
 | 
						|
        if (!oldvl.empty())
 | 
						|
          f.set(oldvl);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  
 | 
						|
  if (m.run() == K_ENTER && m.dirty())
 | 
						|
  {
 | 
						|
    // aggiusta campi
 | 
						|
    for (i = 0; i < m.fields(); i++)
 | 
						|
    {
 | 
						|
      TMask_field& f = m.fld(i);
 | 
						|
      if (f.dirty())
 | 
						|
      {
 | 
						|
        const TFieldref* fref = f.field();
 | 
						|
        if (fref != NULL)
 | 
						|
          cnf.set(fref->name(), f.get(), NULL, TRUE);
 | 
						|
      }
 | 
						|
    }
 | 
						|
    ok = TRUE;
 | 
						|
  }
 | 
						|
  
 | 
						|
  return ok;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int ba2100(int argc, char* argv[])
 | 
						|
{                                             
 | 
						|
  TForm_editor a;      
 | 
						|
  a.run(argc, argv, "Parametrizzazione stampa");
 | 
						|
  return 0;
 | 
						|
}
 |