Aggiunta gestione DDE nei golem
Aggiunti campi memo alle maschere Aggiunto metodo on_idle alle finestre git-svn-id: svn://10.65.10.50/trunk@1484 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
1145d25263
commit
42adacd51a
@ -35,6 +35,7 @@
|
|||||||
#define CLASS_BUTTON_FIELD 27
|
#define CLASS_BUTTON_FIELD 27
|
||||||
#define CLASS_SHEET_FIELD 28
|
#define CLASS_SHEET_FIELD 28
|
||||||
#define CLASS_BROWSEFILE_FIELD 29
|
#define CLASS_BROWSEFILE_FIELD 29
|
||||||
|
#define CLASS_MEMO_FIELD 30
|
||||||
|
|
||||||
#define CLASS_GOLEM 200
|
#define CLASS_GOLEM 200
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <io.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <xvt.h>
|
#include <xvt.h>
|
||||||
|
|
||||||
@ -116,6 +117,8 @@ void TConfig::_write_file()
|
|||||||
|
|
||||||
if (_file[0] > 'B' || _file[1] != ':') // Non creare il .bak su dischetto
|
if (_file[0] > 'B' || _file[1] != ':') // Non creare il .bak su dischetto
|
||||||
{
|
{
|
||||||
|
while (access(_file, 02) != 0)
|
||||||
|
message_box("Il file %s e' gia' in uso", (const char*)_file);
|
||||||
TFilename bak(_file); bak.ext("bak");
|
TFilename bak(_file); bak.ext("bak");
|
||||||
rename(_file, bak);
|
rename(_file, bak);
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <applicat.h>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <execp.h>
|
#include <execp.h>
|
||||||
#include <golem.h>
|
#include <golem.h>
|
||||||
@ -203,3 +204,88 @@ bool TGolem::import()
|
|||||||
|
|
||||||
return ok == FL_OK;
|
return ok == FL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if XVT_OS == XVT_OS_WIN
|
||||||
|
|
||||||
|
#define STRICT
|
||||||
|
#include <windows.h>
|
||||||
|
#include <dde.h>
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// DDE
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static TDDE* DDEWIN = NULL;
|
||||||
|
|
||||||
|
HIDDEN BOOLEAN hook(HWND hwnd,
|
||||||
|
UINT msg,
|
||||||
|
UINT wparam,
|
||||||
|
ULONG lparam,
|
||||||
|
long* ret)
|
||||||
|
{
|
||||||
|
switch (msg)
|
||||||
|
{
|
||||||
|
case WM_DDE_ACK:
|
||||||
|
DDEWIN->set_server(wparam);
|
||||||
|
GlobalDeleteAtom(LOWORD(lparam));
|
||||||
|
GlobalDeleteAtom(HIWORD(lparam));
|
||||||
|
*ret = TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
TDDE::TDDE()
|
||||||
|
: _old_hook(NULL), _server(0)
|
||||||
|
{
|
||||||
|
CHECK(DDEWIN == NULL, "Non puoi lanciare due DDE, bestia!");
|
||||||
|
create(0, 0, 0, 0, "DDE", WSF_INVISIBLE, W_PLAIN, NULL_WIN);
|
||||||
|
_hwnd = (word)xvt_vobj_get_attr(win(), ATTR_NATIVE_WINDOW);
|
||||||
|
DDEWIN = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
TDDE::~TDDE()
|
||||||
|
{
|
||||||
|
terminate();
|
||||||
|
DDEWIN = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TDDE::initiate(const char* app, const char* topic)
|
||||||
|
{
|
||||||
|
CHECK(_old_hook == NULL, "Non puoi iniziare due connessioni DDE");
|
||||||
|
_old_hook = xvt_vobj_get_attr(NULL_WIN, ATTR_EVENT_HOOK);
|
||||||
|
xvt_vobj_set_attr(NULL_WIN, ATTR_EVENT_HOOK, (long)hook);
|
||||||
|
|
||||||
|
_server = 0;
|
||||||
|
ATOM a_app = GlobalAddAtom(app);
|
||||||
|
ATOM a_topic = GlobalAddAtom(topic);
|
||||||
|
SendMessage(HWND_BROADCAST, WM_DDE_INITIATE, (WORD)_hwnd, MAKELPARAM(a_app, a_topic));
|
||||||
|
GlobalDeleteAtom(a_app);
|
||||||
|
GlobalDeleteAtom(a_topic);
|
||||||
|
return _server != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TDDE::execute(const char* cmd) const
|
||||||
|
{
|
||||||
|
HGLOBAL hg = GlobalAlloc(GMEM_DDESHARE, strlen(cmd)+1);
|
||||||
|
char* c = (char*)GlobalLock(hg);
|
||||||
|
strcpy(c, cmd);
|
||||||
|
GlobalUnlock(hg);
|
||||||
|
return PostMessage((HWND)_server, WM_DDE_EXECUTE, (WORD)_hwnd, MAKELPARAM(0, hg));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TDDE::terminate()
|
||||||
|
{
|
||||||
|
if (_old_hook)
|
||||||
|
{
|
||||||
|
xvt_vobj_set_attr(NULL_WIN, ATTR_EVENT_HOOK, _old_hook);
|
||||||
|
_old_hook = NULL;
|
||||||
|
PostMessage((HWND)_server, (WORD)_hwnd, WM_DDE_TERMINATE, 0L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef __GOLEM_H
|
#ifndef __GOLEM_H
|
||||||
#define __GOLEM_H
|
#define __GOLEM_H
|
||||||
|
|
||||||
#ifndef __STRINGS_H
|
#ifndef __WINDOW_H
|
||||||
#include <strings.h>
|
#include <window.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __CONFIG_H
|
#ifndef __CONFIG_H
|
||||||
@ -50,4 +50,21 @@ public:
|
|||||||
virtual ~TGolem();
|
virtual ~TGolem();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class TDDE : public TWindow
|
||||||
|
{
|
||||||
|
word _hwnd;
|
||||||
|
word _server;
|
||||||
|
long _old_hook;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void set_server(word s) { _server = s; }
|
||||||
|
bool initiate(const char* app, const char* topic);
|
||||||
|
bool execute(const char* cmd) const;
|
||||||
|
void terminate();
|
||||||
|
|
||||||
|
TDDE();
|
||||||
|
virtual ~TDDE();
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -128,6 +128,7 @@ void TMask::handler(WINDOW win, EVENT* ep)
|
|||||||
xvt_draw_rect(win, r, MASK_LIGHT_COLOR, MASK_DARK_COLOR, 1);
|
xvt_draw_rect(win, r, MASK_LIGHT_COLOR, MASK_DARK_COLOR, 1);
|
||||||
}
|
}
|
||||||
else xvt_dwin_clear(win, MASK_DARK_COLOR);
|
else xvt_dwin_clear(win, MASK_DARK_COLOR);
|
||||||
|
xvt_tx_process_event(win, ep);
|
||||||
#else
|
#else
|
||||||
xvt_dwin_clear(win, MASK_BACK_COLOR);
|
xvt_dwin_clear(win, MASK_BACK_COLOR);
|
||||||
#endif
|
#endif
|
||||||
@ -145,11 +146,9 @@ void TMask::handler(WINDOW win, EVENT* ep)
|
|||||||
stop_run(K_AUTO_ENTER);
|
stop_run(K_AUTO_ENTER);
|
||||||
break;
|
break;
|
||||||
case DLG_CANCEL :
|
case DLG_CANCEL :
|
||||||
// if (test_focus_change(ep->v.ctl.ci.win))
|
|
||||||
stop_run(K_ESC);
|
stop_run(K_ESC);
|
||||||
break;
|
break;
|
||||||
case DLG_QUIT :
|
case DLG_QUIT :
|
||||||
// if (test_focus_change(ep->v.ctl.ci.win))
|
|
||||||
stop_run(K_FORCE_CLOSE);
|
stop_run(K_FORCE_CLOSE);
|
||||||
break;
|
break;
|
||||||
case DLG_F9:
|
case DLG_F9:
|
||||||
@ -166,7 +165,22 @@ void TMask::handler(WINDOW win, EVENT* ep)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (_focus >= 0 && _focus < fields() && fld(_focus).class_id() == CLASS_MEMO_FIELD)
|
||||||
|
{
|
||||||
|
bool ok = TRUE;
|
||||||
|
if (ep->type == E_CHAR)
|
||||||
|
{
|
||||||
|
const KEY k = e_char_to_key(ep);
|
||||||
|
ok = k != K_TAB && k != K_BTAB;
|
||||||
|
if (ok) fld(_focus).set_dirty();
|
||||||
|
}
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
|
ok = xvt_tx_process_event(win, ep) == TRUE;
|
||||||
|
if (ok) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
TWindow::handler(win, ep);
|
TWindow::handler(win, ep);
|
||||||
@ -516,23 +530,20 @@ bool TMask::check_fields()
|
|||||||
|
|
||||||
void TMask::get_mask_fields()
|
void TMask::get_mask_fields()
|
||||||
{
|
{
|
||||||
TString256 window_data;
|
|
||||||
for (int i = 0; i < fields(); i++)
|
for (int i = 0; i < fields(); i++)
|
||||||
{
|
{
|
||||||
TMask_field& f = fld(i);
|
TMask_field& f = fld(i);
|
||||||
|
const char* fd = f.get_field_data();
|
||||||
const int acqua = f.class_id();
|
if (fd != NULL) // NULL per testi fissi, bottoni e sheets
|
||||||
if (acqua != CLASS_FIELD && acqua != CLASS_BUTTON_FIELD && acqua != CLASS_SHEET_FIELD)
|
|
||||||
{
|
{
|
||||||
window_data = f.get_window_data();
|
const char* wd = f.get_window_data();
|
||||||
|
CHECKD(wd, "NULL window data in field ", f.dlg());
|
||||||
if (f.dirty() == TRUE)
|
if (f.dirty() == TRUE)
|
||||||
{
|
{
|
||||||
const char* fd = f.get_field_data();
|
if (strcmp(wd, fd) == 0)
|
||||||
CHECK(fd, "NULL pointer comparison");
|
|
||||||
if (window_data == fd)
|
|
||||||
f.set_dirty(FALSE);
|
f.set_dirty(FALSE);
|
||||||
}
|
}
|
||||||
f.set_field_data(window_data);
|
f.set_field_data(wd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -848,7 +859,7 @@ TMask_field* TMask::parse_field(TScanner& scanner)
|
|||||||
return new TSheet_field(this);
|
return new TSheet_field(this);
|
||||||
}
|
}
|
||||||
if (scanner.key() == "BR") return new TBrowsefile_field(this);
|
if (scanner.key() == "BR") return new TBrowsefile_field(this);
|
||||||
|
if (scanner.key() == "ME") return new TMemo_field(this);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1220,6 +1231,20 @@ void TMask::on_firm_change()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TMask::on_idle()
|
||||||
|
{
|
||||||
|
if (_focus >= 0 && _focus < fields())
|
||||||
|
{
|
||||||
|
const word acqua = fld(_focus).class_id();
|
||||||
|
if (acqua == CLASS_SHEET_FIELD)
|
||||||
|
{
|
||||||
|
TSheet_field& s = (TSheet_field&)fld(_focus);
|
||||||
|
s.on_idle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void TMask::send_key(KEY key, short to, TMask_field* from)
|
void TMask::send_key(KEY key, short to, TMask_field* from)
|
||||||
{
|
{
|
||||||
if (to == 0)
|
if (to == 0)
|
||||||
@ -1329,6 +1354,15 @@ WINDOW TMask::add_radio(short id, int page, const char* prompt, int x,
|
|||||||
return ((TMask_field*)f)->win();
|
return ((TMask_field*)f)->win();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WINDOW TMask::add_memo(short id, int page, const char* prompt, int x, int y,
|
||||||
|
int dx, int dy, const char* flags)
|
||||||
|
{
|
||||||
|
TMemo_field* f = new TMemo_field(this);
|
||||||
|
f->construct(id, prompt, x, y, dy, _pagewin[page], flags, dx);
|
||||||
|
_field.add(f);
|
||||||
|
return ((TMask_field*)f)->win();
|
||||||
|
}
|
||||||
|
|
||||||
bool TMask::save(bool append) const
|
bool TMask::save(bool append) const
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -1406,3 +1440,5 @@ void TMask::set_exchange(bool show_value, const real& n)
|
|||||||
_exchange = nuo; // Update current exchange
|
_exchange = nuo; // Update current exchange
|
||||||
main_app().end_wait();
|
main_app().end_wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,6 +112,8 @@ public:
|
|||||||
int dx = 9, int dy = 1, const char* flags = "");
|
int dx = 9, int dy = 1, const char* flags = "");
|
||||||
WINDOW add_radio(short id, int page, const char* prompt, int x, int y,
|
WINDOW add_radio(short id, int page, const char* prompt, int x, int y,
|
||||||
int dx, const char* codes, const char* items, const char* flags = "");
|
int dx, const char* codes, const char* items, const char* flags = "");
|
||||||
|
WINDOW add_memo (short id, int page, const char* prompt, int x, int y,
|
||||||
|
int dx = 78, int dy = 4, const char* flags = "");
|
||||||
|
|
||||||
int fields() const { return _field.items(); }
|
int fields() const { return _field.items(); }
|
||||||
int sheets() const { return _sheets; }
|
int sheets() const { return _sheets; }
|
||||||
@ -152,6 +154,7 @@ public:
|
|||||||
void disable_starting_check() { _should_check = FALSE;}
|
void disable_starting_check() { _should_check = FALSE;}
|
||||||
|
|
||||||
virtual bool on_key(KEY key);
|
virtual bool on_key(KEY key);
|
||||||
|
virtual void on_idle();
|
||||||
void on_firm_change();
|
void on_firm_change();
|
||||||
|
|
||||||
void enable(short fld_id, bool on = TRUE); // Abilita un campo
|
void enable(short fld_id, bool on = TRUE); // Abilita un campo
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <xvt.h>
|
#include <xvt.h>
|
||||||
|
|
||||||
#include <applicat.h>
|
#include <applicat.h>
|
||||||
|
#include <colors.h>
|
||||||
#include <defmask.h>
|
#include <defmask.h>
|
||||||
#include <execp.h>
|
#include <execp.h>
|
||||||
#include <golem.h>
|
#include <golem.h>
|
||||||
@ -441,6 +442,14 @@ const char* TMask_field::prompt() const
|
|||||||
return _prompt;
|
return _prompt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Certified 90%
|
||||||
|
void TMask_field::set_field(const TString& fr)
|
||||||
|
{
|
||||||
|
if (_field != NULL)
|
||||||
|
*_field = fr;
|
||||||
|
else
|
||||||
|
_field = new TFieldref(fr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
// Certified 100%
|
// Certified 100%
|
||||||
void TMask_field::reset()
|
void TMask_field::reset()
|
||||||
@ -2531,7 +2540,8 @@ const char* TDate_field::format_data(const char* datum, bool* ch)
|
|||||||
changed = TRUE;
|
changed = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (data == "OGGI") changed = TRUE;
|
if (data == "OGGI")
|
||||||
|
changed = TRUE;
|
||||||
if (changed) data = gstring;
|
if (changed) data = gstring;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3238,10 +3248,126 @@ void TGroup_field::create(WINDOW parent)
|
|||||||
wincreate(WC_GROUPBOX, _width, _size, _prompt, parent, f);
|
wincreate(WC_GROUPBOX, _width, _size, _prompt, parent, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TGroup_field::set_window_data(const char* data)
|
void TGroup_field::set_window_data(const char* data)
|
||||||
{ xvt_set_title(win(), data); }
|
{ xvt_set_title(win(), data); }
|
||||||
|
|
||||||
void TGroup_field::set_field_data(const char* data)
|
void TGroup_field::set_field_data(const char* data)
|
||||||
{ xvt_set_title(win(), data); }
|
{ xvt_set_title(win(), data); }
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// TMemo_field
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
TMemo_field::TMemo_field(TMask* mask) : TMask_field(mask), _te(BAD_TXEDIT)
|
||||||
|
{}
|
||||||
|
|
||||||
|
TMemo_field::~TMemo_field()
|
||||||
|
{
|
||||||
|
_te = BAD_TXEDIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMemo_field::parse_head(TScanner& scanner)
|
||||||
|
{
|
||||||
|
_width = scanner.integer();
|
||||||
|
_size = scanner.integer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMemo_field::create(WINDOW parent)
|
||||||
|
{
|
||||||
|
const short dx = _width;
|
||||||
|
const short dy = _size-1;
|
||||||
|
|
||||||
|
TMask_field::create(parent);
|
||||||
|
|
||||||
|
WIN_DEF wd;
|
||||||
|
wd.wtype = WO_TE;
|
||||||
|
wd.rct = resize_rect(_x, _y+1, dx, dy, WC_EDIT, parent);
|
||||||
|
wd.text = NULL;
|
||||||
|
wd.units = U_PIXELS;
|
||||||
|
wd.v.tx.attrib = TX_NOMENU | TX_BORDER | TX_AUTOHSCROLL | TX_AUTOVSCROLL;
|
||||||
|
wd.v.tx.font_id = xvt_dwin_get_font(win());
|
||||||
|
wd.v.tx.margin = wd.rct.right - wd.rct.left;
|
||||||
|
wd.v.tx.limit = 256;
|
||||||
|
wd.v.tx.tx_id = dlg();
|
||||||
|
_te = xvt_tx_create_def(&wd, parent, NULL);
|
||||||
|
CHECK(_te != BAD_TXEDIT, "Can't create a memo field");
|
||||||
|
|
||||||
|
enable_default(); // Setta colori default
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMemo_field::highlight() const
|
||||||
|
{
|
||||||
|
xvt_tx_set_active(_te);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TMemo_field::on_key(KEY k)
|
||||||
|
{
|
||||||
|
return TMask_field::on_key(k);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMemo_field::enable(bool on)
|
||||||
|
{
|
||||||
|
TMask_field::enable(on);
|
||||||
|
|
||||||
|
unsigned attr = xvt_tx_get_attr(_te);
|
||||||
|
if (on)
|
||||||
|
{
|
||||||
|
xvt_tx_set_colors(_te, NORMAL_COLOR, COLOR_BLACK, NORMAL_BACK_COLOR);
|
||||||
|
attr &= ~TX_READONLY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xvt_tx_set_colors(_te, DISABLED_COLOR, COLOR_BLACK, DISABLED_BACK_COLOR);
|
||||||
|
attr |= TX_READONLY;
|
||||||
|
}
|
||||||
|
xvt_tx_set_attr(_te, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMemo_field::show(bool on)
|
||||||
|
{
|
||||||
|
TMask_field::show(on);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TMemo_field::autoload(const TRelation* r)
|
||||||
|
{
|
||||||
|
const TFieldref* f = field();
|
||||||
|
xvt_tx_clear(_te);
|
||||||
|
if (f != NULL)
|
||||||
|
{
|
||||||
|
TTextfile txt;
|
||||||
|
r->lfile(f->file()).get_memo(f->name(), txt);
|
||||||
|
for (T_LNUM i = 0; i < (T_LNUM)txt.lines(); i++)
|
||||||
|
xvt_tx_add_par(_te, i, (char*)txt.line(i));
|
||||||
|
return i > 0;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TMemo_field::autosave(TRelation* r) const
|
||||||
|
{
|
||||||
|
const TFieldref* f = field();
|
||||||
|
if (dirty() && f != NULL)
|
||||||
|
{
|
||||||
|
const T_PNUM para = xvt_tx_get_num_pars(_te);
|
||||||
|
TTextfile txt;
|
||||||
|
TString256 line;
|
||||||
|
for (T_PNUM p = 0; p < para; p++)
|
||||||
|
{
|
||||||
|
const T_LNUM lines = xvt_tx_get_num_par_lines(_te, p);
|
||||||
|
for (T_LNUM l = 0; l < lines; l++)
|
||||||
|
{
|
||||||
|
unsigned len;
|
||||||
|
xvt_tx_get_line(_te, p, A_LOCK, l, &len);
|
||||||
|
const char* s = xvt_tx_get_line(_te, p, A_GET, l, &len);
|
||||||
|
CHECK(s, "Null memo line");
|
||||||
|
line.strncpy(s, len);
|
||||||
|
xvt_tx_get_line(_te, p, A_UNLOCK, l, &len);
|
||||||
|
txt.append(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
r->lfile(f->file()).put(f->name(), txt);
|
||||||
|
return para > 0;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: maskfld.h,v 1.29 1995-05-10 16:12:43 guy Exp $ */
|
/* $Id: maskfld.h,v 1.30 1995-06-19 08:13:03 guy Exp $ */
|
||||||
#ifndef __MASKFLD_H
|
#ifndef __MASKFLD_H
|
||||||
#define __MASKFLD_H
|
#define __MASKFLD_H
|
||||||
|
|
||||||
@ -177,7 +177,7 @@ public:
|
|||||||
virtual const char* warning() { return "";}
|
virtual const char* warning() { return "";}
|
||||||
|
|
||||||
virtual bool autoload(const TRelation* r = NULL);
|
virtual bool autoload(const TRelation* r = NULL);
|
||||||
bool autosave(TRelation* r = NULL) const;
|
virtual bool autosave(TRelation* r = NULL) const;
|
||||||
|
|
||||||
void undo();
|
void undo();
|
||||||
|
|
||||||
@ -192,6 +192,7 @@ public:
|
|||||||
void set_group(byte group) { _groups.set(long(group)); _groups.set(0L);}
|
void set_group(byte group) { _groups.set(long(group)); _groups.set(0L);}
|
||||||
|
|
||||||
const TFieldref* field() const { return _field; }
|
const TFieldref* field() const { return _field; }
|
||||||
|
void set_field(const TString& fr);
|
||||||
|
|
||||||
void set_focus() const;
|
void set_focus() const;
|
||||||
void send_key(KEY k, short to);
|
void send_key(KEY k, short to);
|
||||||
@ -222,8 +223,8 @@ class TEdit_field : public TMask_field
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
// @DPROT
|
// @DPROT
|
||||||
TString256 _str;
|
TString _str;
|
||||||
TString16 _picture;
|
TString _picture;
|
||||||
TString _warning;
|
TString _warning;
|
||||||
CheckType _check; // Accettabilita' di valori nulli
|
CheckType _check; // Accettabilita' di valori nulli
|
||||||
bool _forced;
|
bool _forced;
|
||||||
@ -560,22 +561,41 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// @C
|
|
||||||
// class TGroup_field : public TMask_field
|
|
||||||
// @END
|
|
||||||
|
|
||||||
class TGroup_field : public TMask_field
|
class TGroup_field : public TMask_field
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
// @DPROT
|
|
||||||
virtual void parse_head(TScanner& scanner);
|
virtual void parse_head(TScanner& scanner);
|
||||||
virtual void create(WINDOW parent);
|
virtual void create(WINDOW parent);
|
||||||
virtual void set_window_data(const char* data);
|
virtual void set_window_data(const char* data);
|
||||||
virtual void set_field_data(const char* data);
|
virtual void set_field_data(const char* data);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// @FPUB
|
|
||||||
TGroup_field(TMask* mask);
|
TGroup_field(TMask* mask);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class TMemo_field : public TMask_field
|
||||||
|
{
|
||||||
|
TXEDIT _te;
|
||||||
|
|
||||||
|
protected: // TMask_field
|
||||||
|
virtual word class_id() const { return CLASS_MEMO_FIELD; }
|
||||||
|
virtual const char* class_name() const { return "MEMO"; }
|
||||||
|
virtual void create(WINDOW parent);
|
||||||
|
virtual void parse_head(TScanner& scanner);
|
||||||
|
|
||||||
|
virtual bool autoload(const TRelation* r = NULL);
|
||||||
|
virtual bool autosave(TRelation* r = NULL) const;
|
||||||
|
virtual void highlight() const;
|
||||||
|
|
||||||
|
virtual void enable(bool on);
|
||||||
|
virtual void show(bool on);
|
||||||
|
virtual bool on_key(KEY k);
|
||||||
|
|
||||||
|
public:
|
||||||
|
TMemo_field(TMask* mask);
|
||||||
|
virtual ~TMemo_field();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // __MASKFLD_H
|
#endif // __MASKFLD_H
|
||||||
|
@ -37,10 +37,11 @@ class TSpreadsheet : public TWindow
|
|||||||
int _cur_row, _cur_rec, _cur_col; // Current cell
|
int _cur_row, _cur_rec, _cur_col; // Current cell
|
||||||
bool _row_dirty; // Current row changed
|
bool _row_dirty; // Current row changed
|
||||||
bool _check_enabled; // Perform OFF_ROW and OFF_CELL checks
|
bool _check_enabled; // Perform OFF_ROW and OFF_CELL checks
|
||||||
bool _update; // It's safe to update the display
|
int _needs_update;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
friend void XVT_CALLCONV1 xiev_handler(XI_OBJ *itf, XI_EVENT *xiev);
|
friend void XVT_CALLCONV1 xiev_handler(XI_OBJ *itf, XI_EVENT *xiev);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void list_handler(XI_EVENT *xiev);
|
void list_handler(XI_EVENT *xiev);
|
||||||
|
|
||||||
@ -55,6 +56,7 @@ protected:
|
|||||||
|
|
||||||
bool notify(int row, KEY k);
|
bool notify(int row, KEY k);
|
||||||
void notify_change();
|
void notify_change();
|
||||||
|
void on_idle();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void update(int row);
|
void update(int row);
|
||||||
@ -117,7 +119,8 @@ TSpreadsheet::TSpreadsheet(short x, short y, short dx, short dy,
|
|||||||
TSheet_field* o)
|
TSheet_field* o)
|
||||||
: _mask(maskname, maskno), _notify(NULL), _edit_field(NULL),
|
: _mask(maskname, maskno), _notify(NULL), _edit_field(NULL),
|
||||||
_owner(o), _cur_row(0), _cur_col(0), _active(TRUE),
|
_owner(o), _cur_row(0), _cur_col(0), _active(TRUE),
|
||||||
_row_dirty(FALSE), _check_enabled(TRUE), _firstfocus(TRUE), _update(TRUE)
|
_row_dirty(FALSE), _check_enabled(TRUE), _firstfocus(TRUE),
|
||||||
|
_needs_update(-1)
|
||||||
{
|
{
|
||||||
const int NUMBER_WIDTH = 3;
|
const int NUMBER_WIDTH = 3;
|
||||||
const int MAX_COL = 32;
|
const int MAX_COL = 32;
|
||||||
@ -361,17 +364,6 @@ void TSpreadsheet::update_rec(int rec)
|
|||||||
XI_OBJ row;
|
XI_OBJ row;
|
||||||
XI_MAKE_ROW(&row, _list, riga);
|
XI_MAKE_ROW(&row, _list, riga);
|
||||||
xi_cell_request(&row); // Update internal values
|
xi_cell_request(&row); // Update internal values
|
||||||
/*
|
|
||||||
if (_update)
|
|
||||||
{
|
|
||||||
XI_OBJ cell;
|
|
||||||
for (int c = 1; c < _columns; c++)
|
|
||||||
{
|
|
||||||
XI_MAKE_CELL(&cell, _list, riga, c);
|
|
||||||
xi_set_text(&cell, xi_get_text(&cell, NULL, -1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -456,8 +448,7 @@ void TSpreadsheet::update(int row)
|
|||||||
if (row < 0)
|
if (row < 0)
|
||||||
{
|
{
|
||||||
xi_cell_request(_list); // Force updatde
|
xi_cell_request(_list); // Force updatde
|
||||||
if (_update)
|
xi_scroll(_list, XI_SCROLL_FIRST);
|
||||||
xi_scroll(_list, XI_SCROLL_FIRST);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
update_rec(row);
|
update_rec(row);
|
||||||
@ -679,11 +670,8 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
|
|||||||
bool ok = sheet_mask().check_fields();
|
bool ok = sheet_mask().check_fields();
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
const int next = _cur_rec + (_lastab == K_TAB ? +1 : -1);
|
|
||||||
_update = rec2row(next) >= 0; // Disable update if next record is not visible
|
|
||||||
mask2str(_cur_rec); // Update sheet with mask contents
|
mask2str(_cur_rec); // Update sheet with mask contents
|
||||||
ok = notify(_cur_rec, K_ENTER); // Notify edit
|
ok = notify(_cur_rec, K_ENTER); // Notify edit
|
||||||
_update = TRUE; // Reenable update
|
|
||||||
}
|
}
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
@ -727,7 +715,7 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
|
|||||||
if (c->on_key(c->is_edit() ? K_TAB : K_SPACE) == FALSE) // Test it
|
if (c->on_key(c->is_edit() ? K_TAB : K_SPACE) == FALSE) // Test it
|
||||||
xiev->refused = *nuo != '\0';
|
xiev->refused = *nuo != '\0';
|
||||||
else
|
else
|
||||||
mask2str(_cur_rec); // Update sheet row
|
mask2str(_cur_rec); // Update sheet row
|
||||||
}
|
}
|
||||||
_check_enabled = TRUE;
|
_check_enabled = TRUE;
|
||||||
}
|
}
|
||||||
@ -756,7 +744,7 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
|
|||||||
xiev->refused = TRUE;
|
xiev->refused = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case E_CHAR:
|
case E_CHAR:
|
||||||
if (_edit_field)
|
if (_edit_field)
|
||||||
{
|
{
|
||||||
@ -813,7 +801,7 @@ void TSpreadsheet::list_handler(XI_EVENT *xiev)
|
|||||||
if (xi_move_focus(_itf))
|
if (xi_move_focus(_itf))
|
||||||
dispatch_e_char(parent(), k == K_ENTER ? K_TAB : K_BTAB);
|
dispatch_e_char(parent(), k == K_ENTER ? K_TAB : K_BTAB);
|
||||||
break;
|
break;
|
||||||
case K_CTRL+K_PREV:
|
case K_CTRL+K_PREV:
|
||||||
xi_scroll(_list, XI_SCROLL_PGUP);
|
xi_scroll(_list, XI_SCROLL_PGUP);
|
||||||
break;
|
break;
|
||||||
case K_CTRL+K_NEXT:
|
case K_CTRL+K_NEXT:
|
||||||
@ -1033,10 +1021,19 @@ void TSpreadsheet::mask2str(int rec)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#if XVT_OS == XVT_OS_WIN
|
#if XVT_OS == XVT_OS_WIN
|
||||||
update(rec);
|
CHECK(_needs_update == -1 || _needs_update == rec, "Can't update two records");
|
||||||
|
_needs_update = rec;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TSpreadsheet::on_idle()
|
||||||
|
{
|
||||||
|
if (_needs_update >= 0)
|
||||||
|
{
|
||||||
|
update_rec(_needs_update);
|
||||||
|
_needs_update = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Certified 50%
|
// Certified 50%
|
||||||
void TSpreadsheet::enable_cell(int row, int column, bool on)
|
void TSpreadsheet::enable_cell(int row, int column, bool on)
|
||||||
@ -1393,6 +1390,13 @@ bool TSheet_field::on_key(KEY k)
|
|||||||
return TMask_field::on_key(k);
|
return TMask_field::on_key(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TSheet_field::on_idle()
|
||||||
|
{
|
||||||
|
#if XVT_OS == XVT_OS_WIN
|
||||||
|
_sheet->on_idle();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void TSheet_field::exchange(bool show_value, const real& nuo)
|
void TSheet_field::exchange(bool show_value, const real& nuo)
|
||||||
{
|
{
|
||||||
TMask& m = sheet_mask();
|
TMask& m = sheet_mask();
|
||||||
|
@ -37,6 +37,8 @@ public:
|
|||||||
|
|
||||||
virtual void reset();
|
virtual void reset();
|
||||||
virtual void enable(bool on);
|
virtual void enable(bool on);
|
||||||
|
|
||||||
|
void on_idle();
|
||||||
|
|
||||||
void destroy(int r = -1); // Destroy row
|
void destroy(int r = -1); // Destroy row
|
||||||
void force_update(int r = -1);// Update data/screen
|
void force_update(int r = -1);// Update data/screen
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#define LIST LI
|
#define LIST LI
|
||||||
#define LISTFILE LI
|
#define LISTFILE LI
|
||||||
#define MESSAGE ME
|
#define MESSAGE ME
|
||||||
|
#define MEMO ME
|
||||||
#define MASK MA
|
#define MASK MA
|
||||||
#define NUMBER NU
|
#define NUMBER NU
|
||||||
#define NONE NO
|
#define NONE NO
|
||||||
|
@ -33,7 +33,8 @@ HIDDEN bool remove_menu_item(MENU_ITEM* menu, MENU_TAG id, bool ismbar)
|
|||||||
{
|
{
|
||||||
if (mn->tag == id)
|
if (mn->tag == id)
|
||||||
{
|
{
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
xvt_mem_rep((DATA_PTR)mn, (DATA_PTR)(mn+1), sizeof(MENU_ITEM), 1);
|
xvt_mem_rep((DATA_PTR)mn, (DATA_PTR)(mn+1), sizeof(MENU_ITEM), 1);
|
||||||
mn++;
|
mn++;
|
||||||
}
|
}
|
||||||
@ -129,7 +130,7 @@ void TWindow_manager::destroy()
|
|||||||
void TWindow_manager::lock_handle()
|
void TWindow_manager::lock_handle()
|
||||||
{
|
{
|
||||||
CHECK(_lowhandle == NULL, "Can't relock low handle");
|
CHECK(_lowhandle == NULL, "Can't relock low handle");
|
||||||
_lowhandle = fopen("prassi.ini", "r");
|
_lowhandle = fopen("bagn001a.msk", "r");
|
||||||
CHECK(_lowhandle != NULL, "Can't lock low handle");
|
CHECK(_lowhandle != NULL, "Can't lock low handle");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -546,6 +547,11 @@ void TWindow::handler(WINDOW win, EVENT* ep)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TWindow::on_idle()
|
||||||
|
{
|
||||||
|
// Non c'e' niente da fare qui, ma non si puo' mai sapere
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TPoint TWindow::size() const
|
TPoint TWindow::size() const
|
||||||
{
|
{
|
||||||
|
@ -150,6 +150,7 @@ public:
|
|||||||
virtual void open(); // Mostra la finestra
|
virtual void open(); // Mostra la finestra
|
||||||
virtual void close(); // Nasconde la finestra
|
virtual void close(); // Nasconde la finestra
|
||||||
virtual bool can_be_closed() const; // Puo' essere chiusa brutalmente?
|
virtual bool can_be_closed() const; // Puo' essere chiusa brutalmente?
|
||||||
|
virtual void on_idle(); // Non c'e' piu' niente da fare!
|
||||||
|
|
||||||
void iconize() const;
|
void iconize() const;
|
||||||
void maximize() const;
|
void maximize() const;
|
||||||
|
@ -443,6 +443,14 @@ void TEvent_manager::pop()
|
|||||||
_begin = (++_begin) % MAX; // Other events may occur!
|
_begin = (++_begin) % MAX; // Other events may occur!
|
||||||
xvt_win_dispatch_event(_w[i], &_e[i]);
|
xvt_win_dispatch_event(_w[i], &_e[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WINDOW cw = cur_win();
|
||||||
|
if (cw != NULL_WIN)
|
||||||
|
{
|
||||||
|
TWindow* w = (TWindow*)xvt_vobj_get_data(cw);
|
||||||
|
CHECK(w != NULL, "Can't idle NULL window");
|
||||||
|
w->on_idle();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_events()
|
void do_events()
|
||||||
|
@ -55,6 +55,8 @@ WINDOW xvt_create_window
|
|||||||
void dispatch_e_scroll(WINDOW win, KEY key);
|
void dispatch_e_scroll(WINDOW win, KEY key);
|
||||||
|
|
||||||
void xvt_set_font(WINDOW win, const char* family, int style, int dim = 0);
|
void xvt_set_font(WINDOW win, const char* family, int style, int dim = 0);
|
||||||
|
XVT_FNTID xvt_default_font();
|
||||||
|
|
||||||
void xvt_set_front_control(WINDOW win);
|
void xvt_set_front_control(WINDOW win);
|
||||||
const char* xvt_get_title(WINDOW win);
|
const char* xvt_get_title(WINDOW win);
|
||||||
void xvt_set_title(WINDOW win, const char* title);
|
void xvt_set_title(WINDOW win, const char* title);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user