mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
implement date accelerators
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@425 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
87e2ac2d97
commit
2b0e78ed57
@ -14,7 +14,8 @@ INCLPATH = -I/usr/include \
|
|||||||
|
|
||||||
CFLAGS = -g -DCELL_WIDGETS=1
|
CFLAGS = -g -DCELL_WIDGETS=1
|
||||||
LFLAGS = -O2
|
LFLAGS = -O2
|
||||||
LIBS = -lXpm -lXm -lXmu -lXt -lXext -lSM -lICE -lX11 -lpng -ljpeg -lz -lm
|
# LIBS = -lXpm -lXm -lXmu -lXt -lXext -lSM -lICE -lX11 -lm -lefence
|
||||||
|
LIBS = -lXpm -lXm -lXmu -lXt -lXext -lSM -lICE -lX11 -lm
|
||||||
LIBPATH = -L/lib -L/usr/lib -L/usr/X11R6/lib/.
|
LIBPATH = -L/lib -L/usr/lib -L/usr/X11R6/lib/.
|
||||||
TARGET = demo
|
TARGET = demo
|
||||||
STATIC = xacc-static
|
STATIC = xacc-static
|
||||||
|
@ -65,6 +65,60 @@ void xaccParseDate (struct tm *parsed, const char * datestr)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ================================================ */
|
||||||
|
/* february default is 28, and patched below */
|
||||||
|
static
|
||||||
|
char days_in_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
|
||||||
|
|
||||||
|
/* ================================================ */
|
||||||
|
|
||||||
|
static void
|
||||||
|
xaccValidateDate (struct tm *date, int recur)
|
||||||
|
{
|
||||||
|
int day, month, year;
|
||||||
|
|
||||||
|
/* avoid infinite recursion */
|
||||||
|
if (1 < recur) return;
|
||||||
|
|
||||||
|
day = date->tm_mday;
|
||||||
|
month = date->tm_mon + 1;
|
||||||
|
year = date->tm_year + 1900;
|
||||||
|
|
||||||
|
/* adjust days in february for leap year */
|
||||||
|
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
|
||||||
|
days_in_month[1] = 29;
|
||||||
|
} else {
|
||||||
|
days_in_month[1] = 28;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the "% 12" business is because month might not be valid!*/
|
||||||
|
|
||||||
|
while (day > days_in_month[(month+11) % 12]) {
|
||||||
|
day -= days_in_month[(month+11) % 12];
|
||||||
|
month++;
|
||||||
|
}
|
||||||
|
while (day < 1) {
|
||||||
|
month--;
|
||||||
|
day += days_in_month[(month+11) % 12];
|
||||||
|
}
|
||||||
|
while (month > 12) {
|
||||||
|
month -= 12;
|
||||||
|
year++;
|
||||||
|
}
|
||||||
|
while (month < 1) {
|
||||||
|
month += 12;
|
||||||
|
year--;
|
||||||
|
}
|
||||||
|
|
||||||
|
date->tm_mday = day;
|
||||||
|
date->tm_mon = month - 1;
|
||||||
|
date->tm_year = year - 1900;
|
||||||
|
|
||||||
|
/* do it again, in case leap-year scrolling messed things up */
|
||||||
|
xaccValidateDate (date, ++recur);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ================================================ */
|
/* ================================================ */
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
@ -72,15 +126,10 @@ DateEnter (struct _SingleCell *_cell, const char * curr)
|
|||||||
{
|
{
|
||||||
DateCell *cell = (DateCell *) _cell;
|
DateCell *cell = (DateCell *) _cell;
|
||||||
|
|
||||||
/* OK, we just entered a newval cell. Find out
|
/* OK, we just entered a new cell. Find out
|
||||||
* what date that cell thinks it has.
|
* what date that cell thinks it has. */
|
||||||
*/
|
|
||||||
|
|
||||||
xaccParseDate (&(cell->date), curr);
|
xaccParseDate (&(cell->date), curr);
|
||||||
|
|
||||||
printf ("parse %d %d %d \n", cell->date.tm_mday, cell->date.tm_mon+1,
|
|
||||||
cell->date.tm_year+1900);
|
|
||||||
|
|
||||||
return curr;
|
return curr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,15 +137,15 @@ cell->date.tm_year+1900);
|
|||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
DateMV (struct _SingleCell *_cell,
|
DateMV (struct _SingleCell *_cell,
|
||||||
const char * oldval,
|
const char *oldval,
|
||||||
const char *change,
|
const char *change,
|
||||||
const char *newval)
|
const char *newval)
|
||||||
{
|
{
|
||||||
DateCell *cell = (DateCell *) _cell;
|
DateCell *cell = (DateCell *) _cell;
|
||||||
|
struct tm *date;
|
||||||
|
char buff[30];
|
||||||
|
char *datestr;
|
||||||
int accel=0;
|
int accel=0;
|
||||||
short day, month, year;
|
|
||||||
char * datestr;
|
|
||||||
char * sep;
|
|
||||||
|
|
||||||
/* if user hit backspace, accept the change */
|
/* if user hit backspace, accept the change */
|
||||||
if (!change) return newval;
|
if (!change) return newval;
|
||||||
@ -107,53 +156,104 @@ DateMV (struct _SingleCell *_cell,
|
|||||||
/* accept the separator character */
|
/* accept the separator character */
|
||||||
if (DATE_SEP == change[0]) return newval;
|
if (DATE_SEP == change[0]) return newval;
|
||||||
|
|
||||||
/* otherwise, maybe its an accelerator key.
|
/* otherwise, maybe its an accelerator key. */
|
||||||
* parse the date string */
|
date = &(cell->date);
|
||||||
day = 1;
|
|
||||||
month = 1;
|
|
||||||
year = 1970;
|
|
||||||
|
|
||||||
sscanf (newval, "%d/%d/%d", day, month, year);
|
|
||||||
|
|
||||||
printf ("parsed %d %d %d \n", day, month, year);
|
|
||||||
|
|
||||||
/* handle accelerator keys */
|
/* handle accelerator keys */
|
||||||
switch (change[0]) {
|
switch (change[0]) {
|
||||||
case '+':
|
case '+':
|
||||||
case '=':
|
case '=':
|
||||||
|
/* increment day */
|
||||||
|
date->tm_mday ++;
|
||||||
accel = 1;
|
accel = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case '_':
|
||||||
|
case '-':
|
||||||
|
/* decrement day */
|
||||||
|
date->tm_mday --;
|
||||||
|
accel = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '}':
|
||||||
|
case ']':
|
||||||
|
/* increment month */
|
||||||
|
date->tm_mon ++;
|
||||||
|
accel = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '{':
|
||||||
|
case '[':
|
||||||
|
/* decrment month */
|
||||||
|
date->tm_mon --;
|
||||||
|
accel = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'M':
|
||||||
|
case 'm':
|
||||||
|
/* begining of month */
|
||||||
|
date->tm_mday = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
case 'h':
|
||||||
|
/* end of month */
|
||||||
|
date->tm_mday = days_in_month[date->tm_mon];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
/* begining of year */
|
||||||
|
date->tm_mday = 1;
|
||||||
|
date->tm_mon = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'R':
|
||||||
|
case 'r':
|
||||||
|
/* end of year */
|
||||||
|
date->tm_mday = 31;
|
||||||
|
date->tm_mon = 11;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'T':
|
||||||
|
case 't': {
|
||||||
|
/* today */
|
||||||
|
time_t secs;
|
||||||
|
struct tm *now;
|
||||||
|
|
||||||
|
time (&secs);
|
||||||
|
now = localtime (&secs);
|
||||||
|
*date = *now;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* accept any numeric input */
|
/* reject other changes */
|
||||||
if (isdigit (change[0])) return newval;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (accel) {
|
if (accel) {
|
||||||
|
xaccValidateDate (date, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return newval;
|
sprintf (buff, "%d/%d/%d", date->tm_mday,
|
||||||
|
date->tm_mon+1,
|
||||||
|
date->tm_year+1900);
|
||||||
|
datestr = strdup (buff);
|
||||||
|
|
||||||
|
return datestr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================ */
|
/* ================================================ */
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
DateLeave (const char * curr)
|
DateLeave (struct _SingleCell *_cell, const char * curr)
|
||||||
{
|
{
|
||||||
short day, month, year;
|
DateCell *cell = (DateCell *) _cell;
|
||||||
char * datestr;
|
|
||||||
char * sep;
|
|
||||||
|
|
||||||
/* otherwise, maybe its an accelerator key.
|
|
||||||
* parse the date string */
|
|
||||||
day = 1;
|
|
||||||
month = 1;
|
|
||||||
year = 1970;
|
|
||||||
|
|
||||||
sscanf (curr, "%d/%d/%d", day, month, year);
|
|
||||||
|
|
||||||
printf ("leave parsed %d %d %d \n", day, month, year);
|
|
||||||
|
|
||||||
|
/* OK, we are leaving the cell. Find out
|
||||||
|
* what date that cell thinks it has. */
|
||||||
|
xaccParseDate (&(cell->date), curr);
|
||||||
|
|
||||||
return curr;
|
return curr;
|
||||||
}
|
}
|
||||||
@ -191,6 +291,7 @@ xaccInitDateCell (DateCell *cell)
|
|||||||
|
|
||||||
cell->cell.enter_cell = DateEnter;
|
cell->cell.enter_cell = DateEnter;
|
||||||
cell->cell.modify_verify = DateMV;
|
cell->cell.modify_verify = DateMV;
|
||||||
|
cell->cell.leave_cell = DateLeave;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------- end of file ---------------------- */
|
/* --------------- end of file ---------------------- */
|
||||||
|
@ -72,7 +72,7 @@ void xaccInitBasicRegister (BasicRegister *reg)
|
|||||||
reg->header = header;
|
reg->header = header;
|
||||||
|
|
||||||
cell = (SingleCell *) xaccMallocDateCell();
|
cell = (SingleCell *) xaccMallocDateCell();
|
||||||
cell->width = 9;
|
cell->width = 11;
|
||||||
xaccAddCell (header, cell, 0, DATE_CELL_C);
|
xaccAddCell (header, cell, 0, DATE_CELL_C);
|
||||||
xaccSetSingleCellValue (cell, "Date");
|
xaccSetSingleCellValue (cell, "Date");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user