2005-04-18 15:31:21 +00:00
|
|
|
#include <config.h>
|
2005-04-21 12:47:17 +00:00
|
|
|
#include <mask.h>
|
2005-04-18 15:31:21 +00:00
|
|
|
#include <diction.h>
|
|
|
|
#include <prefix.h>
|
|
|
|
#include <progind.h>
|
|
|
|
#include <tabutil.h>
|
|
|
|
#include <xvtility.h>
|
|
|
|
#include <defmask.h>
|
|
|
|
#include <image.h>
|
|
|
|
#include <utility.h> // file functions
|
|
|
|
|
|
|
|
#include "cilib.h"
|
|
|
|
|
2005-04-21 12:47:17 +00:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// TAlmanac_mask
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
2005-04-21 15:13:51 +00:00
|
|
|
TMask_field* TAlmanac_mask::parse_field(TScanner& scanner)
|
|
|
|
{
|
|
|
|
const TString& k = scanner.key();
|
|
|
|
if (k == "ALMANAC")
|
|
|
|
return new TAlmanac_field(this);
|
|
|
|
return TAutomask::parse_field(scanner);
|
|
|
|
}
|
|
|
|
|
2005-04-21 12:47:17 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2005-04-21 15:13:51 +00:00
|
|
|
void TAlmanac_mask::activate_almanac(TAlmanac_field* fld, int page, TDate& sdate)
|
2005-04-21 12:47:17 +00:00
|
|
|
{
|
2005-04-21 15:13:51 +00:00
|
|
|
_almanacs[page] = fld;
|
2005-04-21 12:47:17 +00:00
|
|
|
_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)
|
|
|
|
{
|
2005-04-21 15:13:51 +00:00
|
|
|
return;
|
2005-04-21 12:47:17 +00:00
|
|
|
}
|
|
|
|
|
2005-04-21 15:13:51 +00:00
|
|
|
bool TAlmanac_mask::is_date_void(TDate& cdate)
|
2005-04-21 12:47:17 +00:00
|
|
|
{
|
2005-04-21 15:13:51 +00:00
|
|
|
return TRUE;
|
2005-04-21 12:47:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TAlmanac_mask::TAlmanac_mask()
|
|
|
|
: TAutomask("cilib")
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
TAlmanac_mask::~TAlmanac_mask()
|
|
|
|
{
|
|
|
|
delete[] _almanacs;
|
|
|
|
}
|
|
|
|
|
2005-04-18 15:31:21 +00:00
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// TAlmanac_field
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#define almanac_win() ((TAlmanac_window&)win())
|
|
|
|
|
2005-04-21 12:47:17 +00:00
|
|
|
#define almanac_mask() ((TAlmanac_mask&)mask())
|
|
|
|
|
2005-04-18 15:31:21 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2005-04-21 15:13:51 +00:00
|
|
|
bool TAlmanac_field::is_date_void(TDate& cdate)
|
2005-04-21 12:47:17 +00:00
|
|
|
{
|
2005-04-21 15:13:51 +00:00
|
|
|
return almanac_mask().is_date_void(cdate);
|
2005-04-21 12:47:17 +00:00
|
|
|
}
|
|
|
|
|
2005-04-18 15:31:21 +00:00
|
|
|
void TAlmanac_field::set_selected_day(int nday)
|
|
|
|
{
|
2005-04-21 12:47:17 +00:00
|
|
|
if(nday>=1 && nday<=TDate::last_day(_selecteddate.month(),_selecteddate.year()))
|
|
|
|
_selecteddate.set_day(nday);
|
|
|
|
almanac_win().force_update();
|
2005-04-18 15:31:21 +00:00
|
|
|
}
|
|
|
|
|
2005-04-21 12:47:17 +00:00
|
|
|
void TAlmanac_field::move_selected_day(int ddays)
|
2005-04-18 15:31:21 +00:00
|
|
|
{
|
2005-04-21 12:47:17 +00:00
|
|
|
_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();
|
2005-04-18 15:31:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// 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();
|
|
|
|
|
2005-04-21 12:47:17 +00:00
|
|
|
cdate = almanac_fld().selected_date();
|
2005-04-18 15:31:21 +00:00
|
|
|
cdate.set_day(1);
|
|
|
|
|
|
|
|
rct_w = ((rct.right - rct.left) / 9);
|
|
|
|
rct_h = ((rct.bottom - rct.top) / 9);
|
|
|
|
pad = - almanac_fld().padding();
|
|
|
|
row = 3;
|
|
|
|
|
2005-04-21 15:13:51 +00:00
|
|
|
if (almanac_fld().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);
|
|
|
|
}
|
|
|
|
|
2005-04-18 15:31:21 +00:00
|
|
|
set_color(COLOR_GRAY, COLOR_LTGRAY);
|
|
|
|
|
|
|
|
while (!cdate.is_end_month())
|
|
|
|
{
|
2005-04-21 15:13:51 +00:00
|
|
|
if (almanac_fld().is_date_void(cdate))
|
2005-04-18 15:31:21 +00:00
|
|
|
col_b=COLOR_LTGRAY;
|
2005-04-21 15:13:51 +00:00
|
|
|
else
|
|
|
|
col_b=COLOR_YELLOW;
|
2005-04-18 15:31:21 +00:00
|
|
|
|
|
|
|
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:
|
|
|
|
{
|
2005-04-21 12:47:17 +00:00
|
|
|
cdate = almanac_fld().selected_date();
|
2005-04-18 15:31:21 +00:00
|
|
|
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());
|
|
|
|
|
2005-04-21 12:47:17 +00:00
|
|
|
if (delta>=1&&delta<=TDate::last_day(almanac_fld().selected_date().month(),almanac_fld().selected_date().year()))
|
2005-04-18 15:31:21 +00:00
|
|
|
{
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|