Patch level : 10.0 260

Files correlati     : xvaga.dll
Ricompilazione Demo : [ ]
Commento            :
Aggiunto supporto per le Property Grid


git-svn-id: svn://10.65.10.50/trunk@18531 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2009-03-17 11:02:30 +00:00
parent d626f6d0f2
commit 10d04217ca
13 changed files with 826 additions and 1089 deletions

View File

@ -1,51 +1,27 @@
PAGE "Colori delle righe di prima nota" -1 -1 42 10
PAGE "Colori delle righe" -1 -1 42 10
SPREADSHEET 101 -1 -3
PROPERTIES DLG_USER 0 0
BEGIN
PROMPT 1 1 "Colori"
ITEM "Colore@32"
FLAGS "D"
PROMPT 0 0 "Colori"
END
BUTTON 102 10 2
ENDPAGE
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT -13 -1 "A~zzera"
PROMPT 1 -1 ""
END
BUTTON DLG_CANCEL 10 2
BUTTON DLG_DELREC 2 2
BEGIN
PROMPT -23 -1 ""
PROMPT 2 -1 "A~zzera"
END
BUTTON DLG_OK 10 2
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT -33 -1 ""
END
ENDPAGE
ENDMASK
PAGE "Colore" -1 -1 40 10
STRING 101 32
BEGIN
PROMPT 1 1 "Tipo "
END
BUTTON 100 14 2
BEGIN
PROMPT 2 5 "~Sfondo"
END
BUTTON 99 14 2
BEGIN
PROMPT 22 5 "~Testo"
END
BUTTON DLG_OK 14 2
BEGIN
PROMPT -11 -1 ""
PROMPT 3 -1 ""
END
ENDPAGE

View File

@ -54,6 +54,7 @@
#define CLASS_GOLEM_CLIENT_FIELD 252
#define CLASS_OUTLOOK_FIELD 253
#define CLASS_SLIDER_FIELD 254
#define CLASS_PROP_FIELD 255
#define CLASS_TOOL_FIELD 280
#define CLASS_BUTTON_TOOL 281

View File

@ -1,45 +1,35 @@
#ifndef __COLMASK_H
#define __COLMASK_H
#ifndef __ASSOC_H
#include <assoc.h>
#endif
#ifndef __AUTOMASK_H
#include <automask.h>
#endif
#ifndef __COLORS_H
#include <colors.h>
#endif
#ifndef __VARMASK_H
#include <varmask.h>
#endif
class TColor_row_mask;
class TColor_object_props;
class TSelect_color_mask : public TVariable_mask
class TSelect_color_mask : public TAutomask
{
TColor_row_mask * _sheet_mask;
TArray _color_defs;
TFilename _mask_name;
TAssoc_array _color_defs;
TString _paragraph;
HIDDEN TMask * get_mask(int, TMask&);
TColor_object_props * row(int r) const { return (TColor_object_props *) _color_defs.objptr(r);}
int items() const { return _color_defs.items();}
protected:
void init(const char * mask_name, const char * para = NULL);
static bool color_handler(TMask_field& f, KEY k);
static bool reset_handler(TMask_field& f, KEY k);
void save() const ;
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void init(const char* mask_name, const char* para = NULL);
void save() const;
public:
int add_color_def(const char * key, const char * prompt, COLOR back = NORMAL_BACK_COLOR, COLOR fore = NORMAL_COLOR);
void get_color_def(const char * key, COLOR & back, COLOR & fore) const ;
void get_cur_colors(COLOR & back, COLOR & fore) const ;
int key2pos(const char * key) const;
COLOR get_back_color(int pos) const;
COLOR get_fore_color(int pos) const;
void add_color(const char* key, const char* prompt, COLOR back, COLOR fore, COLOR def_back, COLOR def_fore);
void add_color_def(const char* key, const char* prompt, COLOR back = NORMAL_BACK_COLOR, COLOR fore = NORMAL_COLOR);
bool get_color(const char* key, COLOR& back, COLOR& fore) const;
TSelect_color_mask(const char * mask_name, const char * para = NULL);
TSelect_color_mask(const TSheet_field & field);
virtual ~TSelect_color_mask();
TSelect_color_mask(const char* mask_name, const char* para = NULL);
// TSelect_color_mask(const TSheet_field& field);
};
#endif

View File

