#include #include #include #include #include #include // file functions #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) { byte page = curr_page(); if (page >=0 && page < 16) { TAlmanac_field & al = curr_almanac(); switch (o.dlg()) { case F_PREVMONTH: { const int year = al.selected_year(); al.move_selected_month(-1); this->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: al.set_selected_month(get_int(F_CHANGEMONTH)); break; case F_NEXTMONTH: { 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: 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); set(F_CHANGEMONTH, sdate.month()); if (page>_activepages) _activepages = page; } void TAlmanac_mask::set_year(int newyear) { for(byte p = 0; p < _activepages; p++) almanac(p).set_selected_year(newyear); change_year(newyear); } void TAlmanac_mask::change_year(int newyear) { return; } bool TAlmanac_mask::is_date_void(TDate& cdate) { return TRUE; } TAlmanac_mask::TAlmanac_mask(const char * name) : TAutomask(), _activepages(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) { return new TAlmanac_window(x, y, dx, dy, parent, this); } bool TAlmanac_field::is_date_void(TDate& cdate) { return ((TAlmanac_mask &)mask()).is_date_void(cdate); } void TAlmanac_field::set_selected_day(int nday) { if(nday>=1 && nday<=TDate::last_day(_selecteddate.month(),_selecteddate.year())) { _selecteddate.set_day(nday); win().force_update(); } } void TAlmanac_field::move_selected_day(int ddays) { _selecteddate+=ddays; win().force_update(); } void TAlmanac_field::set_selected_month(int nmonth) { if(nmonth >= 1 && nmonth <= 12) { _selecteddate.set_month(nmonth); win().force_update(); } } void TAlmanac_field::move_selected_month(int dmonths) { _selecteddate.addmonth(dmonths); win().force_update(); } void TAlmanac_field::set_selected_year(int nyear) { _selecteddate.set_year(nyear); win().force_update(); } /////////////////////////////////////////////////////////// // TAlmanac_window /////////////////////////////////////////////////////////// void TAlmanac_window::update() { TDate cdate; COLOR col_f, col_b; RCT rct; xvt_vobj_get_client_rect(win(), &rct); TString str; int rct_w, rct_h; int rct_t, rct_l; int pad; int row; TAlmanac_field & o = (TAlmanac_field&)owner(); TField_window::update(); cdate = o.selected_date(); cdate.set_day(1); rct_w = ((rct.right - rct.left) / 9); rct_h = ((rct.bottom - rct.top) / 9); pad = - o.padding(); row = 3; if (o.show_month_name()) { str.format("%s", itom(cdate.month())); rct_l = rct.left + rct_w; rct_t = rct.top + rct_h; stringat(rct_l + pad + 2, rct_t + pad + 2, str); } for (int i=1;i<7;i++) { str.format("%c", itow(i)[0]); rct_l = rct.left + rct_w*i; rct_t = rct.top + rct_h*2; stringat(rct_l + pad + 2, rct_t + pad + 2, str); } set_color(COLOR_GRAY, COLOR_LTGRAY); while (!cdate.is_end_month()) { if (o.is_date_void(cdate)) col_b=COLOR_LTGRAY; else col_b=COLOR_YELLOW; if (o.is_selected(cdate.day())) col_f=COLOR_RED; else col_f=COLOR_GRAY; set_color(col_f,col_b); set_font(XVT_FFN_HELVETICA, XVT_FS_BOLD); rct_l = rct.left + rct_w*cdate.wday(); rct_t = rct.top + rct_h*row; str.format("%2d", cdate.day()); rect(rct_l + pad, rct_t + pad, rct_l + rct_w - pad, rct_t + rct_h - pad); stringat(rct_l + pad + 2, rct_t + pad + 2, str); if ((++cdate).wday()==1) row++; } } bool TAlmanac_window::on_key(KEY key) { TAlmanac_field & o = (TAlmanac_field&)owner(); switch (key) { case K_RIGHT: o.move_selected_day(1); return true; case K_LEFT: o.move_selected_day(-1); return true; case K_UP: o.move_selected_day(-7); return true; case K_DOWN: o.move_selected_day(+7); return true; default: break; } return TField_window::on_key(key); } void TAlmanac_window::handler(WINDOW win, EVENT* ep) { TDate cdate; 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_DBL: case E_MOUSE_DOWN: { cdate = o.selected_date(); cdate.set_day(1); rct_w = ((rct.right - rct.left) / 9); rct_h = ((rct.bottom - rct.top) / 9); pnt_c = (ep->v.mouse.where.v) % rct_w; pnt_r = (ep->v.mouse.where.h) % rct_h; delta = pnt_c*pnt_r - (27+cdate.wday()); if (delta>=1&&delta<=TDate::last_day(o.selected_date().month(), o.selected_date().year())) { o.set_selected_day(delta); o.on_key(K_SPACE); } } 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) { }