#include #include #include #include #include #include #include #include #include // file functions #include "cilib.h" /////////////////////////////////////////////////////////// // TAlmanac_field /////////////////////////////////////////////////////////// #define almanac_win() ((TAlmanac_window&)win()) 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); } void TAlmanac_field::set_selected_day(int nday) { if(nday>=1 && nday<=_almanac.last_day()) _selectedday=nday; } void TAlmanac_field::move_selected_day(int dday) { _selectedday+=dday; if(_selectedday<1) _selectedday=1; if(_selectedday>_almanac.last_day()) _selectedday=_almanac.last_day(); } /////////////////////////////////////////////////////////// // TAlmanac_window /////////////////////////////////////////////////////////// #define almanac_fld() ((TAlmanac_field&)owner()) #define almanac() (((TAlmanac_field&)owner()).almanac()) 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; TField_window::update(); if (almanac_fld().show_month_name()) { // tbc } cdate = almanac().month(); cdate.set_day(1); rct_w = ((rct.right - rct.left) / 9); rct_h = ((rct.bottom - rct.top) / 9); pad = - almanac_fld().padding(); row = 3; set_color(COLOR_GRAY, COLOR_LTGRAY); while (!cdate.is_end_month()) { if (almanac().has_documents(cdate)) col_b=COLOR_YELLOW; else col_b=COLOR_LTGRAY; if (almanac_fld().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) { if (key == K_RIGHT) { almanac_fld().move_selected_day(1); return true; } if (key == K_LEFT) { almanac_fld().move_selected_day(-1); return true; } if (key == K_UP) { almanac_fld().move_selected_day(-7); return true; } if (key == K_DOWN) { almanac_fld().move_selected_day(+7); return true; ; } 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; switch(ep->type) { case E_MOUSE_DBL: case E_MOUSE_DOWN: { cdate = almanac().month(); 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<=almanac().last_day()) { almanac_fld().set_selected_day(delta); owner().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) { }