@ -1,6 +1,8 @@
#include <colmask.h>
#include <config.h>
#include <defmask.h>
#include <diction.h>
#include <treectrl.h>
COLOR RGB2COLOR(unsigned char red, unsigned char green, unsigned char blue)
{
@ -40,238 +42,186 @@ COLOR grayed_color(COLOR col)
return RGB2COLOR(k, k, k);
}
class TColor_row_mask : public TMask
{
public:
virtual void update();
TColor_row_mask();
virtual ~TColor_row_mask() { }
};
///////////////////////////////////////////////////////////
// TColor_row_mask
///////////////////////////////////////////////////////////
TColor_row_mask::TColor_row_mask() : TMask("bagn007", 1)
{ }
void TColor_row_mask::update()
{
TSheet_field* s = get_sheet();
if (s == NULL)
return;
TSelect_color_mask& m = (TSelect_color_mask&)s->mask();
COLOR back, fore;
m.get_cur_colors(back, fore);
_pixmap = TRUE;
set_pen(COLOR_BLACK);
RCT rct; field(100).get_rect(rct);
set_brush(back);
frame(rct.left, 2*rct.top - rct.bottom - CHARY/2, rct.right, rct.top - CHARY/2, 0);
field(99).get_rect(rct);
set_brush(fore);
frame(rct.left, 2*rct.top - rct.bottom - CHARY/2, rct.right, rct.top - CHARY/2, 0);
_pixmap = FALSE;
}
///////////////////////////////////////////////////////////
// TColor_object_props
///////////////////////////////////////////////////////////
class TColor_object_props : public TObject
{
TString _key;
TString _prompt;
COLOR _back;
COLOR _fore;
COLOR _back_def;
COLOR _fore_def;
COLOR _back, _fore, _back_def, _fore_def;
protected:
public:
void set_key(const char * key) { _key = key; }
void set_prompt(const char * prompt) { _prompt = prompt; }
void set_back(COLOR back) { _back = back; }
void set_fore(COLOR fore) { _fore = fore; }
void set(COLOR back, COLOR fore) { set_back(back); set_fore(fore); }
void set_back_def(COLOR back) { _back_def = back; }
void set_fore_def(COLOR fore) { _fore_def = fore; }
void set_def(COLOR back, COLOR fore) { set_back_def(back); set_fore_def(fore); }
const TString & get_key() const { return _key; }
const TString & get_prompt() const { return _prompt; }
COLOR get_back() const { return _back; }
COLOR get_fore() const { return _fore; }
COLOR get_back_def() const { return _back_def; }
COLOR get_fore_def() const { return _fore_def; }
TColor_object_props(const char * key, const char * prompt, COLOR back, COLOR fore);
virtual ~TColor_object_props() {}
TColor_object_props(COLOR back, COLOR fore);
};
TColor_object_props::TColor_object_props(const char * key, const char * prompt, COLOR back, COLOR fore)
: _key(key), _prompt(prompt), _back(back), _fore(fore), _back_def(back), _fore_def(fore)
{
}
TColor_object_props::TColor_object_props(COLOR back, COLOR fore)
: _back(back), _fore(fore), _back_def(back), _fore_def(fore)
{ }
///////////////////////////////////////////////////////////
// TSelect_color_mask
///////////////////////////////////////////////////////////
bool TSelect_color_mask::color_handler(TMask_field& f, KEY k)
bool TSelect_color_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
if (k == K_SPACE)
{
TMask& m = f.mask();
TSelect_color_mask& cm = (TSelect_color_mask&)m.get_sheet()->mask();
TSheet_field& s = cm.sfield(101);
const int cur = s.selected();
TColor_object_props & p = *cm.row(cur);
const bool use_back = f.dlg() == 100;
COLOR col = use_back ? p.get_back() : p.get_fore();
col = choose_color(col, m.win());
if (col != COLOR_INVALID)
{
if (use_back)
p.set_back(col);
else
p.set_fore(col);
xvt_dwin_invalidate_rect(f.parent(), NULL);
m.set_focus();
s.set_back_and_fore_color(p.get_back(), p.get_fore(), cur);
s.force_update();
}
}
return TRUE;
}
bool TSelect_color_mask::reset_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE && f.yesno_box(TR("Si desidera azzerare tutti i colori?")))
{
TSelect_color_mask& cm = (TSelect_color_mask&)f.mask();
TSheet_field& s = cm.sfield(101);
const int items = cm.items();
for (int i = 0; i < items; i++)
{
TColor_object_props & p = *cm.row(i);
const COLOR back = p.get_back_def();
const COLOR fore = p.get_fore_def();
p.set_back(back);
p.set_fore(fore);
s.set_back_and_fore_color(back, fore, i);
}
s.force_update();
}
if (k == K_ENTER)
switch (o.dlg())
{
TSelect_color_mask& cm = (TSelect_color_mask&)f.mask();
cm.save();
case DLG_DELREC:
if (e == fe_button)
{
TProp_field& g = (TProp_field&)field(DLG_USER);
g.freeze(true);
TString name;
FOR_EACH_ASSOC_OBJECT(_color_defs, h, k, o)
{
const TColor_object_props& p = *(const TColor_object_props*)o;
name = k; name << "_Bg";
g.set_property(name, p.get_back_def());
name.rtrim(3); name << "_Fg";
g.set_property(name, p.get_fore_def());
}
g.freeze(false);
return false;
}
break;
case DLG_USER:
if (e == fe_init)
{
TProp_field& g = (TProp_field&)o;
g.freeze(true);
xvt_vobj_maximize(g.win().win());
g.freeze(false);
} else
if (e == fe_close)
{
TProp_field& g = (TProp_field&)o;
TString name;
FOR_EACH_ASSOC_OBJECT(_color_defs, h, k, o)
{
TColor_object_props& p = *(TColor_object_props*)o;
name = k; name << "_Bg";
p.set_back(g.get_color_property(name));
name.rtrim(3); name << "_Fg";
p.set_fore(g.get_color_property(name));
}
save();
}
break;
default: break;
}
return TRUE;
return true;
}
int TSelect_color_mask::add_color_def(const char* key, const char* prompt, COLOR back, COLOR fore)
void TSelect_color_mask::add_color(const char* key, const char* prompt, COLOR back, COLOR fore, COLOR def_back, COLOR def_fore)
{
TColor_object_props * p = new TColor_object_props(key, prompt, back, fore);
TSheet_field& s = sfield(101);
TString80 name = key;
if (name.find(' ')>=0)
{
CHECKS(FALSE, "Lamentati con Guy se la variabile viene rifiutata ", key);
name.strip_double_spaces();
name.replace(' ', '_');
}
const int row = _color_defs.add(p);
TProp_field& g = (TProp_field&)field(DLG_USER);
TColor_object_props* p = (TColor_object_props*)_color_defs.objptr(name);
if (p == NULL)
{
p = new TColor_object_props(def_back, def_fore);
_color_defs.add(name, p, true);
TToken_string& riga = s.row(-1);
riga << p->get_prompt();
g.set_property(name, (char*)NULL, prompt); // Categoria
}
else
p->set_def(back, fore);
p->set(back, fore);
TString tmp(_mask_name) ; tmp << "_" << _paragraph;
TConfig conf(CONFIG_GUI, tmp);
tmp = p->get_key();
if (conf.exist(tmp))
p->set_fore(conf.get_color(tmp));
tmp << "_Bg";
if (conf.exist(tmp))
p->set_back(conf.get_color(tmp));
name << "_Bg";
g.set_property(name, back, TR("Sfondo")); // Sfondo
name.rtrim(3); name << "_Fg";
g.set_property(name, fore, TR("Testo")); // Testo
}
s.set_back_and_fore_color(p->get_back(), p->get_fore(), row);
return row;
void TSelect_color_mask::add_color_def(const char* key, const char* prompt, COLOR def_back, COLOR def_fore)
{
COLOR back = def_back;
COLOR fore = def_fore;
TConfig conf(CONFIG_GUI, _paragraph); // Ha una possibile personalizzazione?
conf.write_protect();
if (!conf.new_paragraph())
{
TString80 name = key;
fore = conf.get_color(name, NULL, -1, def_fore);
name << "_Bg";
back = conf.get_color(name, NULL, -1, def_back);
}
add_color(key, prompt, back, fore, def_back, def_fore);
}
void TSelect_color_mask::get_color_def(const char * key, COLOR & back, COLOR & fore) const
bool TSelect_color_mask::get_color(const char* key, COLOR & back, COLOR & fore) const
{
const int pos = key2pos(key);
if (pos >= 0)
const TColor_object_props* p = (const TColor_object_props*)_color_defs.objptr(key);
if (p != NULL)
{
back = get_back_color(pos);
fore = get_fore_color(pos);
back = p->get_back();
fore = p->get_fore();
}
else
{
back = NORMAL_BACK_COLOR;
fore = NORMAL_COLOR;
}
return p != NULL;
}
int TSelect_color_mask::key2pos(const char * key) const
{
const int items = _color_defs.items();
for (int i = 0; i < items; i++)
if (((TColor_object_props &) _color_defs[i]).get_key() == key)
return i;
return -1;
}
COLOR TSelect_color_mask::get_back_color(int pos) const
{
return ((TColor_object_props &) _color_defs[pos]).get_back();
}
COLOR TSelect_color_mask::get_fore_color(int pos) const
{
return ((TColor_object_props &) _color_defs[pos]).get_fore();
}
TMask * TSelect_color_mask::get_mask(int, TMask& m)
{
return ((TSelect_color_mask &) m.get_sheet()->mask())._sheet_mask;
}
void TSelect_color_mask::get_cur_colors(COLOR & back, COLOR & fore) const
{
TSheet_field& s = sfield(101);
int cur = s.selected();
TColor_object_props & p = *row(cur);
back = p.get_back();
fore = p.get_fore();
}
void TSelect_color_mask::init(const char * mask_name, const char * para)
void TSelect_color_mask::init(const char* mask_name, const char* para)
{
set_handler(102, reset_handler);
_sheet_mask = new TColor_row_mask;
_sheet_mask->set_handler(99, color_handler);
_sheet_mask->set_handler(100, color_handler);
TVariable_sheet_field& s = (TVariable_sheet_field&) sfield(101);
s.set_getmask(get_mask);
_mask_name = mask_name;
_mask_name.ext("");
_paragraph = para;
const TFilename fn(mask_name);
_paragraph << fn.name_only() << '_' << para;
_paragraph.lower();
}
TSelect_color_mask::TSelect_color_mask(const TSheet_field & field)
: TVariable_mask("bagn007")
void TSelect_color_mask::save() const
{
TConfig conf(CONFIG_GUI, _paragraph);
TString tmp;
TAssoc_array& ass = (TAssoc_array&)_color_defs; // Fool const
FOR_EACH_ASSOC_OBJECT(ass, h, k, o)
{
const TColor_object_props& p = *(const TColor_object_props*)o;
tmp = k; // tmp = p.get_key();
if (same_color(p.get_fore(), p.get_fore_def()))
conf.remove(tmp);
else
conf.set_color(tmp, p.get_fore());
tmp << "_Bg";
if (same_color(p.get_back(), p.get_back_def()))
conf.remove(tmp);
else
conf.set_color(tmp, p.get_back());
}
}
/*
TSelect_color_mask::TSelect_color_mask(const TSheet_field & field) : TAutomask("bagn007")
{
const TMask& m = field.mask();
TString16 para("Colors");
@ -280,38 +230,10 @@ TSelect_color_mask::TSelect_color_mask(const TSheet_field & field)
para << num;
init(m.source_file(), para);
}
void TSelect_color_mask::save() const
{
TString tmp(_mask_name) ; tmp << "_" << _paragraph;
TConfig conf(CONFIG_GUI, tmp);
const int items = _color_defs.items();
for (int i = 0; i < items; i++)
{
TColor_object_props & p = *row(i);
tmp = p.get_key();
if (p.get_fore() == p.get_fore_def())
conf.remove(tmp);
else
conf.set_color(tmp, p.get_fore());
*/
tmp << "_Bg";
if (p.get_back() == p.get_back_def())
conf.remove(tmp);
else
conf.set_color(tmp, p.get_back());
}
}
TSelect_color_mask::TSelect_color_mask(const char * mask_name, const char * para)
: TVariable_mask("bagn007")
TSelect_color_mask::TSelect_color_mask(const char* mask_name, const char* para)
: TAutomask("bagn007")
{
init(mask_name, para);
}
TSelect_color_mask::~TSelect_color_mask()
{
delete _sheet_mask;
}

View File

