Files correlati : ba1, ba2 Ricompilazione Demo : [ ] Commento : Aggiunte toolbar moderne ai programmi di installazione git-svn-id: svn://10.65.10.50/trunk@17359 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			344 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			344 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <automask.h>
 | |
| #include <config.h>
 | |
| #include <prefix.h>
 | |
| #include <tree.h>
 | |
| #include <treectrl.h>
 | |
| #include <urldefid.h>
 | |
| 
 | |
| #include "ba2201.h"
 | |
| #include "ba2300.h"
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Autoform tree
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TAutoform_tree : public TString_tree
 | |
| {
 | |
|   TConfig *_ini;
 | |
|   
 | |
| protected:  
 | |
|   virtual TImage* image(bool selected) const;
 | |
| 
 | |
| public:  
 | |
|   TConfig& ini();        
 | |
|   void study(const char* module);
 | |
|   bool studied(const char* module) const;
 | |
|   bool forget(const char* module);
 | |
|   
 | |
|   TAutoform_tree();
 | |
|   virtual ~TAutoform_tree();
 | |
| };
 | |
| 
 | |
| TConfig& TAutoform_tree::ini()
 | |
| {
 | |
|   if (_ini == NULL)
 | |
|     _ini = new TConfig(CONFIG_USER, "Autoform");
 | |
|   return *_ini;  
 | |
| }
 | |
| 
 | |
| void TAutoform_tree::study(const char* module)
 | |
