#include #include #include #include #include #include #include #include #include #include // file functions #include "cilib.h" /////////////////////////////////////////////////////////// // TAlmanac_mask /////////////////////////////////////////////////////////// bool TAlmanac_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { int year; year = curr_almanac()->selected_year(); switch (o.dlg()) { case F_PREVMONTH: 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: 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(int page, TDate& sdate) { _almanacs[page] = new TAlmanac_field(this); _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) { // tbc: gestire il pointer a funzione } bool TAlmanac_mask::has_documents(TDate& cdate) { return FALSE; // tbc: gestire il pointer a funzione } TAlmanac_mask::TAlmanac_mask() : TAutomask("cilib") { } TAlmanac_mask::~TAlmanac_mask() { delete[] _almanacs; } /////////////////////////////////////////////////////////// // TAlmanac_field /////////////////////////////////////////////////////////// #define almanac_win() ((TAlmanac_window&)win()) #define almanac_mask() ((TAlmanac_mask&)mask()) 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::has_documents(TDate& cdate) { return almanac_mask().has_documents(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(); } void TAlmanac_field::move_selected_day(int ddays) { _selecteddate+=ddays; almanac_win().force_update(); } void TAlmanac_field::set_selected_month(int nmonth) { if(nmonth>=1 && nmonth<=12) _selecteddate.set_month(nmonth); almanac_win().force_update(); } void TAlmanac_field::move_selected_month(int dmonths) { _selecteddate.addmonth(dmonths); almanac_win().force_update(); } void TAlmanac_field::set_selected_year(int nyear) { _selecteddate.set_year(nyear); almanac_win().force_update(); } /////////////////////////////////////////////////////////// // TAlmanac_window /////////////////////////////////////////////////////////// #define almanac_fld() ((TAlmanac_field&)owner()) 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: gestire la scritta del mese e dei giorni } cdate = almanac_fld().selected_date(); 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_fld().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_fld().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(almanac_fld().selected_date().month(),almanac_fld().selected_date().year())) { 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) { }