Files correlati : lv0.exe Ricompilazione Demo : [ ] Commento : Aggiunto il calendario giorni lavorativi e festività nella configurazione lavanderie git-svn-id: svn://10.65.10.50/trunk@17541 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			437 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			437 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <colors.h>
 | |
| #include <config.h>
 | |
| #include <automask.h>
 | |
| #include <image.h>
 | |
| #include <tabutil.h>
 | |
| #include <xvtility.h>
 | |
| #include <defmask.h>
 | |
| #include <utility.h> // file functions
 | |
| #include <xvt.h>
 | |
| 
 | |
| #include "cilib.h"
 | |
| #include "cimsk.h"
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TAlmanac_mask
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| TMask_field* TAlmanac_mask::parse_field(TScanner& scanner)
 | |
| {
 | |
|   const TString& k = scanner.key();
 | |
|   if (k.starts_with("AL", true))
 | |
|     return new TAlmanac_field(this);
 | |
|   return TAutomask::parse_field(scanner);
 | |
| }
 | |
| 
 | |
| bool TAlmanac_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {
 | |
| 	switch (o.dlg())
 | |
| 	{
 | |
| 	case F_PREVMONTH:
 | |
| 		if (e == fe_button)
 | |
| 		{
 | |
| 			TAlmanac_field & al = curr_almanac();
 | |
| 			const int year = al.selected_year();
 | |
| 				
 | |
| 			al.move_selected_month(-1);
 | |
| 			set(F_CHANGEMONTH, al.selected_month());
 | |
| 			if (year != al.selected_year())
 | |
| 			{
 | |
| 				set(F_CHANGEYEAR, al.selected_year());
 | |
| 				set_year(al.selected_year());
 | |
| 			}
 | |
| 		}
 | |
| 		break;
 | |
| 	case F_CHANGEMONTH:
 | |
| 		if (e == fe_modify)
 | |
| 		{
 | |
| 			TAlmanac_field & al = curr_almanac();
 | |
| 
 | |
| 			al.set_selected_month(get_int(F_CHANGEMONTH));
 | |
| 		}
 | |
| 		break;    
 | |
| 	case F_NEXTMONTH:
 | |
| 		if (e == fe_button)
 | |
| 		{
 | |
| 			TAlmanac_field & al = curr_almanac();
 | |
| 			const int year = al.selected_year();
 | |
| 			
 | |
| 			al.move_selected_month(1);
 | |
| 			set(F_CHANGEMONTH, al.selected_month());
 | |
| 			if (year != al.selected_year())
 | |
| 			{
 | |
| 				set(F_CHANGEYEAR, al.selected_year());
 | |
| 				set_year(al.selected_year());
 | |
| 			}
 | |
| 		}
 | |
| 		break;    
 | |
| 	case F_CHANGEYEAR:
 | |
| 		if (e == fe_modify)
 | |
| 			set_year(get_int(F_CHANGEYEAR));
 | |
| 		break;    
 | |
| 	default:
 | |
| 		break;
 | |
| 	}     
 | |
| 
 | |
|   return true;
 | |
| }  
 | |
| 
 | |
| void TAlmanac_mask::activate_almanac(const short id, int page, TDate& sdate)
 | |
| {
 | |
|   _almanacs[page] = id2pos(id);
 | |
|   almanac(page).set_selected_date(sdate);
 | |
|   if (page > _lastpage)
 | |
|     _lastpage = page;
 | |
|   set(F_CHANGEMONTH, sdate.month());
 | |
| }
 | |
| 
 | |
| TAlmanac_field & TAlmanac_mask::almanac(byte page) const
 | |
| { 
 | |
| 	if (page > _lastpage)
 | |
| 		page = curr_page();
 | |
| 	if (page > _lastpage)
 | |
| 		page = 0;
 | |
| 	return (TAlmanac_field &) fld(_almanacs[page]);
 | |
| } 
 | |
| 
 | |
| void TAlmanac_mask::set_year(int newyear) 
 | |
| { 
 | |
|     for(byte p = 0; p <= _lastpage; p++) 
 | |
|       almanac(p).set_selected_year(newyear); 
 | |
|     change_year(newyear);
 | |
| }
 | |
| 
 | |
| void TAlmanac_mask::change_year(int newyear) 
 | |
| { 
 | |
|   return;
 | |
| }
 | |
| 
 | |
| bool TAlmanac_mask::is_date_void(int currpage, TDate& cdate) 
 | |