| {
 | |
|   CHECK(module && *module, "Invalid module");  
 | |
|   TString4 varname; 
 | |
|   varname.strncpy(module, 2);
 | |
|   varname.lower();
 | |
|   TToken_string str(ini().get(varname), ',');
 | |
|   TString16 val = module; val.ltrim(2);
 | |
|   if (str.get_pos(val) < 0)
 | |
|   {
 | |
|     str.add(val);
 | |
|     ini().set(varname, str);
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool TAutoform_tree::studied(const char* module) const
 | |
| {
 | |
|   if (module && *module)
 | |
|   {
 | |
|     TString4 varname; 
 | |
|     varname.strncpy(module, 2);
 | |
|     varname.lower();
 | |
|     TToken_string str(((TAutoform_tree*)this)->ini().get(varname), ',');
 | |
|     TString16 val = module; val.ltrim(2);
 | |
|     return str.get_pos(val) >= 0;
 | |
|   }
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| bool TAutoform_tree::forget(const char* module)
 | |
| {   
 | |
|   bool killed = FALSE;
 | |
|   if (module && *module)
 | |
|   {
 | |
|     TString4 varname; 
 | |
|     varname.strncpy(module, 2);
 | |
|     varname.lower();
 | |
|     TToken_string str(ini().get(varname), ',');
 | |
|     TString16 val = module; val.ltrim(2);
 | |
|     int pos = str.get_pos(val);
 | |
|     if (pos >= 0)
 | |
|     {
 | |
|       str.destroy(pos);
 | |
|       ini().set(varname, str);
 | |
|       killed = TRUE;
 | |
|     }
 | |
|   }
 | |
|   return killed;
 | |
| }
 | |
| 
 | |
| 
 | |
| TImage* TAutoform_tree::image(bool selected) const
 | |
| {
 | |
|   if (!has_son())
 | |
|   {
 | |
|     TString str; get_description(str);
 | |
|     str.cut(5);
 | |
|     if (studied(str))
 | |
|       return get_res_image(BMP_FILECHK);
 | |
|   } 
 | |
|   return TString_tree::image(selected);
 | |
| }
 | |
| 
 | |
| TAutoform_tree::TAutoform_tree() : _ini(NULL)
 | |
| {
 | |
| }
 | |
| 
 | |
| TAutoform_tree::~TAutoform_tree()
 | |
| {
 | |
|   if (_ini) delete _ini;
 | |
| }
 | |
|  
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Autoform mask
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TAutoform_mask : public TAutomask
 | |
| { 
 | |
|   TAutoform_tree _tree;
 | |
| 
 | |
| protected:
 | |
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | |
|   
 | |
|   static bool forget_lesson(TTree& tree, void* jolly, word flags);
 | |
|   void reset_lesson();
 | |
| 
 | |
| public:  
 | |
|   int list_dirs(const char* filelist, TString_array& result) const;
 | |
|   void fill_tree();
 | |
|   
 | |
|   TAutoform_tree& tree() { return _tree; }
 | |
| 
 | |
|   TAutoform_mask();
 | |
|   virtual ~TAutoform_mask();
 | |
| };
 | |
| 
 | |
| int TAutoform_mask::list_dirs(const char* filelist, TString_array& result) const
 | |
| {             
 | |
|   TWait_cursor hourglass;
 | |
|   result.destroy();
 | |
|   
 | |
|   TFilename dirname(filelist);
 | |
|   int i;
 | |
|   
 | |
|   for (i = dirname.len()-1; i >= 0; i--)
 | |
|     if (dirname[i] == '/' || dirname[i] == '\\' || dirname[i] == ':') break;
 | |
|   
 | |
|   TFilename mask(dirname.mid(i+1));
 | |
|   dirname.cut(i > 0 ? i+1 : 0);   
 | |
|   
 | |
|   xvt_fsys_save_dir();                  
 | |
|   
 | |
|   if (dirname.full())                                             
 | |
|   {
 | |
|     DIRECTORY d; xvt_fsys_convert_str_to_dir(dirname, &d);
 | |
|     BOOLEAN ok = xvt_fsys_set_dir(&d);
 | |
|     if (!ok) 
 | |
|       return 0;
 | |
|   }  
 | |
| 
 | |
|   SLIST files = xvt_fsys_list_files(DIR_TYPE, mask.get_buffer(), TRUE);
 | |
|   const int count = xvt_slist_count(files);
 | |
|   
 | |
|   for (SLIST_ELT e = xvt_slist_get_first(files); e; e = xvt_slist_get_next(files, e))
 | |
|   { 
 | |
|     char* f = xvt_slist_get(files, e, NULL);
 | |
|     if (*f != '.' && f[1] != ':')
 | |
|     {
 | |
|       if (dirname.not_empty()) 
 | |
|       {
 | |
|         mask = dirname; 
 | |
|         mask.add(f);
 | |
|         result.add(mask);
 | |
|       }
 | |
|       else 
 | |
|         result.add(f);  
 | |
|     }
 | |
|   }
 | |
|   
 | |
|   xvt_slist_destroy(files);
 | |
|   xvt_fsys_restore_dir();
 | |
|   
 | |
|   return count;
 | |
| }
 | |
| 
 | |
| static int compare_lessons(const TObject** o1, const TObject** o2)
 | |
| {
 | |
|   const TFilename f1 = *(const TString*)*o1;
 | |
|   const TFilename f2 = *(const TString*)*o2;
 | |
|   const TString80 s1 = f1.name();
 | |
|   const TString80 s2 = f2.name();
 | |
|   int cmp = s1.compare(s2, 4, TRUE);
 | |
|   if (cmp == 0)
 | |
|     cmp = s2[4] - s1[4];
 | |
|   return cmp;  
 | |
| } 
 | |
| 
 | |
| void TAutoform_mask::fill_tree()
 | |
| {
 | |
|   TTree_field& tf = tfield(F_TREE);
 | |
|   TFilename path = get(F_PATH);
 | |
|   TString desc;
 | |
|   if (path.exist())
 | |
|   {
 | |
|     if (_tree.goto_root())
 | |
|       _tree.kill_node();
 | |
|     _tree.add_son(path);
 | |
|         
 | |
|     path.add("*");
 | |
|     TString_array a, b;  
 | |
|     list_dirs(path, a);
 | |
|     for (int i = a.items()-1;  i >= 0; i--)
 | |
|     { 
 | |
|       path = a.row(i);
 | |
|       _tree.goto_root();
 | |
|       _tree.add_son(path.name());
 | |
|           
 | |
|       path.add("*");
 | |
|       list_dirs(path, b);
 | |
|       b.TArray::sort(compare_lessons);
 | |
|       for (int j = b.items()-1;  j >= 0; j--)
 | |
|       {
 | |
|         path = b.row(j);
 | |
|         desc = path.name();
 | |
| 
 | |
|         path.add("backup.ini");
 | |
|         TConfig ini(path, "Main");
 | |
|         desc << " - " << ini.get("Description");
 | |
|         if (desc.not_empty())
 | |
|         {
 | |
|           _tree.add_son(desc);
 | |
|           _tree.goto_father();
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   tf.set_tree(&_tree);   
 | |
|   _tree.goto_root();
 | |
|   _tree.expand_all();
 | |
|   tf.win().force_update();
 | |
| }
 | |
| 
 | |
| bool TAutoform_mask::forget_lesson(TTree& tree, void* jolly, word flags)
 | |
| {    
 | |
|   if (!tree.has_son())
 | |
|   {
 | |
|     TAutoform_tree& at = (TAutoform_tree&)tree;
 | |
|     TString desc; at.get_description(desc);
 | |
|     desc.cut(5);
 | |
|     at.forget(desc);
 | |
|   }
 | |
|   return FALSE;
 | |
| }
 | |
| 
 | |
| void TAutoform_mask::reset_lesson()
 | |
| { 
 | |
|   TTree_field& tf = tfield(F_TREE);
 | |
|   if (tf.goto_selected())
 | |
|   {
 | |
|     if (_tree.goto_firstson())
 | |
|       _tree.scan_depth_first(forget_lesson, NULL);
 | |
|     else
 | |
|       forget_lesson(_tree, NULL, 0);
 | |
|     tf.win().force_update();
 | |
|   }
 | |
| }
 | |
| 
 | |
| bool TAutoform_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {      
 | |
|   switch (o.dlg())
 | |
|   {              
 | |
|   case F_PATH:
 | |
|     if (e == fe_init || e == fe_modify)
 | |
|       fill_tree();
 | |
|     break;
 | |
|   case DLG_RESET:
 | |
|     if (e == fe_button)
 | |
|       reset_lesson();
 | |
|     break;
 | |
|   default: 
 | |
|     break;
 | |
|   }
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| TAutoform_mask::TAutoform_mask() : TAutomask("ba2300") 
 | |
| {
 | |
|   TConfig& ini = _tree.ini();
 | |
|   set(F_PATH, ini.get("Path"));
 | |
|   set(F_STUDENT, ini.get("Student"));
 | |
|   set(F_SOLUTION, ini.get("Solution"));
 | |
| }
 | |
| 
 | |
| TAutoform_mask::~TAutoform_mask()
 | |
| {
 | |
|   TConfig& ini = _tree.ini();
 | |
|   ini.set("Path", get(F_PATH));
 | |
|   ini.set("Student", get(F_STUDENT));
 | |
|   ini.set("Solution", get(F_SOLUTION));
 | |
| }
 | |
| 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // Autoform app
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TAutoform_app : public TArchive_app
 | |
| {
 | |
| protected:
 | |
|   virtual void main_loop();
 | |
| };
 | |
| 
 | |
| void TAutoform_app::main_loop()
 | |
| {
 | |
|   TAutoform_mask msk;
 | |
|   if (msk.run() == K_ENTER)
 | |
|   {      
 | |
|     TTree_field& tf = msk.tfield(F_TREE);
 | |
|     TAutoform_tree& tree = msk.tree();
 | |
|     if (tf.goto_selected() && !tree.has_son())
 | |
|     {    
 | |
|       TString desc; tree.get_description(desc); 
 | |
|       if (yesno_box(FR("Si desidera caricare i dati\n%s?"), (const char*)desc))
 | |
|       {                    
 | |
|         desc.cut(5);
 | |
|         const short dlg = desc.right(1) == "I" ? F_STUDENT : F_SOLUTION;
 | |
|         const TFilename old_study = prefix().get_studio();
 | |
|         TFilename study = msk.get(dlg);
 | |
|         if (study.empty())
 | |
|           msk.set(dlg, study = old_study);
 | |
|         if (study != old_study)
 | |
|           prefix().set_studio(study);
 | |
|         restore(0x3, 0, msk.get(F_PATH));  
 | |
|         tree.study(desc);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| int ba2300(int argc, char* argv[])
 | |
| {
 | |
|   TAutoform_app app;
 | |
|   app.run(argc, argv, TR("Autoformazione"));
 | |
|   return 0;
 | |
| }
 |