@ -333,7 +333,7 @@ char TConfig::get_char(
const char* var, // @parm Variabile della quale ritornare il valore
const char* section, // @parm Sezione della varaibile (default NULL)
int index, // @parm Eventuale indice della varaibailie (default -1)
char def) // @parm Valore default della varaibile (default ' ')
char def) // @parm Valore default della variabile (default ' ')
// @comm Passando <p index> <gt>= 0 viene appeso al nome variabile per
// implementare un array.
@ -684,21 +684,21 @@ int TConfig::for_each_paragraph(CONFIG_CALLBACK cfgcb, void* jolly)
return count;
}
TConfig::TConfig(int which_config, const char* paragraph)
static void cfg2file(int which_config, TFilename& file)
{
switch (which_config)
{
case CONFIG_DITTA:
_file = firm2dir(prefix().get_codditta());
_file.add("ditta.ini");
if (!_file.exist())
file = firm2dir(prefix().get_codditta());
file.add("ditta.ini");
if (!file.exist())
{
TFilename oldfile = _file;
TFilename oldfile = file;
const int pos = oldfile.find("ditta.ini");
oldfile.cut(pos);
oldfile.add("prassid.ini"); // Old config file!
if (oldfile.exist())
fcopy(oldfile, _file);
fcopy(oldfile, file);
}
break;
case CONFIG_STUDIO:
@ -706,35 +706,35 @@ TConfig::TConfig(int which_config, const char* paragraph)
case CONFIG_GUI:
case CONFIG_USER:
case CONFIG_WST:
_file = firm2dir(-1); // Directory dati
_file.add("config"); // + Directory config
if (!_file.exist()) // Creala se necessario
make_dir(_file);
file = firm2dir(-1); // Directory dati
file.add("config"); // + Directory config
if (!file.exist()) // Creala se necessario
make_dir(file);
switch (which_config)
{
case CONFIG_STUDIO:
_file.add("studio.ini");
if (!_file.exist())
file.add("studio.ini");
if (!file.exist())
{
TFilename oldfile = _file;
TFilename oldfile = file;
const int pos = oldfile.find("studio.ini");
oldfile.cut(pos);
oldfile.add("prassis.ini"); // Old config file!
if (oldfile.exist())
fcopy(oldfile, _file);
fcopy(oldfile, file);
}
break;
case CONFIG_STAMPE:
_file.add("print.ini");
file.add("print.ini");
break;
case CONFIG_GUI:
{
TFilename gui = "gui.ini";
if (gui.custom_path())
{
_file = gui; // I colori sono qui ...
break; // ... scavalca utente
file = gui; // I colori sono qui ...
break; // ... scavalca utente
}
}
case CONFIG_USER:
@ -743,13 +743,13 @@ TConfig::TConfig(int which_config, const char* paragraph)
if (u.blank())
u = ::dongle().administrator();
u.lower();
_file.add(u);
_file.ext("ini");
if (u != "admin" && !_file.exist())
file.add(u);
file.ext("ini");
if (u != "admin" && !file.exist())
{
TFilename prassi = _file.path();
TFilename prassi = file.path();
prassi.add("admin.ini");
fcopy(prassi, _file);
fcopy(prassi, file);
}
}
break;
@ -759,26 +759,31 @@ TConfig::TConfig(int which_config, const char* paragraph)
if (u.blank())
u = "localhost";
u.lower();
_file.add(u);
_file.ext("ini");
file.add(u);
file.ext("ini");
}
default:
break;
}
break;
case CONFIG_FCONV:
_file = "fconv.ini";
file = "fconv.ini";
break;
case CONFIG_INSTALL:
_file = CGetCampoIni();
file = CGetCampoIni();
break;
case CONFIG_OEM:
_file = "setup/oem.ini";
file = "setup/oem.ini";
break;
default:
NFCHECK("Chi usa questo strano .ini?");
break;
}
}
TConfig::TConfig(int which_config, const char* paragraph)
{
cfg2file(which_config, _file);
init(_file, paragraph);
}
@ -792,7 +797,7 @@ TConfig::TConfig(const char *fn, const char* pa)
TConfig::~TConfig()
{
// il distruttore riscrive il file con le modifiche se necessario
if (_dirty)
if (_dirty && !_write_protected)
_write_file();
}
@ -800,14 +805,67 @@ TConfig::~TConfig()
// Utilities
///////////////////////////////////////////////////////////
#define DECLARE_VARNAME(name, idx) const char* varname = idx >= 0 ? (const char*)(get_tmp_string() << name << '(' << idx << ')') : name
#define DECLARE_FILENAME(cfg) TFilename filename; cfg2file(cfg, filename)
const TString& ini_get_string(const char* file, const char* paragraph, const char* name, const char* defval, int idx)
{
DECLARE_VARNAME(name, idx);
TString& tmp = get_tmp_string();
const int len = xvt_sys_get_profile_string(file, paragraph, varname, defval, tmp.get_buffer(), tmp.size());
if (len > tmp.size())
{
tmp.get_buffer(len);
xvt_sys_get_profile_string(file, paragraph, varname, defval, tmp.get_buffer(), tmp.size());
}
return tmp;
}
bool ini_set_string(const char* file, const char* paragraph, const char* name, const char* val, int idx)
{
DECLARE_VARNAME(name, idx);
return xvt_sys_set_profile_string(file, paragraph, varname, val) != 0;
}
int ini_get_int(const char* file, const char* paragraph, const char* name, int defval, int idx)
{
DECLARE_VARNAME(name, idx);
return xvt_sys_get_profile_int(file, paragraph, varname, defval);
}
bool ini_set_int(const char* file, const char* paragraph, const char* name, int val, int idx)
{
TString16 value; value << val;
return ini_set_string(file, paragraph, name, value, idx);
}
const TString& ini_get_string(int cfg, const char* paragraph, const char* name, const char* defval, int idx)
{
DECLARE_FILENAME(cfg);
return ini_get_string(filename, paragraph, name, defval, idx);
}
bool ini_set_string(int cfg, const char* paragraph, const char* name, const char* val, int idx)
{
DECLARE_FILENAME(cfg);
return ini_set_string(filename, paragraph, name, val);
}
int ini_get_int(int cfg, const char* paragraph, const char* name, int defval, int idx)
{
DECLARE_FILENAME(cfg);
return ini_get_int(filename, paragraph, name, defval, idx);
}
bool ini_set_int(int cfg, const char* paragraph, const char* name, int val, int idx)
{
DECLARE_FILENAME(cfg);
return ini_set_int(filename, paragraph, name, val, idx);
}
const TString& get_oem_info(const char* varname)
{
TConfig ini(CONFIG_OEM, "MAIN");
const int oem = ini.get_int("OEM", NULL, -1);
if (oem >= 0)
{
TString8 str; str.format("OEM_%d", oem);
return get_tmp_string() = ini.get(varname, str);
}
return EMPTY_STRING;
static int oem = ini_get_int(CONFIG_OEM, "MAIN", "OEM");
TString8 para; para.format("OEM_%d", oem);
return ini_get_string(CONFIG_OEM, para, varname);
}

View File

@ -5,7 +5,6 @@
#include <assoc.h>
#endif
// class ofstream;
class TConfig;
// questo sara' il principale, per ora non c'e'
@ -177,6 +176,18 @@ public:
virtual ~TConfig();
};
const TString& get_oem_info(const char* varname);
// Low level utilities
int ini_get_int (const char* file, const char* para, const char* name, int defval = 0, int idx = -1);
const TString& ini_get_string(const char* file, const char* para, const char* name, const char* defval = "", int idx = -1);
bool ini_set_int (const char* file, const char* para, const char* name, int val, int idx = -1);
bool ini_set_string(const char* file, const char* para, const char* name, const char* val, int idx = -1);
// High level utilities
int ini_get_int (int cfg, const char* para, const char* name, int defval = 0, int idx = -1);
const TString& ini_get_string(int cfg, const char* para, const char* name, const char* defval = "", int idx = -1);
bool ini_set_int (int cfg, const char* para, const char* name, int val, int idx = -1);
bool ini_set_string(int cfg, const char* para, const char* name, const char* val, int idx = -1);
const TString& get_oem_info(const char* varname); // ini_get_string(CONFIG_OEM, "OEM_?", varname);
#endif

View File

