Corretto destinatario TMessage
MOdificati sheet in modo da gestire meglio perdita e guadagno del focus Tolta isspace dalle TString e messa is_space git-svn-id: svn://10.65.10.50/trunk@869 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
4510dcba25
commit
0a93dba34d
@ -130,9 +130,9 @@ void TBanner::handler(WINDOW win, EVENT* ep)
|
||||
|
||||
r.left += 4; r.right -= 4;
|
||||
r.top += 4; r.bottom -= 4;
|
||||
set_pen(COLOR_BLACK); win_draw_rect(win, &r);
|
||||
offset_rect(&r, 1, 1);
|
||||
set_pen(COLOR_WHITE); win_draw_rect(win, &r);
|
||||
offset_rect(&r, -1, -1);
|
||||
set_pen(COLOR_BLACK); win_draw_rect(win, &r);
|
||||
|
||||
win_draw_icon(win, CHARX<<1, CHARX<<1, ICON_RSRC);
|
||||
}
|
||||
@ -650,10 +650,7 @@ void TApplication::set_cursor(bool w)
|
||||
else
|
||||
{
|
||||
_count--;
|
||||
#ifdef DBG
|
||||
if (_count < 0)
|
||||
yesnofatal_box("end_wait without matching begin_wait");
|
||||
#endif
|
||||
CHECK(_count >= 0, "end_wait without matching begin_wait");
|
||||
if (_count == 0)
|
||||
::set_cursor(ww, CURSOR_ARROW);
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ TString& TConfig::get(const char* var, const char* section, int index, const cha
|
||||
{
|
||||
// ritorna valore di variabile nella sezione corrente o in
|
||||
// quella specificata
|
||||
static TFixed_string s(__tmp_string, 256);
|
||||
static TFixed_string s(&__tmp_string[256], 256);
|
||||
TString80 vvar(var); if (index != -1) vvar << '(' << index << ')';
|
||||
|
||||
_check_paragraph(section);
|
||||
|
@ -689,7 +689,6 @@ int TLocalisamfile::open(unsigned int mode)
|
||||
err = _open();
|
||||
_was_open = TRUE;
|
||||
}
|
||||
_isatab = FALSE;
|
||||
setstatus(err);
|
||||
return err;
|
||||
}
|
||||
|
@ -379,7 +379,6 @@ class TLocalisamfile : public TBaseisamfile
|
||||
{
|
||||
// @DPRIV
|
||||
bool _was_open; // Vero se il file e' stato aperto come Localisamfile
|
||||
bool _isatab; // Vero se il file e' una tabella
|
||||
int _oldkey; // Old key if already open
|
||||
|
||||
public:
|
||||
|
@ -1,4 +1,4 @@
|
||||
// $Id: mailbox.cpp,v 1.10 1994-12-15 18:06:18 guy Exp $
|
||||
// $Id: mailbox.cpp,v 1.11 1995-01-16 15:10:23 guy Exp $
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <fstream.h>
|
||||
@ -18,10 +18,11 @@
|
||||
|
||||
TMessage::TMessage(const char* to, const char* sub,
|
||||
const char* text, const char* from)
|
||||
{
|
||||
_to = to;
|
||||
if (to && *to && (_to.len() != 6 || _to.strip(" -") != to))
|
||||
_to = cmd2name(to);
|
||||
{
|
||||
TString80 rec(to);
|
||||
if (rec.not_empty() && (rec.len() != 6 || rec.strip(" -") != to))
|
||||
rec = cmd2name(to);
|
||||
_to = rec;
|
||||
_subject = sub;
|
||||
_text = text;
|
||||
_from = (from == NULL || *from == '\0') ? main_app().name() : from;
|
||||
|
@ -1,4 +1,4 @@
|
||||
// $Id: mailbox.h,v 1.4 1994-10-24 15:06:27 guy Exp $
|
||||
// $Id: mailbox.h,v 1.5 1995-01-16 15:10:24 guy Exp $
|
||||
|
||||
/* si', trattasi di -*-c++-*- */
|
||||
// Mailbox.h
|
||||
@ -7,10 +7,6 @@
|
||||
#ifndef __MAILBOX_H
|
||||
#define __MAILBOX_H
|
||||
|
||||
#ifndef __ARRAY_H
|
||||
#include <array.h>
|
||||
#endif
|
||||
|
||||
#ifndef __STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
|
@ -25,12 +25,12 @@ bool TMask::test_focus_change(WINDOW next)
|
||||
|
||||
TMask_field& prev = fld(_focus);
|
||||
if (prev.win() != next)
|
||||
{
|
||||
if (prev.on_key(K_TAB) == FALSE) // Test if previous field agrees ...
|
||||
{
|
||||
ok = prev.test_focus_change();
|
||||
if (!ok) // Test if previous field agrees ...
|
||||
{
|
||||
set_focus();
|
||||
prev.set_focusdirty(FALSE);
|
||||
ok = FALSE; // ... sorry, it does not
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
@ -132,11 +132,17 @@ void TMask::handler(WINDOW win, EVENT* ep)
|
||||
switch(ep->v.ctl.id)
|
||||
{
|
||||
case DLG_OK:
|
||||
if (test_focus_change()) stop_run(K_AUTO_ENTER); break;
|
||||
if (test_focus_change(ep->v.ctl.ci.win))
|
||||
stop_run(K_AUTO_ENTER);
|
||||
break;
|
||||
case DLG_CANCEL :
|
||||
stop_run(K_ESC); break;
|
||||
if (test_focus_change(ep->v.ctl.ci.win))
|
||||
stop_run(K_ESC);
|
||||
break;
|
||||
case DLG_QUIT :
|
||||
stop_run(K_FORCE_CLOSE); break;
|
||||
if (test_focus_change(ep->v.ctl.ci.win))
|
||||
stop_run(K_FORCE_CLOSE);
|
||||
break;
|
||||
case DLG_F9:
|
||||
{
|
||||
WINDOW w = ep->v.ctl.ci.win;
|
||||
|
@ -1,4 +1,4 @@
|
||||
// $Id: maskfld.cpp,v 1.67 1995-01-05 17:50:24 guy Exp $
|
||||
// $Id: maskfld.cpp,v 1.68 1995-01-16 15:10:31 guy Exp $
|
||||
#include <xvt.h>
|
||||
|
||||
#include <applicat.h>
|
||||
@ -457,7 +457,7 @@ void TMask_field::set_prompt(const char* p)
|
||||
|
||||
|
||||
void TMask_field::set(const char* s)
|
||||
{
|
||||
{
|
||||
if (mask().is_running())
|
||||
{
|
||||
set_window_data(s);
|
||||
@ -722,6 +722,15 @@ bool TMask_field::do_message(int num)
|
||||
}
|
||||
|
||||
|
||||
bool TMask_field::test_focus_change()
|
||||
{
|
||||
bool ok = TRUE;
|
||||
if (focusdirty())
|
||||
ok = on_key(K_TAB);
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
// Certified 90%
|
||||
bool TMask_field::on_hit()
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $Id: maskfld.h,v 1.19 1994-12-30 10:11:11 villa Exp $ */
|
||||
/* $Id: maskfld.h,v 1.20 1995-01-16 15:10:36 guy Exp $ */
|
||||
#ifndef __MASKFLD_H
|
||||
#define __MASKFLD_H
|
||||
|
||||
@ -121,6 +121,7 @@ public:
|
||||
bool focusdirty() const { return _flags.focusdirty; }
|
||||
void set_focusdirty(bool d = TRUE) { _flags.focusdirty = d; }
|
||||
void set_dirty(bool d = TRUE);
|
||||
void set_justify(bool r) { _flags.rightjust = r; }
|
||||
|
||||
virtual const char* class_name() const;
|
||||
virtual word class_id() const;
|
||||
@ -159,9 +160,10 @@ public:
|
||||
|
||||
bool is_edit() const;
|
||||
bool to_check(KEY k, bool checkrun = FALSE) const;
|
||||
|
||||
|
||||
virtual bool on_hit();
|
||||
virtual bool on_key(KEY key);
|
||||
virtual bool test_focus_change();
|
||||
|
||||
void set(const char* s);
|
||||
TString& get() const;
|
||||
|
@ -96,6 +96,7 @@ public:
|
||||
void set_dirty(bool spork = TRUE) { _owner->set_dirty(spork); }
|
||||
|
||||
bool active() const { return _active; }
|
||||
bool test_focus_change();
|
||||
|
||||
void set_notify(SPREADSHEET_NOTIFY n) { _notify = n; }
|
||||
|
||||
@ -363,11 +364,19 @@ void TSpreadsheet::update_rec(int rec)
|
||||
|
||||
void TSpreadsheet::set_focus_cell(int riga, int colonna)
|
||||
{
|
||||
set_front_window(win()); // It seems necessary to make xi_set_focus work properly
|
||||
set_front_window(win()); // It seems necessary
|
||||
const int r = rec2row(riga);
|
||||
XI_OBJ cell;
|
||||
XI_MAKE_CELL(&cell, _list, r, colonna);
|
||||
xi_set_focus(&cell);
|
||||
|
||||
for (; colonna < _columns; colonna++)
|
||||
if (!cell_disabled(r, colonna-1))
|
||||
break;
|
||||
|
||||
if (colonna < _columns)
|
||||
{
|
||||
XI_OBJ cell;
|
||||
XI_MAKE_CELL(&cell, _list, r, colonna);
|
||||
xi_set_focus(&cell);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -428,10 +437,23 @@ void TSpreadsheet::notify_change()
|
||||
{
|
||||
notify(_cur_rec, K_SPACE);
|
||||
_row_dirty = TRUE;
|
||||
set_dirty();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool TSpreadsheet::test_focus_change()
|
||||
{
|
||||
bool ok = dirty() != 3;
|
||||
if (ok && _row_dirty)
|
||||
{
|
||||
str2mask(selected());
|
||||
ok = sheet_mask().check_fields();
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
void TSpreadsheet::xiev_handler(XI_OBJ *itf, XI_EVENT *xiev)
|
||||
{
|
||||
TSpreadsheet* es = (TSpreadsheet*)xi_get_app_data(itf);
|
||||
@ -439,6 +461,7 @@ void TSpreadsheet::xiev_handler(XI_OBJ *itf, XI_EVENT *xiev)
|
||||
es->list_handler(xiev);
|
||||
}
|
||||
|
||||
|
||||
// Certified 75%
|
||||
void TSpreadsheet::list_handler(XI_EVENT *xiev)
|
||||
{
|
||||
@ -448,340 +471,332 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
|
||||
switch (xiev->type)
|
||||
{
|
||||
case XIE_GET_FIRST:
|
||||
{
|
||||
const long max = items();
|
||||
if (max > 0L)
|
||||
if (items() > 0L)
|
||||
{
|
||||
long n = max * (long)xiev->v.rec_request.percent / 100L;
|
||||
long n = items() * (long)xiev->v.rec_request.percent / 100L;
|
||||
if (n < 0L) n = 0L;
|
||||
xiev->v.rec_request.data_rec = n;
|
||||
}
|
||||
else
|
||||
xiev->refused = TRUE;
|
||||
}
|
||||
break;
|
||||
case XIE_GET_LAST:
|
||||
xiev->v.rec_request.data_rec = items()-1;
|
||||
break;
|
||||
case XIE_GET_PREV:
|
||||
case XIE_GET_NEXT:
|
||||
{
|
||||
const long n = xiev->v.rec_request.spec_rec + (xiev->type == XIE_GET_NEXT ? +1 : -1) ;
|
||||
if (n < 0 || n >= items())
|
||||
xiev->refused = TRUE;
|
||||
else
|
||||
xiev->v.rec_request.data_rec = n;
|
||||
}
|
||||
break;
|
||||
case XIE_CELL_REQUEST:
|
||||
{
|
||||
const int rec = (int)xiev->v.cell_request.rec;
|
||||
const char* src = NULL;
|
||||
int nm;
|
||||
XI_OBJ** obj = xi_get_member_list(xiev->v.cell_request.list, &nm);
|
||||
const int num = xiev->v.cell_request.col_nbr;
|
||||
const int cid = obj[num]->cid;
|
||||
|
||||
if (cid >= FIRST_FIELD)
|
||||
break;
|
||||
case XIE_GET_LAST:
|
||||
xiev->v.rec_request.data_rec = items()-1;
|
||||
break;
|
||||
case XIE_GET_PREV:
|
||||
case XIE_GET_NEXT:
|
||||
{
|
||||
if (rec < items())
|
||||
{
|
||||
const int col = cid - FIRST_FIELD;
|
||||
TMask_field* f = field(cid);
|
||||
const int acqua = f->class_id();
|
||||
const long n = xiev->v.rec_request.spec_rec + (xiev->type == XIE_GET_NEXT ? +1 : -1) ;
|
||||
if (n < 0 || n >= items())
|
||||
xiev->refused = TRUE;
|
||||
else
|
||||
xiev->v.rec_request.data_rec = n;
|
||||
}
|
||||
break;
|
||||
case XIE_CELL_REQUEST:
|
||||
{
|
||||
const int rec = (int)xiev->v.cell_request.rec;
|
||||
const char* src = NULL;
|
||||
int nm;
|
||||
XI_OBJ** obj = xi_get_member_list(xiev->v.cell_request.list, &nm);
|
||||
const int num = xiev->v.cell_request.col_nbr;
|
||||
const int cid = obj[num]->cid;
|
||||
|
||||
if (cid >= FIRST_FIELD)
|
||||
{
|
||||
if (rec < items())
|
||||
{
|
||||
const int col = cid - FIRST_FIELD;
|
||||
TMask_field* f = field(cid);
|
||||
const int acqua = f->class_id();
|
||||
|
||||
if (acqua == CLASS_BUTTON_FIELD)
|
||||
{
|
||||
if (isdigit(_button[0]))
|
||||
xiev->v.cell_request.icon_rid = atoi(_button);
|
||||
else
|
||||
src = _button;
|
||||
}
|
||||
else
|
||||
{
|
||||
src = row(rec).get(col); // Set value for cell
|
||||
if (src && *src && f->is_edit())
|
||||
{
|
||||
src = f->picture_data(src, FALSE); // Get formatted string
|
||||
}
|
||||
if (field(cid)->has_query())
|
||||
{
|
||||
xiev->v.cell_request.button =
|
||||
xiev->v.cell_request.button_on_focus = TRUE;
|
||||
}
|
||||
if (cell_disabled(rec, col))
|
||||
xiev->v.cell_request.back_color = DISABLED_BACK_COLOR;
|
||||
}
|
||||
}
|
||||
} else src = format("%d", rec+1);
|
||||
|
||||
const int len = xiev->v.cell_request.len;
|
||||
char* dst = xiev->v.cell_request.s;
|
||||
if (src)
|
||||
strncpy(dst, src, len);
|
||||
else
|
||||
*dst = '\0';
|
||||
}
|
||||
break;
|
||||
case XIE_CHG_CELL:
|
||||
notify_change();
|
||||
_cell_dirty = TRUE;
|
||||
break;
|
||||
case XIE_BUTTON:
|
||||
if (xiev->v.xi_obj->type == XIT_CELL)
|
||||
dispatch_e_char(win(), K_F9);
|
||||
else
|
||||
if (xiev->v.xi_obj->type == XIT_LIST)
|
||||
insert(-1);
|
||||
break;
|
||||
case XIE_SELECT:
|
||||
if (xiev->v.xi_obj->type == XIT_ROW)
|
||||
{
|
||||
_check_enabled = FALSE;
|
||||
|
||||
if (acqua == CLASS_BUTTON_FIELD)
|
||||
{
|
||||
if (isdigit(_button[0]))
|
||||
xiev->v.cell_request.icon_rid = atoi(_button);
|
||||
else
|
||||
src = _button;
|
||||
const int oldrec = _cur_rec;
|
||||
set_pos(xiev->v.select.xi_obj->v.row, xiev->v.select.column);
|
||||
if (oldrec != _cur_rec)
|
||||
{
|
||||
str2mask(_cur_rec);
|
||||
_row_dirty = FALSE;
|
||||
}
|
||||
|
||||
update(_cur_rec);
|
||||
|
||||
TMask_field* button = col2field(_cur_col);
|
||||
notify_change();
|
||||
button->on_hit();
|
||||
mask2str(_cur_rec);
|
||||
|
||||
_check_enabled = TRUE;
|
||||
}
|
||||
xiev->refused = TRUE;
|
||||
break;
|
||||
case XIE_DBL_CELL:
|
||||
{
|
||||
_check_enabled = FALSE;
|
||||
|
||||
const int oldrec = _cur_rec;
|
||||
set_pos(xiev->v.xi_obj->v.cell.row, xiev->v.xi_obj->v.cell.column);
|
||||
|
||||
if (oldrec != _cur_rec || !_row_dirty)
|
||||
{
|
||||
_row_dirty = FALSE;
|
||||
notify_change();
|
||||
}
|
||||
const KEY k = edit(_cur_rec);
|
||||
if (k == K_ENTER)
|
||||
{
|
||||
update_rec(_cur_rec);
|
||||
_row_dirty = TRUE;
|
||||
}
|
||||
|
||||
if (!cell_disabled(_cur_rec, _cur_col-1))
|
||||
set_focus_cell(_cur_row, _cur_col);
|
||||
_check_enabled = TRUE;
|
||||
}
|
||||
break;
|
||||
case XIE_ON_LIST:
|
||||
if (_firstfocus) // Trick to avoid the sheet to keep the focus forever ...
|
||||
{ // .. it costed me two day worth of hard work!
|
||||
xiev->refused = TRUE;
|
||||
_firstfocus = FALSE;
|
||||
}
|
||||
else
|
||||
mask().set_focus_win(win(), FALSE);
|
||||
break;
|
||||
case XIE_OFF_LIST:
|
||||
break;
|
||||
case XIE_ON_ROW:
|
||||
if (_check_enabled)
|
||||
{
|
||||
set_pos(xiev->v.xi_obj->v.row, _cur_col);
|
||||
if (_cur_rec < items())
|
||||
{
|
||||
str2mask(_cur_rec);
|
||||
_row_dirty = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
src = row(rec).get(col); // Set value for cell
|
||||
if (src && *src && f->is_edit())
|
||||
{
|
||||
src = f->picture_data(src, FALSE); // Get formatted string
|
||||
}
|
||||
if (field(cid)->has_query())
|
||||
{
|
||||
xiev->v.cell_request.button =
|
||||
xiev->v.cell_request.button_on_focus = TRUE;
|
||||
}
|
||||
if (cell_disabled(rec, col))
|
||||
xiev->v.cell_request.back_color = DISABLED_BACK_COLOR;
|
||||
}
|
||||
}
|
||||
} else src = format("%d", rec+1);
|
||||
|
||||
const int len = xiev->v.cell_request.len;
|
||||
char* dst = xiev->v.cell_request.s;
|
||||
if (src)
|
||||
{
|
||||
strncpy(dst, src, len);
|
||||
// if (isspace(*dst)) { TFixed_string d(dst); d.ltrim(); } TBR
|
||||
}
|
||||
else
|
||||
*dst = '\0';
|
||||
}
|
||||
break;
|
||||
case XIE_CHG_CELL:
|
||||
notify_change();
|
||||
_cell_dirty = TRUE;
|
||||
break;
|
||||
case XIE_BUTTON:
|
||||
if (xiev->v.xi_obj->type == XIT_CELL)
|
||||
dispatch_e_char(win(), K_F9);
|
||||
else
|
||||
if (xiev->v.xi_obj->type == XIT_LIST)
|
||||
insert(-1);
|
||||
break;
|
||||
case XIE_SELECT:
|
||||
if (xiev->v.xi_obj->type == XIT_ROW)
|
||||
{
|
||||
_check_enabled = FALSE;
|
||||
|
||||
const int oldrec = _cur_rec;
|
||||
set_pos(xiev->v.select.xi_obj->v.row, xiev->v.select.column);
|
||||
if (oldrec != _cur_rec)
|
||||
{
|
||||
str2mask(_cur_rec);
|
||||
_row_dirty = FALSE;
|
||||
}
|
||||
|
||||
update(_cur_rec);
|
||||
|
||||
TMask_field* button = col2field(_cur_col);
|
||||
notify_change();
|
||||
button->on_hit();
|
||||
mask2str(_cur_rec);
|
||||
|
||||
_check_enabled = TRUE;
|
||||
}
|
||||
xiev->refused = TRUE;
|
||||
break;
|
||||
case XIE_DBL_CELL:
|
||||
{
|
||||
_check_enabled = FALSE;
|
||||
|
||||
const int oldrec = _cur_rec;
|
||||
set_pos(xiev->v.xi_obj->v.cell.row, xiev->v.xi_obj->v.cell.column);
|
||||
|
||||
if (oldrec != _cur_rec || !_row_dirty)
|
||||
{
|
||||
_row_dirty = FALSE;
|
||||
notify_change();
|
||||
}
|
||||
const KEY k = edit(_cur_rec);
|
||||
if (k == K_ENTER)
|
||||
{
|
||||
update_rec(_cur_rec);
|
||||
_row_dirty = TRUE;
|
||||
}
|
||||
|
||||
if (!cell_disabled(_cur_rec, _cur_col))
|
||||
set_focus_cell(_cur_row, _cur_col);
|
||||
_check_enabled = TRUE;
|
||||
}
|
||||
break;
|
||||
case XIE_ON_LIST:
|
||||
if (_firstfocus) // Trick to avoid the sheet to keep the focus forever ...
|
||||
{ // .. it costed me two day worth of hard work!
|
||||
xiev->refused = TRUE;
|
||||
_firstfocus = FALSE;
|
||||
}
|
||||
else
|
||||
mask().set_focus_win(win(), FALSE);
|
||||
break;
|
||||
case XIE_OFF_LIST:
|
||||
break;
|
||||
case XIE_ON_ROW:
|
||||
if (_check_enabled)
|
||||
{
|
||||
set_pos(xiev->v.xi_obj->v.row, _cur_col);
|
||||
if (_cur_rec < items())
|
||||
{
|
||||
str2mask(_cur_rec);
|
||||
_row_dirty = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
_cur_row = _cur_rec = 0;
|
||||
xiev->refused = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case XIE_OFF_ROW:
|
||||
if (_row_dirty && _check_enabled)
|
||||
{
|
||||
_check_enabled = FALSE; // Avoid recursion!
|
||||
str2mask(_cur_rec); // It shouldn't have to be necessary
|
||||
bool ok = sheet_mask().check_fields();
|
||||
if (ok)
|
||||
{
|
||||
mask2str(_cur_rec);
|
||||
ok = notify(_cur_rec, K_ENTER); // Notify edit
|
||||
}
|
||||
if (!ok)
|
||||
{
|
||||
xiev->refused = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
set_dirty();
|
||||
xvt_statbar_refresh();
|
||||
}
|
||||
_check_enabled = TRUE;
|
||||
}
|
||||
break;
|
||||
case XIE_ON_CELL:
|
||||
if (_check_enabled)
|
||||
{
|
||||
TMask_field* f = cell2field(xiev->v.xi_obj);
|
||||
const int col = (f->dlg()-FIRST_FIELD) % 100;
|
||||
if (cell_disabled(_cur_rec, col)) // If the cell is disabled ...
|
||||
{
|
||||
dispatch_e_char(win(), _lastab); // ... skip to the next one.
|
||||
}
|
||||
else
|
||||
{
|
||||
_edit_field = f;
|
||||
_cur_col = xiev->v.xi_obj->v.cell.column;
|
||||
_cell_dirty = FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case XIE_OFF_CELL:
|
||||
if (_edit_field && _check_enabled)
|
||||
{
|
||||
_check_enabled = FALSE;
|
||||
if (_cell_dirty)
|
||||
{
|
||||
TMask_field* c = _edit_field; // Save field, it could turn out to be NULL on error
|
||||
const char* nuo = c->picture_data(xi_get_text(xiev->v.xi_obj, NULL, -1), TRUE);
|
||||
c->set(nuo); // Set new mask value
|
||||
c->set_dirty(); // Get it dirty!
|
||||
if (c->on_key(c->is_edit() ? K_TAB : K_SPACE) == FALSE) // Test it
|
||||
{
|
||||
xiev->refused = *nuo != '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
mask2str(_cur_rec); // Update sheet row
|
||||
_edit_field = NULL; // Reset current field
|
||||
}
|
||||
}
|
||||
_check_enabled = TRUE;
|
||||
}
|
||||
break;
|
||||
case XIE_GET_PERCENT:
|
||||
{
|
||||
const long rec = xiev->v.get_percent.record;
|
||||
long n = items(); if (n < 1) n = 1;
|
||||
xiev->v.get_percent.percent = int(rec * 100L / n);
|
||||
}
|
||||
break;
|
||||
case XIE_CLEANUP:
|
||||
break;
|
||||
case XIE_XVT_EVENT:
|
||||
{
|
||||
EVENT* ep = &xiev->v.xvte;
|
||||
switch (ep->type)
|
||||
{
|
||||
case E_FOCUS:
|
||||
if (_check_enabled && ep->v.active == FALSE)
|
||||
{
|
||||
const bool ok = (bool)xi_move_focus(_itf);
|
||||
if (!ok)
|
||||
{
|
||||
set_dirty(3);
|
||||
_cur_row = _cur_rec = 0;
|
||||
xiev->refused = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case E_CHAR:
|
||||
if (_edit_field)
|
||||
case XIE_OFF_ROW:
|
||||
if (_row_dirty && _check_enabled)
|
||||
{
|
||||
const KEY k = e_char_to_key(ep);
|
||||
switch(k)
|
||||
_check_enabled = FALSE; // Avoid recursion!
|
||||
str2mask(_cur_rec); // It shouldn't have to be necessary
|
||||
bool ok = sheet_mask().check_fields();
|
||||
if (ok)
|
||||
{
|
||||
mask2str(_cur_rec);
|
||||
ok = notify(_cur_rec, K_ENTER); // Notify edit
|
||||
}
|
||||
if (!ok)
|
||||
xiev->refused = TRUE;
|
||||
else
|
||||
xvt_statbar_refresh();
|
||||
|
||||
_check_enabled = TRUE;
|
||||
}
|
||||
break;
|
||||
case XIE_ON_CELL:
|
||||
if (_check_enabled)
|
||||
{
|
||||
TMask_field* f = cell2field(xiev->v.xi_obj);
|
||||
const int col = (f->dlg()-FIRST_FIELD) % 100;
|
||||
if (cell_disabled(_cur_rec, col)) // If the cell is disabled ...
|
||||
{
|
||||
dispatch_e_char(win(), _lastab); // ... skip to the next one.
|
||||
}
|
||||
else
|
||||
{
|
||||
_edit_field = f;
|
||||
_cur_col = xiev->v.xi_obj->v.cell.column;
|
||||
_cell_dirty = FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case XIE_OFF_CELL:
|
||||
if (_edit_field && _check_enabled)
|
||||
{
|
||||
_check_enabled = FALSE;
|
||||
if (_cell_dirty)
|
||||
{
|
||||
case K_TAB:
|
||||
case K_BTAB:
|
||||
_lastab = k;
|
||||
break;
|
||||
case K_F1:
|
||||
_check_enabled = FALSE; // Disable checks
|
||||
_edit_field->on_key(K_F1);
|
||||
set_focus_cell(_cur_row, _cur_col);
|
||||
_check_enabled = TRUE; // Enable checks
|
||||
break;
|
||||
case K_F2:
|
||||
case K_F3:
|
||||
case K_F8:
|
||||
case K_F9:
|
||||
case K_F11:
|
||||
if (_check_enabled && active())
|
||||
TMask_field* c = _edit_field; // Save field, it could turn out to be NULL on error
|
||||
const char* nuo = c->picture_data(xi_get_text(xiev->v.xi_obj, NULL, -1), TRUE);
|
||||
c->set(nuo); // Set new mask value
|
||||
c->set_dirty(); // Get it dirty!
|
||||
if (c->on_key(c->is_edit() ? K_TAB : K_SPACE) == FALSE) // Test it
|
||||
{
|
||||
xiev->refused = *nuo != '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
mask2str(_cur_rec); // Update sheet row
|
||||
_edit_field = NULL; // Reset current field
|
||||
}
|
||||
}
|
||||
_check_enabled = TRUE;
|
||||
}
|
||||
break;
|
||||
case XIE_GET_PERCENT:
|
||||
{
|
||||
const long rec = xiev->v.get_percent.record;
|
||||
long n = items(); if (n < 1) n = 1;
|
||||
xiev->v.get_percent.percent = int(rec * 100L / n);
|
||||
}
|
||||
break;
|
||||
case XIE_CLEANUP:
|
||||
break;
|
||||
case XIE_XVT_EVENT:
|
||||
{
|
||||
EVENT* ep = &xiev->v.xvte;
|
||||
switch (ep->type)
|
||||
{
|
||||
case E_FOCUS:
|
||||
if (_check_enabled && ep->v.active == FALSE)
|
||||
{
|
||||
const bool ok = (bool)xi_move_focus(_itf);
|
||||
if (!ok)
|
||||
{
|
||||
set_dirty(3);
|
||||
xiev->refused = TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case E_CHAR:
|
||||
if (_edit_field)
|
||||
{
|
||||
const KEY k = e_char_to_key(ep);
|
||||
switch(k)
|
||||
{
|
||||
case K_TAB:
|
||||
case K_BTAB:
|
||||
_lastab = k;
|
||||
break;
|
||||
case K_F1:
|
||||
_check_enabled = FALSE; // Disable checks
|
||||
notify_change();
|
||||
if (_edit_field->on_key(k))
|
||||
{
|
||||
mask2str(_cur_rec);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (k == K_F9)
|
||||
{
|
||||
_edit_field = &_mask.fld(_mask.focus_field());
|
||||
const short foca = _edit_field->dlg();
|
||||
const int col = (foca - FIRST_FIELD) % 100 +1;
|
||||
if (col > 0 && col != _cur_col)
|
||||
{
|
||||
_cur_col = col;
|
||||
dispatch_e_char(win(), K_F9);
|
||||
}
|
||||
}
|
||||
}
|
||||
_edit_field->on_key(K_F1);
|
||||
set_focus_cell(_cur_row, _cur_col);
|
||||
_check_enabled = TRUE; // Enable checks
|
||||
}
|
||||
break;
|
||||
case K_PREV:
|
||||
case K_NEXT:
|
||||
if (xi_move_focus(_itf))
|
||||
dispatch_e_char(parent(), k);
|
||||
break;
|
||||
case K_ESC:
|
||||
xi_set_focus(_itf);
|
||||
dispatch_e_char(parent(), K_ESC);
|
||||
break;
|
||||
case K_CTRL+K_PREV:
|
||||
xi_scroll(_list, XI_SCROLL_PGUP);
|
||||
break;
|
||||
case K_CTRL+K_NEXT:
|
||||
xi_scroll(_list, XI_SCROLL_PGDOWN);
|
||||
break;
|
||||
case K_CTRL+K_HOME:
|
||||
xi_scroll(_list, XI_SCROLL_FIRST);
|
||||
break;
|
||||
case K_CTRL+K_END:
|
||||
xi_scroll(_list, XI_SCROLL_LAST);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
case K_F2:
|
||||
case K_F3:
|
||||
case K_F8:
|
||||
case K_F9:
|
||||
case K_F11:
|
||||
if (_check_enabled && active())
|
||||
{
|
||||
_check_enabled = FALSE; // Disable checks
|
||||
notify_change();
|
||||
if (_edit_field->on_key(k))
|
||||
{
|
||||
mask2str(_cur_rec);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (k == K_F9)
|
||||
{
|
||||
_edit_field = &_mask.fld(_mask.focus_field());
|
||||
const short foca = _edit_field->dlg();
|
||||
const int col = (foca - FIRST_FIELD) % 100 +1;
|
||||
if (col > 0 && col != _cur_col)
|
||||
{
|
||||
_cur_col = col;
|
||||
dispatch_e_char(win(), K_F9);
|
||||
}
|
||||
}
|
||||
}
|
||||
set_focus_cell(_cur_row, _cur_col);
|
||||
_check_enabled = TRUE; // Enable checks
|
||||
}
|
||||
break;
|
||||
case K_PREV:
|
||||
case K_NEXT:
|
||||
case K_ESC:
|
||||
if (xi_move_focus(_itf))
|
||||
dispatch_e_char(parent(), k);
|
||||
break;
|
||||
case K_ENTER:
|
||||
case K_SHIFT+K_ENTER:
|
||||
if (xi_move_focus(_itf))
|
||||
dispatch_e_char(parent(), k == K_ENTER ? K_TAB : K_BTAB);
|
||||
break;
|
||||
case K_CTRL+K_PREV:
|
||||
xi_scroll(_list, XI_SCROLL_PGUP);
|
||||
break;
|
||||
case K_CTRL+K_NEXT:
|
||||
xi_scroll(_list, XI_SCROLL_PGDOWN);
|
||||
break;
|
||||
case K_CTRL+K_HOME:
|
||||
xi_scroll(_list, XI_SCROLL_FIRST);
|
||||
break;
|
||||
case K_CTRL+K_END:
|
||||
xi_scroll(_list, XI_SCROLL_LAST);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void TSpreadsheet::activate(bool on)
|
||||
{
|
||||
@ -855,6 +870,7 @@ public:
|
||||
void set_notify(SPREADSHEET_NOTIFY n) { _notify = n; }
|
||||
void set_dirty(bool spork = TRUE) { _owner->set_dirty(spork);}
|
||||
bool dirty() const { return _owner->dirty(); }
|
||||
bool test_focus_change() { return TRUE; }
|
||||
|
||||
void mask2str(int riga);
|
||||
void str2mask(int riga);
|
||||
@ -1263,14 +1279,13 @@ void TSheet_field::set_notify(SPREADSHEET_NOTIFY n)
|
||||
|
||||
void TSheet_field::highlight() const
|
||||
{
|
||||
TMask_field::highlight();
|
||||
#if XVT_OS == XVT_OS_WIN
|
||||
if (_sheet->_firstfocus && items())
|
||||
{
|
||||
if (items())
|
||||
{
|
||||
_sheet->_firstfocus = FALSE;
|
||||
_sheet->set_focus_cell(0, 1);
|
||||
}
|
||||
#else
|
||||
TMask_field::highlight();
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1311,20 +1326,18 @@ bool TSheet_field::on_hit()
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TSheet_field::test_focus_change()
|
||||
{
|
||||
return _sheet->test_focus_change();
|
||||
}
|
||||
|
||||
bool TSheet_field::on_key(KEY k)
|
||||
{
|
||||
if (k == K_TAB || k == K_ENTER)
|
||||
{
|
||||
if (dirty() > TRUE)
|
||||
if (k == K_ENTER)
|
||||
{
|
||||
if (!test_focus_change())
|
||||
return FALSE;
|
||||
if (k == K_ENTER && dirty())
|
||||
{
|
||||
_sheet->str2mask(selected());
|
||||
const bool ok = sheet_mask().check_fields();
|
||||
if (!ok) return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TMask_field::on_key(k);
|
||||
}
|
||||
|
||||
|
@ -19,7 +19,8 @@ protected:
|
||||
virtual word class_id() const;
|
||||
virtual bool on_hit();
|
||||
virtual bool on_key(KEY k);
|
||||
|
||||
virtual bool test_focus_change();
|
||||
|
||||
virtual void parse_head(TScanner& scanner);
|
||||
virtual bool parse_item(TScanner& scanner);
|
||||
virtual void create(WINDOW parent);
|
||||
|
@ -1,4 +1,4 @@
|
||||
// $Id: relapp.cpp,v 1.44 1995-01-04 15:39:31 guy Exp $
|
||||
// $Id: relapp.cpp,v 1.45 1995-01-16 15:10:45 guy Exp $
|
||||
#include <mailbox.h>
|
||||
#include <sheet.h>
|
||||
#include <urldefid.h>
|
||||
@ -623,6 +623,7 @@ bool TRelation_application::save(bool check_dirty)
|
||||
}
|
||||
was_dirty = FALSE;
|
||||
|
||||
begin_wait();
|
||||
if (mode == MODE_INS)
|
||||
{
|
||||
bool changed = TRUE;
|
||||
@ -648,6 +649,7 @@ bool TRelation_application::save(bool check_dirty)
|
||||
get_relation()->restore_status();
|
||||
err = rewrite(*_mask);
|
||||
}
|
||||
end_wait();
|
||||
|
||||
switch(err)
|
||||
{
|
||||
@ -743,10 +745,6 @@ bool TRelation_application::main_loop()
|
||||
|
||||
k = _mask->run();
|
||||
|
||||
// Seleziona il cursore a clessidra se necessario
|
||||
if (k != K_QUIT && k != K_F9)
|
||||
begin_wait();
|
||||
|
||||
switch (k)
|
||||
{
|
||||
case K_ESC:
|
||||
@ -830,9 +828,6 @@ bool TRelation_application::main_loop()
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (k != K_QUIT && k != K_F9)
|
||||
end_wait();
|
||||
} while (k != K_QUIT);
|
||||
|
||||
if (_mask->is_open())
|
||||
|
@ -1,4 +1,4 @@
|
||||
// $Id: relation.cpp,v 1.30 1995-01-09 16:51:18 guy Exp $
|
||||
// $Id: relation.cpp,v 1.31 1995-01-16 15:10:49 guy Exp $
|
||||
// relation.cpp
|
||||
// fv 12/8/93
|
||||
// relation class for isam files
|
||||
@ -1104,9 +1104,11 @@ TRecnotype TCursor::readrec()
|
||||
|
||||
FILE* _f = open_index();
|
||||
|
||||
if ((fseek(_f, _pos * sizeof(TRecnotype), SEEK_SET) != 0) ||
|
||||
(fread(&nrec, sizeof(TRecnotype), 1, _f) != 1))
|
||||
fatal_box("Can't read record in file n. %d\n", file().filehnd()->ln);
|
||||
if (fseek(_f, _pos * sizeof(TRecnotype), SEEK_SET) != 0)
|
||||
fatal_box("Can't seek position %ld in cursor n. %d\n", _pos, file().filehnd()->ln);
|
||||
|
||||
if (fread(&nrec, sizeof(TRecnotype), 1, _f) != 1)
|
||||
fatal_box("Can't read position %ld in cursor n. %d\n", _pos, file().filehnd()->ln);
|
||||
|
||||
fclose(_f);
|
||||
|
||||
|
@ -22,7 +22,10 @@
|
||||
|
||||
HIDDEN const int MAXSTR = 301;
|
||||
HIDDEN char __spark[MAXSTR]; // Utility buffer
|
||||
TFixed_string spark(__spark, MAXSTR);
|
||||
TFixed_string spark(__spark, MAXSTR);
|
||||
|
||||
inline bool is_space(char c)
|
||||
{ return c >= K_TAB && c <= K_SPACE; }
|
||||
|
||||
// Dinamically resizes a string
|
||||
// Certified 99%
|
||||
@ -156,7 +159,7 @@ TString& TString::strip_spaces()
|
||||
for (int i = 0; _str[i]; i++)
|
||||
{
|
||||
char c = _str[i];
|
||||
if (isspace(c) && !instring) continue;
|
||||
if (is_space(c) && !instring) continue;
|
||||
if (c == '"' || c == '\'')
|
||||
{
|
||||
if (instring == c) instring = '\0';
|
||||
@ -301,7 +304,7 @@ TString& TString::ltrim(int count)
|
||||
if (count >= len()) return cut(0);
|
||||
s = &_str[count];
|
||||
}
|
||||
else for (s = _str; *s && isspace(*s); s++);
|
||||
else for (s = _str; *s && is_space(*s); s++);
|
||||
|
||||
if (s != _str) strcpy(_str, s);
|
||||
return *this;
|
||||
@ -318,7 +321,8 @@ TString& TString::rtrim(int count)
|
||||
else
|
||||
{
|
||||
char* good = _str-1;
|
||||
for (char* s = _str; *s; s++) if (!isspace(*s)) good = s;
|
||||
for (char* s = _str; *s; s++)
|
||||
if (!is_space(*s)) good = s;
|
||||
*(good+1) = '\0';
|
||||
}
|
||||
return *this;
|
||||
@ -329,7 +333,7 @@ TString& TString::trim()
|
||||
char* last = _str;
|
||||
|
||||
// Salta spazi iniziali
|
||||
for (const char* s = _str; *s && isspace(*s); s++);
|
||||
for (const char* s = _str; *s && is_space(*s); s++);
|
||||
|
||||
// Copia stringa
|
||||
if (s > _str)
|
||||
@ -337,7 +341,7 @@ TString& TString::trim()
|
||||
for(char* c = _str; *s; s++)
|
||||
{
|
||||
*c++ = *s;
|
||||
if (!isspace(*s)) last = c;
|
||||
if (!is_space(*s)) last = c;
|
||||
}
|
||||
// Elimina spazi finali
|
||||
*last = '\0';
|
||||
@ -896,7 +900,7 @@ int TToken_string::get_pos(const char* s)
|
||||
bool TToken_string::empty_items() const
|
||||
{
|
||||
for (const char* c = _str; *c; c++)
|
||||
if (!isspace(*c) && *c != _separator) return FALSE;
|
||||
if (!is_space(*c) && *c != _separator) return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -999,7 +1003,7 @@ void TParagraph_string::tokenize()
|
||||
for (int end = start+_width; end < len(); end = start+_width)
|
||||
{
|
||||
for (int i = end; i >= start; i--)
|
||||
if (isspace(_str[i])) break;
|
||||
if (is_space(_str[i])) break;
|
||||
|
||||
if (i < start)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user