#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) { switch (o.dlg()) { case F_PREVMONTH: { const int year = curr_almanac()->selected_year(); curr_almanac()->move_selected_month(-1); this->set(F_CHANGEMONTH,curr_almanac()->selected_month()); if (year!=curr_almanac()->selected_year()) { this->set(F_CHANGEYEAR,curr_almanac()->selected_year()); this->set_year(curr_almanac()->selected_year()); } } break; case F_CHANGEMONTH: curr_almanac()->set_selected_month(this->get_int(F_CHANGEMONTH)); break; case F_NEXTMONTH: { const int year = curr_almanac()->selected_year(); curr_almanac()->move_selected_month(1); this->set(F_CHANGEMONTH,curr_almanac()->selected_month()); if (year!=curr_almanac()->selected_year()) { this->set(F_CHANGEYEAR,curr_almanac()->selected_year()); this->set_year(curr_almanac()->selected_year()); } } break; case F_CHANGEYEAR: this->set_year(this->get_int(F_CHANGEMONTH)); break; default: break; } return TRUE; } void TAlmanac_mask::activate_almanac(TAlmanac_field* fld, int page, TDate& sdate) { _almanacs[page] = fld; _almanacs[page]->set_selected_date(sdate); if (page>_activepages) { _activepages = page; enable_page(0); disable_page(page+1); } } void TAlmanac_mask::set_year(int newyear) { for(int i=0;i<_activepages;i++) _almanacs[i]->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() { read_mask(name, 0, -1); } TAlmanac_mask::~TAlmanac_mask() { // delete[] _almanacs; } /////////////////////////////////////////////////////////// // 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); // almanac_win().force_update(); 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) { }