@ -879,12 +879,17 @@ void TMask::handler(WINDOW w, EVENT* ep)
break;
case WC_HSCROLL:
case WC_VSCROLL:
if (id2pos(ep->v.ctl.id) >= 0) // potrebbero non avere un controllo associato
field(ep->v.ctl.id).on_key(K_SPACE);
break;
if (id2pos(ep->v.ctl.id) < 0) // potrebbero non avere un controllo associato
break;
// fall down
case WC_HSLIDER:
case WC_VSLIDER:
field(ep->v.ctl.id).on_key(K_SPACE);
case WC_PROPGRID:
{
TMask_field& f = field(ep->v.ctl.id);
f.set_focusdirty();
f.on_key(K_SPACE);
}
break;
default:
break;
@ -1059,24 +1064,25 @@ int TMask::win2page(WINDOW w) const
TMask_field* TMask::parse_field(TScanner& scanner)
{
const TString& k = scanner.key();
if (k == "ST") return new TEdit_field(this);
if (k == "NU") return new TReal_field(this);
if (k == "DA") return new TDate_field(this);
if (k == "BO") return new TBoolean_field(this);
if (k == "TE") return new TText_field(this);
if (k == "BR") return new TBrowsefile_field(this);
if (k == "BU") return new TButton_field(this);
if (k == "CL") return new TGolem_client_field(this);
if (k == "CU") return new TCurrency_field(this);
if (k == "DA") return new TDate_field(this);
if (k == "GO") return new TGolem_field(this);
if (k == "GR") return new TGroup_field(this);
if (k == "LI") return new TList_field(this);
if (k == "RA") return new TRadio_field(this);
if (k == "CU") return new TCurrency_field(this);
if (k == "ME") return new TMemo_field(this);
if (k == "ZO") return new TZoom_field(this);
if (k == "GO") return new TGolem_field(this);
if (k == "BR") return new TBrowsefile_field(this);
if (k == "SP") return new TSheet_field(this);
if (k == "TR") return new TTree_field(this);
if (k == "CL") return new TGolem_client_field(this);
if (k == "NU") return new TReal_field(this);
if (k == "PR") return new TProp_field(this);
if (k == "RA") return new TRadio_field(this);
if (k == "SL") return new TSlider_field(this);
if (k == "SP") return new TSheet_field(this);
if (k == "ST") return new TEdit_field(this);
if (k == "TE") return new TText_field(this);
if (k == "TR") return new TTree_field(this);
if (k == "ZO") return new TZoom_field(this);
return NULL;
}

View File

@ -50,8 +50,8 @@ public:
bool card_connected() const { return _card_connected; }
const bool with_card(const TMask & m) { return m.get_bool(_check_field); }
smartcard_error connect_card();
smartcard_error disconnect_card();
smartcard_error connect_card();
smartcard_error disconnect_card();
smartcard_error read();
smartcard_error write() const ;

View File