| { 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
|   TAlmanac_mask::TAlmanac_mask(const char * name)
 | |
| 							 : TAutomask(), _lastpage(0)
 | |
| {
 | |
| 	read_mask(name, 0, -1); 
 | |
| 	set_handlers();
 | |
| }
 | |
| 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TAlmanac_field
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| TField_window* TAlmanac_field::create_window(int x, int y, int dx, int dy, WINDOW parent)
 | |
| {
 | |
|   TAlmanac_window * obj = new TAlmanac_window(x, y, dx, dy, parent, this);
 | |
|   RCT rct; xvt_vobj_get_outer_rect(obj->win(), &rct);
 | |
| 	const int pad = 6;
 | |
| 
 | |
| 	if (rct.left > pad * 4)
 | |
| 	{
 | |
| 		_image = new TImage_window(-1, y, -1, dy, parent, this);
 | |
| 		RCT img_rect; xvt_vobj_get_outer_rect(_image->win(), &img_rect);
 | |
| 		img_rect.right = rct.left - pad ;
 | |
| 		img_rect.left = pad;
 | |
|     xvt_vobj_move(_image->win(), (RCT*)&img_rect);
 | |
| 	}
 | |
| 
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| bool TAlmanac_field::is_date_void(int currpage, TDate& cdate)
 | |
| {
 | |
| 	return ((TAlmanac_mask &)mask()).is_date_void(currpage, cdate);
 | |
| }
 | |
| 
 | |
| void TAlmanac_field::force_update(bool update_image)
 | |
| {
 | |
| 	win().force_update();
 | |
| 	if (update_image && _image != NULL)
 | |
| 		_image->force_update();
 | |
| }
 | |
| void TAlmanac_field::set_selected_day(int nday)
 | |
| { 
 | |
|   if(nday>=1 && nday<=TDate::last_day(_selecteddate.month(),_selecteddate.year()))
 | |
| 	{
 | |
|     TAlmanac_mask& m = (TAlmanac_mask&)mask();
 | |
| 
 | |
|     _selecteddate.set_day(nday);
 | |
| 		force_update();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void TAlmanac_field::move_selected_day(int ddays)
 | |
| { 
 | |
| 	const int old_month = _selecteddate.month();
 | |
|   _selecteddate+=ddays;
 | |
|   force_update(old_month != _selecteddate.month());
 | |
| }
 | |
| 
 | |
| void TAlmanac_field::set_selected_month(int nmonth)
 | |
| { 
 | |
|   if(nmonth >= 1 && nmonth <= 12)
 | |
| 	{
 | |
|     _selecteddate.set_month(nmonth);
 | |
| 		force_update(true);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void TAlmanac_field::move_selected_month(int dmonths)
 | |
| { 
 | |
| 	_selecteddate.addmonth(dmonths);
 | |
|   force_update(true);
 | |
| }
 | |
| 
 | |
| void TAlmanac_field::set_selected_year(int nyear)
 | |
| { 
 | |
|   _selecteddate.set_year(nyear);
 | |
|   force_update(true);
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TAlmanac_window
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| void TAlmanac_window::update()
 | |
| {
 | |
|   COLOR col_f, col_b;
 | |
|   RCT rct; xvt_vobj_get_client_rect(win(), &rct);
 | |
|   RCT rcttd;
 | |
|   TString str;
 | |
|   int rct_w, rct_h;
 | |
|   int rct_t, rct_l;
 | |
|   int pad;
 | |
|   int row;
 | |
|   int fh;
 | |
|   int cpage;
 | |
| 	TAlmanac_field & o = (TAlmanac_field&)owner();
 | |
| 
 | |
|   TField_window::update();
 | |
|   TDate cdate = o.selected_date();
 | |
|   cdate.set_day(1);
 | |
| 
 | |
|   cpage = o.mask().curr_page();
 | |
| 
 | |
|   rct_w = ((rct.right - rct.left) / 9);
 | |
|   rct_h = ((rct.bottom - rct.top) / 9);
 | |
|   pad =  o.padding();
 | |
|   row = 3;
 | |
| 
 | |
|   set_font("", XVT_FS_BOLD);
 | |
|   set_color(NORMAL_COLOR, NORMAL_BACK_COLOR);
 | |
|   fh = CHARY;
 | |
| 
 | |
|   if (o.show_month_name())
 | |
|   {
 | |
|     str.format("%s %d", itom(cdate.month()),cdate.year());
 | |
|     rct_l = rct.left + rct_w;
 | |
|     rct_t = rct.top + rct_h;
 | |
|     xvt_dwin_draw_text(win(), rct_l + pad + 2, fh + rct_t + pad + 2, str, -1);
 | |
|   }
 | |
| 
 | |
|   for (int i=1;i<=7;i++)
 | |
|   {
 | |
|     str.format("%.3s", itow(i));
 | |
|     rct_l = rct.left + rct_w*i;
 | |
|     rct_t = rct.top + rct_h*2;
 | |
|     xvt_dwin_draw_text(win(), rct_l + pad + 2, fh + rct_t + pad + 2, str, -1);
 | |
|   }
 | |
| 
 | |
|   --cdate;
 | |
| 
 | |
|   do
 | |
|   {
 | |
|     if ((++cdate).wday()==1 && cdate.day() > 1) row++;
 | |
| 
 | |
| 		col_b = NORMAL_BACK_COLOR;
 | |
|     col_f=NORMAL_COLOR;
 | |
| 
 | |
| 		if (o.is_date_void(cpage, cdate))
 | |
| 		{
 | |
| 			if (!o.can_insert(cdate))
 | |
| 				col_b = DISABLED_BACK_COLOR;
 | |
| 		}
 | |
|     else
 | |
|       col_b = FOCUS_BACK_COLOR;
 | |
| 
 | |
|     set_pen(col_f);
 | |
|     set_brush(col_b);
 | |
| 
 | |
|     rct_l = rct.left + rct_w*cdate.wday();
 | |
|     rct_t = rct.top + rct_h*row;
 | |
|     
 | |
|     str.format("%2d", cdate.day());
 | |
| 
 | |
|     rcttd.top = rct_t + pad;
 | |
|     rcttd.left = rct_l + pad;
 | |
|     rcttd.bottom = rct_t + rct_h - pad;
 | |
|     rcttd.right = rct_l + rct_w - pad;
 | |
| 
 | |
|     xvt_dwin_draw_rect(win(), &rcttd);
 | |
| 		if (cdate.is_holiday())
 | |
| 		{
 | |
| 			set_brush(o.can_insert(cdate) ? DISABLED_BACK_COLOR : NORMAL_COLOR, PAT_FDIAG);
 | |
| 	    xvt_dwin_draw_rect(win(), &rcttd);
 | |
| 		}
 | |
| 
 | |
| 
 | |
|     if (o.is_selected(cdate.day()))
 | |
|     {
 | |
|       set_pen(FOCUS_COLOR,1);
 | |
|       rcttd.top++; rcttd.left++; rcttd.bottom--; rcttd.right--;
 | |
|       xvt_dwin_draw_rect(win(), &rcttd);
 | |
|     }
 | |
| 
 | |
|     xvt_dwin_draw_text(win(), rct_l + pad + 2, fh + rct_t + pad, str, -1);
 | |
|   }
 | |
|   while (!cdate.is_end_month());
 | |
| }
 | |
| 
 | |
| bool TAlmanac_window::on_key(KEY key)
 | |
| {
 | |
| 	TAlmanac_field & o = (TAlmanac_field&)owner();
 | |
|   int smonth, syear;
 | |
| 
 | |
|   smonth = o.selected_month();
 | |
|   syear = o.selected_year();
 | |
| 
 | |
|   switch (key)
 | |
| 	{
 | |
| 		case K_RIGHT:
 | |
| 			o.move_selected_day(1);
 | |
|       break;
 | |
| 		case K_LEFT:
 | |
| 		  o.move_selected_day(-1);
 | |
|       break;
 | |
| 		case K_UP:
 | |
| 			o.move_selected_day(-7);
 | |
|       break;
 | |
| 		case K_DOWN:
 | |
| 			o.move_selected_day(+7);
 | |
|       break;
 | |
| 		case K_SPACE:
 | |
| 		case K_ENTER:
 | |
| 			((TAlmanac_mask&)o.mask()).open_day_mask();
 | |
|       break;
 | |
| 		case K_PREV:
 | |
| 		case K_NEXT:
 | |
| 		case K_CTRL+K_F1:
 | |
| 		case K_CTRL+K_F2:
 | |
| 		case K_CTRL+K_F3:
 | |
| 		case K_CTRL+K_F4:
 | |
| 		case K_CTRL+K_F5:
 | |
| 		case K_CTRL+K_F6:
 | |
| 		case K_CTRL+K_F7:
 | |
| 		case K_CTRL+K_F8:
 | |
| 		case K_CTRL+K_F9:
 | |
| 		case K_CTRL+K_F10:
 | |
| 		case K_CTRL+K_F11:
 | |
| 		case K_CTRL+K_F12:
 | |
| 			o.mask().on_key(key);
 | |
|       break;
 | |
| 		default:
 | |
| 			return TField_window::on_key(key);
 | |
|   }
 | |
|   
 | |
|   if(smonth!=o.selected_month())
 | |
|     o.mask().set(F_CHANGEMONTH, o.selected_month(), true);
 | |
|   if(syear!=o.selected_year())
 | |
|   {
 | |
|     o.mask().set(F_CHANGEYEAR, o.selected_year(), true);
 | |
|     ((TAlmanac_mask&)o.mask()).set_year(o.selected_year());
 | |
|   }
 | |
| 	return true;
 | |
| }
 | |
| 
 | |
| void TAlmanac_window::handler(WINDOW win, EVENT* ep)
 | |
| {
 | |
|   TDate cdate, fdate;
 | |
|   RCT rct; xvt_vobj_get_client_rect(win, &rct);
 | |
|   int rct_w, rct_h;
 | |
|   int pnt_r, pnt_c;
 | |
|   int delta;
 | |
| 	TAlmanac_field & o = (TAlmanac_field&)owner();
 | |
| 
 | |
|   switch(ep->type)
 | |
|   {
 | |
|     case E_MOUSE_DOWN:
 | |
|     case E_MOUSE_DBL:
 | |
|     {
 | |
|       cdate = o.selected_date();
 | |
|       fdate = o.selected_date();
 | |
|       fdate.set_day(1);
 | |
| 
 | |
|       rct_w = ((rct.right - rct.left) / 9);
 | |
|       rct_h = ((rct.bottom - rct.top) / 9);
 | |
|       pnt_c = (ep->v.mouse.where.h) / rct_w;
 | |
|       pnt_r = (ep->v.mouse.where.v) / rct_h;
 | |
| 
 | |
|       delta = 7*pnt_r + pnt_c - (7*(3+cdate.week()-fdate.week()) + cdate.wday());
 | |
|       o.move_selected_day(delta);
 | |
|       if (ep->type==E_MOUSE_DBL)
 | |
| 				((TAlmanac_mask&)o.mask()).open_day_mask();
 | |
|     }
 | |
|       break;
 | |
|     default:
 | |
|       TField_window::handler(win, ep);
 | |
|       break;
 | |
|   }
 | |
| }
 | |
| 
 | |
| TAlmanac_window::TAlmanac_window(int x, int y, int dx, int dy, WINDOW parent, TWindowed_field *owner)
 | |
| : TField_window(x, y, dx, dy, parent, owner)
 | |
| {
 | |
|   xvt_sbar_set_range(win(), HSCROLL, 0, 0);
 | |
|   xvt_sbar_set_range(win(), VSCROLL, 0, 0);
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TImage_window
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| void TImage_window::update()
 | |
| {
 | |
|   RCT rct; xvt_vobj_get_client_rect(win(), &rct);
 | |
| 	TAlmanac_field & f = (TAlmanac_field&) owner();
 | |
| 	const int month = f.selected_date().month();
 | |
| 
 | |
|   _curr_month = month;
 | |
| 	clear(MASK_BACK_COLOR);
 | |
| 
 | |
| 	TFilename month_img; month_img.format("%2smn%02d.jpg", (const char *) f.mask().source_file().left(2), _curr_month);
 | |
| 
 | |
| 	if (month_img.custom_path())
 | |
|   {                     
 | |
| 		TImage bmp(month_img);
 | |
| 		const double ratiox = (double) (rct.right) / (double) bmp.width();
 | |
| 		const double ratioy = (double) (rct.bottom) / (double) bmp.height();
 | |
| 			
 | |
| 		if (ratiox < ratioy)
 | |
| 		{
 | |
| 			int h = int(bmp.height() * ratiox);
 | |
| 
 | |
| 			rct.top = (rct.bottom - h) / 2;
 | |
| 			rct.bottom = rct.top + h;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			int w = int(bmp.width() * ratioy);
 | |
| 
 | |
| 			rct.left = (rct.right - w) / 2;
 | |
| 			rct.right = rct.left + w;
 | |
| 		}
 | |
| 
 | |
| 		bmp.draw(win(), rct);
 | |
|   }
 | |
| }
 | |
| 
 | |
| TImage_window::TImage_window(int x, int y, int dx, int dy, WINDOW parent, TWindowed_field *owner)
 | |
|             : TField_window(x, y, dx, dy, parent, owner), _curr_month(0)
 | |
| 
 | |
| {
 | |
|   xvt_sbar_set_range(win(), HSCROLL, 0, 0);
 | |
|   xvt_sbar_set_range(win(), VSCROLL, 0, 0);
 | |
| } |