#include #include #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) { 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_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); }