@ -3,6 +3,7 @@
#include <colors.h>
#include <controls.h>
#include <diction.h>
#include <image.h>
#include <mask.h>
#include <tree.h>
@ -196,697 +197,6 @@ TWindowed_field::~TWindowed_field()
delete _win;
}
#ifdef AGA_TREE
///////////////////////////////////////////////////////////
// TNode_info
///////////////////////////////////////////////////////////
class TNode_info : public TSortable
{
public:
bool _valid : 1;
bool _enabled : 1;
bool _expandable : 1;
bool _expanded : 1;
TString _id;
long _plusx;
long _startx;
long _endx;
const TNode_info& operator =(const TNode_info& ni)
{
_valid = ni._valid;
_enabled = ni._enabled;
_expanded = ni._expanded;
_expandable = ni._expandable;
_id = ni._id;
_plusx = ni._plusx;
_startx = ni._startx;
_endx = ni._endx;
return ni;
}
virtual int compare(const TSortable& s) const
{
const TNode_info& ni = (const TNode_info&)s;
return _id.compare(ni._id);
}
virtual bool ok() const { return _valid; }
void reset() { _valid = false; }
TNode_info() : _valid(false) { }
virtual ~TNode_info() { }
};
class TNode_info_array : public TObject
{
TArray _data;
public:
int last() const;
int find(const TNode_info& ni) const;
TNode_info& operator[](int index);
const TNode_info& operator[](int index) const
{ return (const TNode_info&)_data[index]; }
void reset();
};
TNode_info& TNode_info_array::operator[](int index)
{
CHECKD(index >= 0, "Bad index ", index);
TNode_info* ni = (TNode_info*)_data.objptr(index);
if (ni == NULL)
{
ni = new TNode_info;
_data.add(ni, index);
}
return *ni;
}
void TNode_info_array::reset()
{
for (int i = _data.last(); i >= 0; i = _data.pred(i))
((TNode_info*)_data.objptr(i))->reset();
}
int TNode_info_array::last() const
{
int i;
for (i = _data.last(); i >= 0; i = _data.pred(i))
if (_data[i].ok())
break;
return i;
}
int TNode_info_array::find(const TNode_info& ni) const
{
int i;
for (i = last(); i >= 0; i = _data.pred(i))
{
if (((TNode_info*)_data.objptr(i))->compare(ni) == 0)
break;
}
return i;
}
///////////////////////////////////////////////////////////
// TTree_window
///////////////////////////////////////////////////////////
class TTree_window : public TField_window
{
TTree* _tree;
bool _hide_leaves;
long _first_line; // Prima riga disegnata
TNode_info_array _node_info;
TNode_info _curr_info; // Nodo attualmente selezionato
TAuto_token_string _header;
int _headlines;
/*static*/ int _row_height;
static bool _tree_locked;
protected: // TWindow
virtual void update();
virtual bool on_key(KEY key);
virtual void handler(WINDOW win, EVENT* ep);
int row_height() const { return _row_height; }
PNT log2dev(long x, long y) const;
TPoint dev2log(const PNT& p) const;
protected: // Internal use
static bool callback_draw_node(TTree& node, void* jolly, word);
void update_header();
void draw_plus_minus();
void draw_text(int x, int y, const TString& str);
int info2index(const TNode_info& ni) const;
bool index2info(long index, TNode_info& ni);
public:
TTree* tree() const { return _tree; }
void set_tree(TTree* tree) { _tree = tree; _first_line = -1; }
void hide_leaves(bool yes) { _hide_leaves = yes; }
bool select_current();
bool goto_selected();
void set_header(const char* head);
void set_row_height(int rh);
TTree_window(int x, int y, int dx, int dy,
WINDOW parent, TTree_field* owner);
virtual ~TTree_window() { }
};
bool TTree_window::_tree_locked = false;
const int TABX = 3;
struct TUpdate_info
{
TTree_window* _win;
TToken_string _str;
long _x, _y;
long _firsty, _lasty;
long _jolly;
int _headlines;
TNode_info_array* _node_info;
TNode_info* _curr_info;
};
PNT TTree_window::log2dev(long x, long y) const
{
if (_headlines > 0)
y += _headlines;
if (autoscrolling())
{
if (_pixmap)
{
x -= origin().x * CHARX;
y -= origin().y * _row_height;
}
else
{
x -= origin().x;
y -= origin().y;
}
}
PNT pnt; pnt.h = (int)x; pnt.v = (int)y;
if (!_pixmap)
{
pnt.h *= CHARX;
pnt.v *= _row_height;
}
return pnt;
}
TPoint TTree_window::dev2log(const PNT& dp) const
{
PNT p = dp;
if (_headlines > 0)
p.v -= _headlines * _row_height;
TPoint pnt(_pixmap ? p.h : p.h/CHARX, _pixmap ? p.v : p.v/_row_height);
return pnt;
}
void TTree_window::draw_text(int x, int y, const TString& str)
{
int start = 0, pos = 0;
while (pos >= 0)
{
pos = str.find(" ", start);
const TString& mid = str.sub(start, pos);
if (!mid.blank())
stringat(x + start, y, mid);
start = pos+2;
}
}
bool TTree_window::callback_draw_node(TTree& node, void* jolly, word when)
{
TUpdate_info* ui = (TUpdate_info*)jolly;
if (when == SCAN_PRE_ORDER)
{
if (ui->_y >= ui->_firsty && ui->_y <= ui->_lasty)
{
node.curr_id(ui->_str);
const bool is_selected = ui->_str == ui->_curr_info->_id;
const bool is_enabled = node.enabled();
const bool is_marked = node.marked();
int text_len = 0;
if (node.get_description(ui->_str))
{
text_len = ui->_str.len();
if (is_selected)
ui->_win->set_color(FOCUS_COLOR, FOCUS_BACK_COLOR);
else
ui->_win->set_color(is_enabled ? NORMAL_COLOR : DISABLED_COLOR,
is_marked ? REQUIRED_BACK_COLOR : NORMAL_BACK_COLOR);
ui->_win->draw_text(int(ui->_x+2), int(ui->_y), ui->_str);
}
const int ry = int(ui->_y - ui->_firsty);
int by;
for (by = ry-1; by >= 0; by--)
{
long rx = (*ui->_node_info)[by]._startx;
if (rx < ui->_x)
break;
}
const PNT p = ui->_win->log2dev(ui->_x, ui->_y);
const WINDOW win = ui->_win->win();
ui->_win->set_pen(DISABLED_BACK_COLOR);
const int rh = ui->_win->row_height();
PNT q;
q.h = p.h; q.v = p.v + rh/2;
xvt_dwin_draw_set_pos(win, q);
q.h -= TABX*CHARX - 3*CHARX/2;
xvt_dwin_draw_line(win, q);
q.v = (by+1+ui->_headlines)*rh;
xvt_dwin_draw_line(win, q);
TImage* bmp = node.image(is_selected);
if (bmp)
{
const int x = p.h;
const int y = p.v + (rh - bmp->height()) / 2;
if (is_enabled)
bmp->draw(win, x, y);
else
{
TImage dis(*bmp);
for (int j = dis.height()-1; j >= 0; j--)
for (int i = dis.width() - (j&1 ? 2 : 1); i >= 0; i-=2)
dis.set_pixel(i, j, NORMAL_BACK_COLOR);
dis.draw(win, x, y);
}
}
TNode_info& ni = (*ui->_node_info)[ry];
node.curr_id(ni._id);
ni._valid = true;
ni._startx = ui->_x;
ni._endx = ui->_x + text_len + 2;
ni._enabled = is_enabled;
ni._expandable = is_enabled && node.has_son();
if (ni._expandable)
{
ni._plusx = ui->_x - TABX + 1;
ni._expanded = node.expanded();
}
else
{
ni._plusx = 0;
ni._expanded = false;
}
}
ui->_y++;
ui->_x += TABX;
if (ui->_x > ui->_jolly)
ui->_jolly = ui->_x;
} else
if (when == SCAN_IN_ORDER)
{
ui->_x -= TABX;
if (ui->_y > ui->_lasty)
return true;
}
return false;
}
void TTree_window::draw_plus_minus()
{
const long firsty = origin().y;
const int last_drawn = _node_info.last();
for (int i = last_drawn; i >= 0; i--)
{
TNode_info& ni = _node_info[i];
if (ni._plusx > 0)
{
if (ni._expanded)
{
bool spudorato = i == last_drawn; // Falso espandibile
if (!spudorato)
{
const TNode_info& nni = _node_info[i+1];
spudorato = nni._startx <= ni._startx;
}
if (spudorato)
{
ni._expandable = false;
ni._expanded = false;
ni._plusx = 0;
continue;
}
}
WINDOW w = win();
PNT r = log2dev(ni._plusx, firsty + i);
r.v += _row_height/2;
r.h += CHARX/2;
RCT rct;
rct.left = r.h - 4;
rct.top = r.v - 4;
rct.right = r.h + 5;
rct.bottom = r.v + 5;
set_pen(NORMAL_COLOR);
set_brush(NORMAL_BACK_COLOR);
xvt_dwin_draw_rect(w, &rct);
PNT f, t;
f.h = rct.left+2; f.v = r.v;
t.h = rct.right+-2; t.v = r.v;
xvt_dwin_draw_set_pos(w, f);
xvt_dwin_draw_line(w, t);
if (!ni._expanded)
{
f.h = r.h; f.v = rct.top+2;
t.h = r.h; t.v = rct.bottom-2;
xvt_dwin_draw_set_pos(w, f);
xvt_dwin_draw_line(w, t);
}
}
}
}
void TTree_window::set_header(const char* head)
{
_header = head;
_headlines = _header.items();
}
void TTree_window::update_header()
{
if (_headlines > 0)
{
autoscroll(false);
set_brush(MASK_BACK_COLOR);
bar(0,-_headlines,columns(),0);
autoscroll(true);
set_opaque_text(false);
for (int i = 0; i < _headlines; i++)
{
const TFixed_string str(_header.get(i));
draw_text(2, int(origin().y+i-_headlines), str);
}
}
}
void TTree_window::update()
{
TField_window::update();
if (_tree == NULL)
return;
update_header();
TUpdate_info ui;
ui._win = this;
ui._x = 0;
ui._y = 0;
ui._firsty = origin().y;
ui._lasty = ui._firsty + rows();
ui._jolly = 0;
ui._headlines = _headlines;
ui._node_info = &_node_info;
ui._curr_info = &_curr_info;
bool ok = false;
if (_first_line > 0)
{
const long index = origin().y - _first_line;
TNode_info ni;
if (index2info(index, ni))
{
ok = _tree->goto_node(ni._id);
ui._x = ni._startx;
ui._y = ui._firsty;
}
}
if (!ok)
{
ok = _tree->goto_root();
if (!ok)
return;
}
_node_info.reset();
set_opaque_text(true);
word flags = SCAN_PRE_ORDER | SCAN_IN_ORDER | SCAN_IGNORING_UNEXPANDED;
if (_hide_leaves) flags |= SCAN_IGNORING_LEAVES;
_tree->scan_depth_first(callback_draw_node, &ui, flags);
while (ui._y < ui._lasty)
{
if (_tree->goto_father())
{
ui._x -= TABX;
if (_tree->goto_rbrother())
_tree->scan_depth_first(callback_draw_node, &ui, flags);
}
else
break;
}
draw_plus_minus();
set_scroll_max(ui._jolly+columns(), ui._y);
_first_line = ui._firsty;
}
// Fa diventare il nodo corrente selezionato
bool TTree_window::select_current()
{
if (_tree)
_tree->curr_id(_curr_info._id);
return _tree != NULL;
}
// Salta al nodo correntemente selezionato
bool TTree_window::goto_selected()
{
bool ok = false;
if (_tree)
ok = _tree->goto_node(_curr_info._id);
return ok;
}
void TTree_window::set_row_height(int rh)
{
if (rh <= 0)
rh = CHARY+2;
_row_height = rh;
}
int TTree_window::info2index(const TNode_info& info) const
{
return _node_info.find(info);
}
bool TTree_window::index2info(long index, TNode_info& ni)
{
bool ok = false;
const int last = _node_info.last();
if (index == -1)
{
if (index2info(0, ni) && _tree->goto_node(ni._id))
{
ok = _tree->goto_lbrother();
if (!ok)
{
ok = _tree->goto_father();
ni._startx -= TABX;
}
if (ok)
_tree->curr_id(ni._id);
}
} else
if (index == last+1 && last >= 0)
{
if (index2info(last, ni) && _tree->goto_node(ni._id))
{
ok = _tree->expanded() && _tree->goto_firstson();
if (ok && _hide_leaves && !_tree->has_son())
{
_tree->goto_node(ni._id); // Ritorno al padre perche' ignoro le foglie
ok = false;
}
if (!ok)
{
ok = _tree->goto_rbrother();
ni._startx += TABX;
}
if (ok)
{
_tree->curr_id(ni._id);
}
}
} else
if (index >= 0 && index <= last)
{
TNode_info& info = _node_info[int(index)];
ok = info.ok();
if (ok)
ni = info;
}
return ok;
}
bool TTree_window::on_key(KEY key)
{
if (_tree == NULL || _tree_locked)
return false;
if (key == K_RIGHT)
{
if (_tree->goto_node(_curr_info._id) &&
!_tree->expanded() && _tree->has_son())
key = K_ENTER;
else
key = K_DOWN;
}
if (key == K_LEFT)
{
if (_tree->goto_node(_curr_info._id) &&
_tree->expanded())
key = K_ENTER;
else
key = K_UP;
}
if (key == K_UP || key == K_DOWN)
{
_tree_locked = true;
int index = info2index(_curr_info);
if (key == K_UP)
index--;
else
index++;
bool ok = false;
bool scroll = false;
TNode_info ni;
if (index2info(index, ni))
{
ok = _tree->goto_node(ni._id);
scroll = ok && (index < 0 || index > _node_info.last());
}
else
{
const int index = key == K_UP ? 0 : _node_info.last();
ok = index2info(index, ni) && _tree->goto_node(ni._id);
}
if (ok && _curr_info != ni)
{
_tree->curr_id(_curr_info._id);
owner().on_key(K_SPACE);
if (!scroll)
{
force_update();
do_events();
}
}
_tree_locked = false;
if (!scroll)
return true;
}
if (key == K_ENTER)
{
_tree_locked = true;
if (_tree->goto_node(_curr_info._id))
{
if (_tree->has_son())
{
bool ok;
if (_tree->expanded())
ok = _tree->shrink();
else
ok = _tree->expand();
if (ok)
{
force_update();
do_events();
// Make sure of being well positioned after the redraw!!!
_tree->goto_node(_curr_info._id);
}
}
owner().on_key(K_CTRL + K_SPACE);
}
_tree_locked = false;
}
return TField_window::on_key(key);
}
void TTree_window::handler(WINDOW win, EVENT* ep)
{
switch(ep->type)
{
case E_MOUSE_DBL:
case E_MOUSE_DOWN:
if (_tree && !_tree_locked)
{
_tree_locked = true;
const TPoint lp = dev2log(ep->v.mouse.where);
const int c = (int)lp.x;
const int r = (int)lp.y;
TNode_info ni;
bool ok = index2info(r, ni);
if (ok && (c == ni._plusx || (c >= ni._startx && c < ni._endx)) &&
_tree->goto_node(ni._id))
{
if (c == ni._plusx || (ni._expandable && ep->type == E_MOUSE_DBL && c <= ni._plusx+3))
{
if (_tree->expanded())
ok = _tree->shrink();
else
ok = _tree->expand();
if (ok)
{
owner().on_key(K_SHIFT + K_SPACE); // Expansion
owner().on_key(K_SPACE); // Selection
}
}
else
{
KEY key = K_SPACE;
if (ep->type == E_MOUSE_DBL)
key += K_CTRL; // Double click selection
owner().on_key(key);
}
if (ok)
{
_curr_info = ni;
force_update();
}
}
_tree_locked = false;
}
break;
default:
TField_window::handler(win, ep);
break;
}
}
TTree_window::TTree_window(int x, int y, int dx, int dy,
WINDOW parent, TTree_field* owner)
: TField_window(x, y, dx, dy, parent, owner), _tree(NULL),
_hide_leaves(false), _headlines(0)
{
set_row_height(-1); // Compute default row height
}
#else
///////////////////////////////////////////////////////////
// TControl_host_window
///////////////////////////////////////////////////////////
@ -1233,8 +543,6 @@ TTree_window::TTree_window(int x, int y, int dx, int dy,
NULL, NULL, NULL, 0, CHARY+2);
}
#endif
///////////////////////////////////////////////////////////
// TTree_field
///////////////////////////////////////////////////////////
@ -1595,3 +903,203 @@ bool TSlider_field::parse_item(TScanner& scanner)
TSlider_field::TSlider_field(TMask* m)
: TWindowed_field(m), _buddy(0), _range_min(ZERO), _range_max(CENTO)
{ }
///////////////////////////////////////////////////////////
// TProp_window
///////////////////////////////////////////////////////////
class TProp_window : public TField_window
{
public:
TProp_window(int x, int y, int dx, int dy, WINDOW parent, TProp_field* owner);
};
TProp_window::TProp_window(int x, int y, int dx, int dy, WINDOW parent, TProp_field* owner)
: TField_window(0, 0, 0, 0, NULL, NULL)
{
XVT_COLOR_COMPONENT xcc[8]; memset(xcc, 0, sizeof(xcc));
xcc[0].type = XVT_COLOR_BACKGROUND;
xcc[0].color = NORMAL_BACK_COLOR;
xcc[1].type = XVT_COLOR_FOREGROUND;
xcc[1].color = NORMAL_COLOR;
xcc[2].type = XVT_COLOR_HIGHLIGHT;
xcc[2].color = FOCUS_BACK_COLOR;
xcc[3].type = XVT_COLOR_SELECT;
xcc[3].color = FOCUS_COLOR;
xcc[4].type = XVT_COLOR_BLEND;
xcc[4].color = MASK_BACK_COLOR;
xcc[5].type = XVT_COLOR_TROUGH;
xcc[5].color = DISABLED_BACK_COLOR;
set_owner(owner);
WIN_DEF wd; memset(&wd, 0, sizeof(wd));
wd.rct = resize_rect(x, y, dx, dy, wd.wtype, parent);
wd.wtype = WC_PROPGRID;
wd.ctlcolors = xcc;
wd.v.ctl.ctrl_id = owner->dlg();
set_win(xvt_ctl_create_def(&wd, parent, 0L));
}
word TProp_field::class_id() const
{ return CLASS_PROP_FIELD; }
bool TProp_field::is_kind_of(word cid) const
{ return cid == CLASS_PROP_FIELD || TWindowed_field::is_kind_of(cid); }
void TProp_field::freeze(bool on)
{
if (on)
xvt_prop_suspend(win().win());
else
xvt_prop_restart(win().win());
}
bool TProp_field::set_property(const char* name, const char* value, const char* label)
{
WINDOW pg = win().win();
XVT_TREEVIEW_NODE node = NULL;
if (name != NULL && value == NULL && label != NULL)
node = xvt_prop_add(pg, NULL, name, NULL, label); // Category!
else
{
if (label && *label)
node = xvt_prop_add(pg, "string", name, value, label); // Add property
else
{
node = xvt_prop_find(win().win(), name);
if (node)
xvt_prop_set_data(pg, node, value); // Set property
}
}
return node != NULL;
}
bool TProp_field::set_property(const char* name, long value, const char* label)
{
bool done = false;
TString16 str; str << value;
if (label && *label)
done = xvt_prop_add(win().win(), "long", name, str, label) != NULL;
else
done = set_property(name, str, label);
return done;
}
bool TProp_field::set_property(const char* name, COLOR value, const char* label)
{
bool done = false;
TString16 str; str << long(value & 0xFFFFFF);
if (label && *label)
done = xvt_prop_add(win().win(), "color", name, str, label) != NULL;
else
done = set_property(name, str, label);
return done;
}
const TString& TProp_field::get_property(const char* name) const
{
WINDOW pg = win().win();
XVT_TREEVIEW_NODE node = xvt_prop_find(pg, name);
if (node)
{
TString& tmp = get_tmp_string();
const int len = xvt_prop_get_data(pg, node, tmp.get_buffer(), tmp.size());
if (len > tmp.size())
xvt_prop_get_data(pg, node, tmp.get_buffer(len), len);
return tmp;
}
return EMPTY_STRING;
}
long TProp_field::get_long_property(const char* name) const
{ return atol(get_property(name)); }
COLOR TProp_field::get_color_property(const char* name) const
{
COLOR col = COLOR_INVALID;
const TString& tmp = get_property(name);
if (tmp.full())
{
col = atol(tmp);
if (col == 0)
col = COLOR_BLACK;
}
return col;
}
static TString_array _items;
bool TProp_field::parse_item(TScanner& scanner)
{
if (scanner.key() == "IT")
{
const TString80 label = dictionary_translate(scanner.string());
TString16 type = scanner.pop();
TString80 name, value;
if (type.starts_with("IT"))
{
type.cut(0);
scanner.push();
}
else
{
const TString& line = scanner.line();
int equal = line.find('=');
if (equal < 0) equal = line.find(' ');
if (equal > 0)
{
name = line.left(equal); name.trim();
value = line.mid(equal+1); value.trim();
if (value[0] == '"') { value.rtrim(1); value.ltrim(1); }
}
else
{
name.trim();
value.cut(0);
}
type.cut(2);
}
TToken_string* item = new TToken_string;
item->add(type); item->add(name); item->add(value); item->add(label,3);
_items.add(item);
return true;
}
return TWindowed_field::parse_item(scanner);
}
TField_window* TProp_field::create_window(int x, int y, int dx, int dy, WINDOW parent)
{
TProp_window* pw = new TProp_window(x, y, dx, dy, parent, this);
if (!_items.empty())
{
WINDOW pg = pw->win();
xvt_prop_suspend(pg);
TString8 type;
TString80 name, value, label;
FOR_EACH_ARRAY_ROW(_items, i, row)
{
row->get(0, type); row->get(1, name);
row->get(2, value); row->get(3, label);
if (type.full())
{
if (type == "CO")
xvt_prop_add(pg, "color", name, value, label); else
if (type == "NU" || type == "CU")
xvt_prop_add(pg, "long", name, value, label);
else
xvt_prop_add(pg, "string", name, value, label);
}
else
xvt_prop_add(pg, "", "", "", label);
}
xvt_prop_restart(pg);
_items.destroy();
}
return pw;
}
TProp_field::TProp_field(TMask* m) : TWindowed_field(m)
{ }

