#include #include #include #include #include #include // file functions #include #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())) { TAlmanac_mask& m = (TAlmanac_mask&)mask(); _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); RCT rcttd; TString str; int rct_w, rct_h; int rct_t, rct_l; int pad; int row; int fh; 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; set_font("Verdana", XVT_FS_BOLD); set_color(COLOR_BLACK, COLOR_WHITE); fh = 2 + xvt_dwin_get_font_size_mapped(win()); 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("%c", itow(i)[0]); 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); } while (!cdate.is_end_month()) { if (o.is_date_void(cdate)) col_b=COLOR_WHITE; else col_b=COLOR_LTGRAY; if (o.is_selected(cdate.day())) col_f=COLOR_RED; else col_f=COLOR_GRAY; 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); xvt_dwin_draw_text(win(), rct_l + pad + 2, fh + rct_t + pad + 2, str, -1); if ((++cdate).wday()==1) row++; } } 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; 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); 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) o.mask().stop_run(K_ENTER); } 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) { }