View File

@ -125,4 +125,27 @@ public:
virtual ~TSlider_field() { }
};
class TProp_field : public TWindowed_field
{
protected:
virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent);
virtual bool parse_item(TScanner& scanner);
public:
virtual word class_id() const;
virtual bool is_kind_of(word cid) const;
void freeze(bool on);
bool set_property(const char* name, const char* value, const char* label = NULL);
bool set_property(const char* name, COLOR value, const char* label = NULL);
bool set_property(const char* name, long value, const char* label = NULL);
const TString& get_property(const char* name) const;
COLOR get_color_property(const char* name) const;
long get_long_property(const char* name) const;;
TProp_field(TMask* m);
};
#endif

View File

@ -456,6 +456,14 @@ XVTDLL BOOLEAN xvt_odbc_free_connection(XVT_ODBC handle);
XVTDLL ULONG xvt_odbc_execute(XVT_ODBC handle, const char* sql, ODBC_CALLBACK cb, void* jolly);
XVTDLL BOOLEAN xvt_odbc_driver(XVT_ODBC handle, char* str, int max_size);
XVTDLL XVT_TREEVIEW_NODE xvt_prop_add(WINDOW win, const char* type, const char* name, const char* value, const char* label);
XVTDLL XVT_TREEVIEW_NODE xvt_prop_find(WINDOW win, const char* name);
XVTDLL int xvt_prop_get_string(WINDOW win, XVT_TREEVIEW_NODE node, char* label, int maxlen);
XVTDLL int xvt_prop_get_data(WINDOW win, XVT_TREEVIEW_NODE node, char* value, int maxlen);
XVTDLL BOOLEAN xvt_prop_restart(WINDOW win);
XVTDLL BOOLEAN xvt_prop_set_data(WINDOW win, XVT_TREEVIEW_NODE node, const char* value);
XVTDLL BOOLEAN xvt_prop_suspend(WINDOW win);
XVTDLL BOOLEAN xvt_mail_send(const char* to, const char* cc, const char* ccn,
const char* subject, const char* msg, const char* attach, BOOLEAN ui);

View File

@ -199,42 +199,43 @@ SC_THUMBTRACK /* thumb tracking */
typedef enum { /* type of window */
W_NONE, /* marker for end of WIN_DEF array */
W_DOC, /* document window */
W_PLAIN, /* window with plain border */
W_DBL, /* window with double border */
W_PRINT, /* XVT internal use only */
W_TASK, /* task window */
W_SCREEN, /* screen window */
W_NO_BORDER, /* no border */
W_PIXMAP, /* pixmap */
W_MODAL, /* modal window */
WD_MODAL, /* modal dialog */
WD_MODELESS, /* modeless dialog */
W_NONE, /* marker for end of WIN_DEF array */
W_DOC, /* document window */
W_PLAIN, /* window with plain border */
W_DBL, /* window with double border */
W_PRINT, /* XVT internal use only */
W_TASK, /* task window */
W_SCREEN, /* screen window */
W_NO_BORDER, /* no border */
W_PIXMAP, /* pixmap */
W_MODAL, /* modal window */
WD_MODAL, /* modal dialog */
WD_MODELESS, /* modeless dialog */
WC_PUSHBUTTON, /* button control */
WC_RADIOBUTTON, /* radio button control */
WC_CHECKBOX, /* check box control */
WC_HSCROLL, /* horizontal scrollbar control */
WC_VSCROLL, /* vertical scrollbar control */
WC_CHECKBOX, /* check box control */
WC_HSCROLL, /* horizontal scrollbar control */
WC_VSCROLL, /* vertical scrollbar control */
//WC_EDIT, /* edit control */ commentato perche' rompe le scatole
WC_TEXT, /* static text control */
WC_LBOX, /* list box control */
WC_TEXT, /* static text control */
WC_LBOX, /* list box control */
WC_LISTBUTTON, /* button with list */
WC_CHECKBUTTON, /* check button control */
WC_LISTEDIT, /* edit with field list */
WC_GROUPBOX, /* group box */
WC_TEXTEDIT, /* text edit object */
WC_ICON, /* icon control */
WO_TE, /* text edit */
WC_HGAUGE, /* horizontal progress bar */
WC_VGAUGE, /* vertical progress bar */
WC_NOTEBK, /* notebook control */
WC_HTML, /* HTML control */
WC_TREE, /* tree view */
WC_OUTLOOKBAR, /* Barra di outlook */
WC_HSLIDER, /* horizontal slider control */
WC_VSLIDER, /* vertical slider control */
WC_POPUP /* list of listedit control or popup menu */
WC_LISTEDIT, /* edit with field list */
WC_GROUPBOX, /* group box */
WC_TEXTEDIT, /* text edit object */
WC_ICON, /* icon control */
WO_TE, /* text edit */
WC_HGAUGE, /* horizontal progress bar */
WC_VGAUGE, /* vertical progress bar */
WC_NOTEBK, /* notebook control */
WC_HTML, /* HTML control */
WC_TREE, /* tree view */
WC_OUTLOOKBAR, /* Barra di outlook */
WC_HSLIDER, /* horizontal slider control */
WC_VSLIDER, /* vertical slider control */
WC_POPUP, /* list of listedit control or popup menu */
WC_PROPGRID, /* property grid */
} WIN_TYPE;
typedef enum {

View File

@ -7,6 +7,7 @@
#include <wx/treectrl.h>
#include <wx/vlbox.h>
#include <wx/aui/aui.h>
#include <wx/propgrid/propgrid.h>
///////////////////////////////////////////////////////////
// Utility functions
@ -215,6 +216,15 @@ public:
TwxPopUp(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size);
};
class TwxPropertyGrid : public wxPropertyGrid
{
DECLARE_EVENT_TABLE()
protected:
void OnPropertyChanged(wxPropertyGridEvent& evt);
public:
TwxPropertyGrid(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style);
};
WINDOW xvt_ctl_create_def(WIN_DEF* win_def_p, WINDOW parent_win, long app_data)
{
wxASSERT(win_def_p != NULL);
@ -296,17 +306,24 @@ WINDOW xvt_ctl_create_def(WIN_DEF* win_def_p, WINDOW parent_win, long app_data)
win = (WINDOW)tlb;
}
break;
case WC_OUTLOOKBAR:
{
long style = 0;
TwxOutlookBar* tob = new TwxOutlookBar(pParent, id, rct.GetPosition(), rct.GetSize(), style);
win = (WINDOW)tob;
}
break;
case WC_POPUP:
{
TwxPopUp* tpu = new TwxPopUp(pParent, id, rct.GetPosition(), rct.GetSize());
win = (WINDOW)tpu;
}
break;
case WC_OUTLOOKBAR:
case WC_PROPGRID:
{
long style = 0;
TwxOutlookBar* tob = new TwxOutlookBar(pParent, id, rct.GetPosition(), rct.GetSize(), style);
win = (WINDOW)tob;
long flags = wxPG_BOLD_MODIFIED | wxPG_SPLITTER_AUTO_CENTER | wxPG_DESCRIPTION | wxPG_TOOLTIPS;
TwxPropertyGrid* pg = new TwxPropertyGrid(pParent, id, rct.GetPosition(), rct.GetSize(), flags);
win = (WINDOW)pg;
}
break;
default:
@ -363,33 +380,54 @@ void xvt_ctl_set_colors(WINDOW win, const XVT_COLOR_COMPONENT* colors, XVT_COLOR
{
if (action == XVT_COLOR_ACTION_SET)
{
for (int i = 0; colors[i].type; i++)
wxPropertyGrid* pg = wxDynamicCast(w, wxPropertyGrid);
if (pg != NULL)
{
CAST_COLOR(colors[i].color, rgb);
switch(colors[i].type)
for (int i = 0; colors[i].type; i++)
{
case XVT_COLOR_BACKGROUND: w->SetOwnBackgroundColour(rgb); break;
case XVT_COLOR_FOREGROUND: w->SetOwnForegroundColour(rgb); break;
case XVT_COLOR_HIGHLIGHT:
CAST_COLOR(colors[i].color, rgb);
switch(colors[i].type)
{
TwxPopUp* tpu = wxDynamicCast(w, TwxPopUp);
if (tpu != NULL)
tpu->SetSelectForeColor(rgb);
case XVT_COLOR_BACKGROUND: pg->SetCellBackgroundColour(rgb); break;
case XVT_COLOR_FOREGROUND: pg->SetCellTextColour(rgb); pg->SetCaptionForegroundColour(rgb); break;
case XVT_COLOR_HIGHLIGHT : pg->SetSelectionBackground(rgb); break;
case XVT_COLOR_SELECT : pg->SetSelectionForeground(rgb); break;
case XVT_COLOR_BLEND : pg->SetCaptionBackgroundColour(rgb); pg->SetMarginColour(rgb); break;
case XVT_COLOR_TROUGH : pg->SetEmptySpaceColour(rgb); break;
default : break;
}
break;
case XVT_COLOR_SELECT:
}
}
else
{
for (int i = 0; colors[i].type; i++)
{
CAST_COLOR(colors[i].color, rgb);
switch(colors[i].type)
{
TwxPopUp* tpu = wxDynamicCast(w, TwxPopUp);
if (tpu != NULL)
tpu->SetSelectBackColor(rgb);
case XVT_COLOR_BACKGROUND: w->SetOwnBackgroundColour(rgb); break;
case XVT_COLOR_FOREGROUND: w->SetOwnForegroundColour(rgb); break;
case XVT_COLOR_HIGHLIGHT:
{
TwxPopUp* tpu = wxDynamicCast(w, TwxPopUp);
if (tpu != NULL)
tpu->SetSelectForeColor(rgb);
}
break;
case XVT_COLOR_SELECT:
{
TwxPopUp* tpu = wxDynamicCast(w, TwxPopUp);
if (tpu != NULL)
tpu->SetSelectBackColor(rgb);
}
break;
case XVT_COLOR_BLEND:
if (!w->IsKindOf(CLASSINFO(wxButton)))
w->SetOwnBackgroundColour(rgb);
break;
default:
break;
}
break;
case XVT_COLOR_BLEND:
if (!w->IsKindOf(CLASSINFO(wxButton)))
w->SetOwnBackgroundColour(rgb);
break;
default:
break;
}
}
}
@ -1713,12 +1751,12 @@ TwxPopUp::TwxPopUp(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wx
m_clrBack = GetSelectionBackground();
const wxFont font = parent->GetFont();
m_nRowHeight = abs(font.GetPixelSize().y) + 8;
m_nRowHeight = abs(font.GetPixelSize().y) + 4;
}
static int RoundPopupHeight(int list_h, int row_h)
{
const int rem = list_h % row_h;
const int rem = list_h % (row_h+1);
if (rem > 0)
list_h -= rem;
return list_h;
@ -1743,12 +1781,12 @@ MENU_TAG xvt_list_popup(WINDOW parent_win, const RCT* ownrct, const MENU_ITEM* m
}
const wxFont font = parent->GetFont();
const int nRowHeight = abs(font.GetPixelSize().y)+8;
const int nRowHeight = abs(font.GetPixelSize().y)+4;
const wxRect rctClient = parent->GetClientRect();
const int nBottom = rctClient.GetBottom();
wxPoint pos(ownrct->right-width, ownrct->bottom);
wxSize size(width, items*nRowHeight);
wxSize size(width, items*nRowHeight+2);
if (pos.y + size.y > nBottom) // La lista deborda di sotto?
{
@ -2076,3 +2114,198 @@ void xvt_dwin_draw_tool(WINDOW win, int x, int y, int rid, int size)
dc.DrawBitmap(bmp, x, y);
}
}
///////////////////////////////////////////////////////////
// wxPropertyGrid
///////////////////////////////////////////////////////////
#include <wx/propgrid/advprops.h>
BEGIN_EVENT_TABLE(TwxPropertyGrid, wxPropertyGrid)
EVT_PG_CHANGED(wxID_ANY, TwxPropertyGrid::OnPropertyChanged)
END_EVENT_TABLE();
void TwxPropertyGrid::OnPropertyChanged(wxPropertyGridEvent& evt)
{
TwxWindow* win = wxDynamicCast(GetParent(), TwxWindow);
if (win != NULL && !IsFrozen())
{
EVENT e; memset(&e, 0, sizeof(EVENT));
e.type = E_CONTROL;
e.v.ctl.id = evt.GetId();
e.v.ctl.ci.v.treeview.sgl_click = TRUE;
e.v.ctl.ci.v.treeview.node = evt.GetProperty();
e.v.ctl.ci.type = WC_PROPGRID;
e.v.ctl.ci.win = WINDOW(this);
win->DoXvtEvent(e);
}
}
TwxPropertyGrid::TwxPropertyGrid(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
: wxPropertyGrid(parent, id, pos, size, style)
{ }
static BOOLEAN xvt_prop_freeze(WINDOW win, BOOLEAN on)
{
wxPropertyGrid* pg = wxDynamicCast((wxObject*)win, wxPropertyGrid);
const BOOLEAN ok = pg != NULL && on != BOOLEAN(pg->IsFrozen());
if (ok)
{
if (on)
pg->Freeze();
else
{
pg->Thaw();
pg->Refresh();
}
}
return ok;
}
BOOLEAN xvt_prop_restart(WINDOW win)
{ return xvt_prop_freeze(win, FALSE); }
BOOLEAN xvt_prop_suspend(WINDOW win)
{ return xvt_prop_freeze(win, TRUE); }
static wxColour STR2COLOUR(const char* value)
{
wxColour col;
if (value && *value)
{
if (*value == '(')
value++;
if (isdigit(*value))
{
int r, g, b;
const int n = sscanf(value, "%d,%d,%d", &r, &g, &b);
if (n == 3)
col = wxColour(r, g, b);
else
col = wxColour(r & 0xFFFFFF);
}
else
col = wxColour(value); // Black, White, Yellow, ...
}
return col;
}
BOOLEAN xvt_prop_set_data(WINDOW win, XVT_TREEVIEW_NODE node, const char* value)
{
wxPropertyGrid* pg = wxDynamicCast((wxObject*)win, wxPropertyGrid);
if (pg != NULL)
{
wxPGProperty* pgp = wxDynamicCast((wxObject*)node, wxPGProperty);
if (pgp != NULL)
{
const wxString strType = pgp->GetType();
if (strType == "wxColour")
{
wxColourPropertyValue val(STR2COLOUR(value));
wxVariant& var = pgp->GetValueRef();
var = ((wxColourProperty*)pgp)->DoTranslateVal(val);
}
else
{
if (strType == "long" || strType == "int")
pgp->SetValue(atol(value));
else
pgp->SetValue(value);
}
return TRUE;
}
}
return FALSE;
}
XVT_TREEVIEW_NODE xvt_prop_add(WINDOW win, const char* type, const char* name, const char* value, const char* label)
{
wxPropertyGrid* pg = wxDynamicCast((wxObject*)win, wxPropertyGrid);
if (pg != NULL)
{
wxPGProperty* pgp = pg->GetPropertyByName(name);
if (pgp == NULL)
{
const wxString strLabel = (label && *label) ? label : name;
if (type && *type > ' ')
{
switch (toupper(*type))
{
case 'C': pgp = new wxColourProperty(strLabel, name, STR2COLOUR(value)); break;
case 'I':
case 'L': pgp = new wxIntProperty(strLabel, name, atol(value)); break;
default : pgp = new wxStringProperty(strLabel, name, value); break;
}
}
else
pgp = new wxPropertyCategory(strLabel, name);
pg->Append(pgp);
}
else
xvt_prop_set_data(win, pgp, value);
return pgp;
}
return NULL;
}
XVT_TREEVIEW_NODE xvt_prop_find(WINDOW win, const char* name)
{
XVT_TREEVIEW_NODE node = NULL;
wxPropertyGrid* pg = wxDynamicCast((wxObject*)win, wxPropertyGrid);
if (pg != NULL)
node = pg->GetPropertyByName(name);
return node;
}
int xvt_prop_get_string(WINDOW win, XVT_TREEVIEW_NODE node, char* label, int maxlen)
{
int len = -1;
wxPropertyGrid* pg = wxDynamicCast((wxObject*)win, wxPropertyGrid);
if (pg != NULL)
{
const wxPGProperty* pgp = wxDynamicCast((wxObject*)node, wxPGProperty);
if (pgp != NULL)
{
const wxString& str = pgp->GetLabel();
if (label && maxlen > 0)
{
wxStrncpy(label, str, maxlen);
label[maxlen-1] = '\0';
}
len = str.Len();
}
}
return len;
}
int xvt_prop_get_data(WINDOW win, XVT_TREEVIEW_NODE node, char* value, int maxlen)
{
int len = -1;
wxPropertyGrid* pg = wxDynamicCast((wxObject*)win, wxPropertyGrid);
if (pg != NULL)
{
const wxPGProperty* pgp = wxDynamicCast((wxObject*)node, wxPGProperty);
if (pgp != NULL)
{
wxString str = pgp->GetValueAsString();
wxString strType = pgp->GetType();
if (strType == "wxColour")
{
strType = "color";
int r, g, b; wxSscanf(str, "(%d,%d,%d)", &r, &g, &b);
COLOR rgb = XVT_MAKE_COLOR(r, g, b);
if (rgb == 0) rgb = COLOR_BLACK;
str.Printf("%ld", rgb);
}
len = str.Len();
if (value != NULL && maxlen > 0)
{
wxStrncpy(value, str, maxlen);
value[maxlen-1] = '\0';
}
}
}
return len;
}