Patch level :
Files correlati : Ricompilazione Demo : [ ] Commento : Riportati TTreelist_field dalla 11.0 git-svn-id: svn://10.65.10.50/branches/R_10_00@21910 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
b61df20b4e
commit
2ebb52552c
@ -56,6 +56,7 @@
|
|||||||
#define CLASS_SLIDER_FIELD 254
|
#define CLASS_SLIDER_FIELD 254
|
||||||
#define CLASS_PROP_FIELD 255
|
#define CLASS_PROP_FIELD 255
|
||||||
#define CLASS_MVC_FIELD 256
|
#define CLASS_MVC_FIELD 256
|
||||||
|
#define CLASS_TREELIST_FIELD 257
|
||||||
|
|
||||||
#define CLASS_TOOL_FIELD 280
|
#define CLASS_TOOL_FIELD 280
|
||||||
#define CLASS_BUTTON_TOOL 281
|
#define CLASS_BUTTON_TOOL 281
|
||||||
|
@ -1087,32 +1087,12 @@ int Tdninst::test_cmdline(const TString& cmdline, bool key_must_exist, TString&
|
|||||||
const word codmod = don.module_name2code(strmod);
|
const word codmod = don.module_name2code(strmod);
|
||||||
if (codmod == BAAUT)
|
if (codmod == BAAUT)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*if (!don.active(codmod))
|
|
||||||
{
|
|
||||||
msg << TR("Modulo non attivo sulla chiave: ") << strmod;
|
|
||||||
return 2;
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const TDate oggi(TODAY);
|
|
||||||
const int solar_year = oggi.year();
|
|
||||||
const int dongle_ass = don.year_assist();
|
|
||||||
const int dongle_year = assistance_year2solar(dongle_ass);
|
|
||||||
if (solar_year - dongle_year > 2)
|
|
||||||
{
|
|
||||||
msg << TR("Anno di assistenza non valido sulla chiave: ") << dongle_year;
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEnigma_machine em;
|
TEnigma_machine em;
|
||||||
const int dninst_ass = em.year_assist();
|
const int dninst_ass = em.year_assist();
|
||||||
if (dongle_ass > dninst_ass)
|
const TDate oggi(TODAY);
|
||||||
{
|
|
||||||
msg << TR("File dninst.zip obsoleto");
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool bFound = false;
|
bool bFound = false;
|
||||||
if (dninst_ass > 2100)
|
if (dninst_ass > 2100)
|
||||||
@ -1129,6 +1109,7 @@ int Tdninst::test_cmdline(const TString& cmdline, bool key_must_exist, TString&
|
|||||||
|
|
||||||
if (parse_date(dninst_line, key, datascad))
|
if (parse_date(dninst_line, key, datascad))
|
||||||
{
|
{
|
||||||
|
const TDate oggi(TODAY);
|
||||||
const bool scaduto = datascad < oggi;
|
const bool scaduto = datascad < oggi;
|
||||||
if (key == "*")
|
if (key == "*")
|
||||||
{
|
{
|
||||||
@ -1202,6 +1183,38 @@ bool Tdninst::can_I_run(const bool is_personal_program) const
|
|||||||
return test_cmdline(cmdline, me, msg) == 0;
|
return test_cmdline(cmdline, me, msg) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Tdninst::find_serno() const
|
||||||
|
{
|
||||||
|
const word serno = dongle().number();
|
||||||
|
if (serno == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
const TDate oggi(TODAY);
|
||||||
|
bool good = false;
|
||||||
|
TEnigma_machine em;
|
||||||
|
if (em.ok())
|
||||||
|
{
|
||||||
|
if (em.year_assist() > 2100)
|
||||||
|
{
|
||||||
|
TToken_string l(80, '=');
|
||||||
|
good = em.find_serno(serno);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TToken_string l(80, ';');
|
||||||
|
while (em.line(l))
|
||||||
|
{
|
||||||
|
if (l.get_long(0) == serno)
|
||||||
|
{
|
||||||
|
good = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return good;
|
||||||
|
}
|
||||||
|
|
||||||
bool Tdninst::find_killed(TToken_string& kill_list) const
|
bool Tdninst::find_killed(TToken_string& kill_list) const
|
||||||
{
|
{
|
||||||
kill_list.cut(0);
|
kill_list.cut(0);
|
||||||
@ -1255,6 +1268,38 @@ bool Tdninst::find_killed(TToken_string& kill_list) const
|
|||||||
return good;
|
return good;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Tdninst::find_expiring(int days, TString& module, TDate& expires) const
|
||||||
|
{
|
||||||
|
const TDate oggi(TODAY);
|
||||||
|
|
||||||
|
expires = oggi; expires += days;
|
||||||
|
module.cut(0);
|
||||||
|
|
||||||
|
const word serno = dongle().number();
|
||||||
|
if (serno == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
TEnigma_machine em;
|
||||||
|
if (em.ok() && em.year_assist() > 2100 && em.find_serno(serno))
|
||||||
|
{
|
||||||
|
TToken_string l(80, '=');
|
||||||
|
TString16 str;
|
||||||
|
TDate ds;
|
||||||
|
while (em.line(l))
|
||||||
|
{
|
||||||
|
if (l.empty() || l[0] == '[')
|
||||||
|
break;
|
||||||
|
if (parse_date(l, str, ds) && ds >= oggi && ds <= expires)
|
||||||
|
{
|
||||||
|
module = str;
|
||||||
|
expires = ds;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return module.full();
|
||||||
|
}
|
||||||
|
|
||||||
Tdninst::Tdninst() : _year_assist(0)
|
Tdninst::Tdninst() : _year_assist(0)
|
||||||
{
|
{
|
||||||
TEnigma_machine s;
|
TEnigma_machine s;
|
||||||
|
@ -115,7 +115,10 @@ public:
|
|||||||
int solar_year() const { return assistance_year2solar(_year_assist); }
|
int solar_year() const { return assistance_year2solar(_year_assist); }
|
||||||
int test_cmdline(const TString& cmdline, bool key_must_exist, TString& msg) const;
|
int test_cmdline(const TString& cmdline, bool key_must_exist, TString& msg) const;
|
||||||
bool can_I_run(const bool is_personal_program = false) const;
|
bool can_I_run(const bool is_personal_program = false) const;
|
||||||
|
bool find_serno() const;
|
||||||
bool find_killed(TToken_string& kill_list) const;
|
bool find_killed(TToken_string& kill_list) const;
|
||||||
|
bool find_expiring(int days, TString& module, TDate& expires) const;
|
||||||
|
|
||||||
Tdninst();
|
Tdninst();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1102,6 +1102,7 @@ TMask_field* TMask::parse_field(TScanner& scanner)
|
|||||||
if (k == "SP") return new TSheet_field(this);
|
if (k == "SP") return new TSheet_field(this);
|
||||||
if (k == "ST") return new TEdit_field(this);
|
if (k == "ST") return new TEdit_field(this);
|
||||||
if (k == "TE") return new TText_field(this);
|
if (k == "TE") return new TText_field(this);
|
||||||
|
if (k == "TL") return new TTreelist_field(this);
|
||||||
if (k == "TR") return new TTree_field(this);
|
if (k == "TR") return new TTree_field(this);
|
||||||
if (k == "ZO") return new TZoom_field(this);
|
if (k == "ZO") return new TZoom_field(this);
|
||||||
|
|
||||||
|
@ -5,6 +5,10 @@
|
|||||||
#include <assoc.h>
|
#include <assoc.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __VARIANT_H
|
||||||
|
#include <variant.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
class TTree;
|
class TTree;
|
||||||
class TImage;
|
class TImage;
|
||||||
|
|
||||||
@ -59,6 +63,7 @@ public:
|
|||||||
|
|
||||||
virtual void curr_id(TString& id) const { node2id(curr_node(), id); }
|
virtual void curr_id(TString& id) const { node2id(curr_node(), id); }
|
||||||
virtual bool get_description(TString& desc) const { curr_id(desc); return desc.not_empty(); }
|
virtual bool get_description(TString& desc) const { curr_id(desc); return desc.not_empty(); }
|
||||||
|
virtual TFieldtypes get_var(const TString& name, TVariant& var) const { return _nullfld; }
|
||||||
|
|
||||||
virtual bool expand();
|
virtual bool expand();
|
||||||
virtual bool shrink();
|
virtual bool shrink();
|
||||||
|
@ -245,6 +245,8 @@ class TTree_window : public TControl_host_window
|
|||||||
{
|
{
|
||||||
TTree* _tree;
|
TTree* _tree;
|
||||||
bool _hide_leaves;
|
bool _hide_leaves;
|
||||||
|
|
||||||
|
protected:
|
||||||
TAuto_token_string _header;
|
TAuto_token_string _header;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -1221,3 +1223,359 @@ TField_window* TProp_field::create_window(int x, int y, int dx, int dy, WINDOW p
|
|||||||
|
|
||||||
TProp_field::TProp_field(TMask* m) : TWindowed_field(m)
|
TProp_field::TProp_field(TMask* m) : TWindowed_field(m)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// TTreelist_window
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class TTreelist_window : public TTree_window
|
||||||
|
{
|
||||||
|
TAuto_token_string _fields;
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual void create_children(XVT_TREEVIEW_NODE node);
|
||||||
|
virtual void handle_tree_event(EVENT* ep);
|
||||||
|
virtual bool add_child(XVT_TREEVIEW_NODE parent);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual long handler(WINDOW win, EVENT* ep);
|
||||||
|
bool get_fields(TToken_string& csv);
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual bool select_current();
|
||||||
|
virtual bool goto_selected();
|
||||||
|
virtual void set_header(const char* head);
|
||||||
|
virtual void set_fields(const char* flds);
|
||||||
|
|
||||||
|
TTreelist_window(int x, int y, int dx, int dy, WINDOW parent, TTreelist_field* owner);
|
||||||
|
virtual ~TTreelist_window() { }
|
||||||
|
};
|
||||||
|
|
||||||
|
bool TTreelist_window::get_fields(TToken_string& csv)
|
||||||
|
{
|
||||||
|
if (_fields.empty_items())
|
||||||
|
return tree()->get_description(csv);
|
||||||
|
|
||||||
|
csv.cut(0);
|
||||||
|
TVariant var;
|
||||||
|
FOR_EACH_TOKEN(_fields, str)
|
||||||
|
{
|
||||||
|
var.set_null();
|
||||||
|
tree()->get_var(str, var);
|
||||||
|
if (var.is_empty())
|
||||||
|
csv.add(" ");
|
||||||
|
else
|
||||||
|
csv.add(var.as_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TTreelist_window::add_child(XVT_TREEVIEW_NODE parent)
|
||||||
|
{
|
||||||
|
XVT_TREEVIEW_NODE_TYPE type = tree()->could_have_son() ? XVT_TREEVIEW_NODE_NONTERMINAL
|
||||||
|
: XVT_TREEVIEW_NODE_TERMINAL;
|
||||||
|
|
||||||
|
XVT_IMAGE ii = NULL, ic = NULL, ie = NULL;
|
||||||
|
TImage* im_nor = tree()->image(false);
|
||||||
|
if (im_nor != NULL)
|
||||||
|
{
|
||||||
|
if (type == XVT_TREEVIEW_NODE_NONTERMINAL)
|
||||||
|
{
|
||||||
|
TImage* im_sel = tree()->image(true);
|
||||||
|
ic = im_nor->xvt_image();
|
||||||
|
ie = im_sel->xvt_image();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ii = im_nor->xvt_image();
|
||||||
|
}
|
||||||
|
TToken_string csv(80, '\t'); get_fields(csv);
|
||||||
|
TString256 id; tree()->curr_id(id);
|
||||||
|
XVT_TREEVIEW_NODE child = xvt_treelist_add_child_node(_ctrl, parent, type, ii, ic, ie, csv, NULL, id);
|
||||||
|
if (child != NULL)
|
||||||
|
{
|
||||||
|
if (!tree()->enabled())
|
||||||
|
xvt_treelist_enable_node(_ctrl, child, FALSE);
|
||||||
|
if (tree()->marked())
|
||||||
|
xvt_treelist_set_node_bold(_ctrl, child, TRUE);
|
||||||
|
|
||||||
|
if (type == XVT_TREEVIEW_NODE_NONTERMINAL && tree()->expanded())
|
||||||
|
{
|
||||||
|
for (bool ok = tree()->goto_firstson(); ok; ok = tree()->goto_rbrother())
|
||||||
|
add_child(child);
|
||||||
|
xvt_treelist_expand_node(_ctrl, child, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tree()->goto_node(id);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TTreelist_window::create_children(XVT_TREEVIEW_NODE node)
|
||||||
|
{
|
||||||
|
bool ok = false;
|
||||||
|
TString id;
|
||||||
|
if (tree() != NULL)
|
||||||
|
{
|
||||||
|
if (node != NULL)
|
||||||
|
id = xvt_treelist_get_node_data(_ctrl, node);
|
||||||
|
if (id.empty()) // Sono sulla radice
|
||||||
|
{
|
||||||
|
node = xvt_treelist_get_root_node(_ctrl);
|
||||||
|
ok = tree()->goto_root();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tree()->goto_node(id);
|
||||||
|
ok = tree()->goto_firstson();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xvt_treelist_remove_node_children(_ctrl, node);
|
||||||
|
for (; ok; ok = tree()->goto_rbrother())
|
||||||
|
add_child(node);
|
||||||
|
|
||||||
|
// Riposiziona per benino l'alberello
|
||||||
|
if (id.empty())
|
||||||
|
tree()->goto_root();
|
||||||
|
else
|
||||||
|
tree()->goto_node(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TTreelist_window::handle_tree_event(EVENT* ep)
|
||||||
|
{
|
||||||
|
XVT_TREEVIEW_NODE node = ep->v.ctl.ci.v.treeview.node;
|
||||||
|
const TString id = (const char*)xvt_treelist_get_node_data(_ctrl, node);
|
||||||
|
if (tree()->goto_node(id))
|
||||||
|
{
|
||||||
|
if (ep->v.ctl.ci.v.treeview.sgl_click || ep->v.ctl.ci.v.treeview.dbl_click)
|
||||||
|
{
|
||||||
|
KEY key = K_SPACE; // Single click selection
|
||||||
|
if (ep->v.ctl.ci.v.treeview.dbl_click)
|
||||||
|
key += K_CTRL; // Double click selection
|
||||||
|
if (owner().on_key(key) && tree()->goto_node(id))
|
||||||
|
{
|
||||||
|
// Aggiorna testo ed immagini che possono essere cambiate
|
||||||
|
XVT_IMAGE ii = NULL, ic = NULL, ie = NULL;
|
||||||
|
TImage* im_nor = tree()->image(false);
|
||||||
|
if (tree()->has_son())
|
||||||
|
{
|
||||||
|
TImage* im_sel = tree()->image(true);
|
||||||
|
ic = im_nor->xvt_image();
|
||||||
|
ie = im_sel->xvt_image();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ii = im_nor->xvt_image();
|
||||||
|
xvt_treelist_set_node_images(_ctrl, node, ii, ic, ie);
|
||||||
|
TToken_string csv(80, '\t'); get_fields(csv);
|
||||||
|
xvt_treelist_set_node_string(_ctrl, node, csv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int nWhat = 0;
|
||||||
|
if (ep->v.ctl.ci.v.treeview.expanded)
|
||||||
|
nWhat |= 0x1;
|
||||||
|
if (ep->v.ctl.ci.v.treeview.collapsed)
|
||||||
|
nWhat |= 0x2;
|
||||||
|
switch (nWhat)
|
||||||
|
{
|
||||||
|
case 0x1: // Expanded
|
||||||
|
tree()->expand();
|
||||||
|
owner().on_key(K_SHIFT + K_SPACE);
|
||||||
|
break;
|
||||||
|
case 0x2: // Collapsed
|
||||||
|
tree()->shrink();
|
||||||
|
break;
|
||||||
|
case 0x3: // Expanding
|
||||||
|
tree()->expand();
|
||||||
|
create_children(node);
|
||||||
|
owner().on_key(K_SHIFT + K_SPACE);
|
||||||
|
owner().on_key(K_SPACE);
|
||||||
|
break;
|
||||||
|
default : break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
long TTreelist_window::handler(WINDOW win, EVENT* ep)
|
||||||
|
{
|
||||||
|
switch (ep->type)
|
||||||
|
{
|
||||||
|
case E_CONTROL:
|
||||||
|
if (ep->v.ctl.ci.type == WC_TREELIST && tree() != NULL)
|
||||||
|
{
|
||||||
|
handle_tree_event(ep);
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case E_UPDATE:
|
||||||
|
return 0L;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TControl_host_window::handler(win, ep);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TTreelist_window::select_current()
|
||||||
|
{
|
||||||
|
XVT_TREEVIEW_NODE nextsel = NULL; // Nodo da selezionare (se mai lo trovero')
|
||||||
|
|
||||||
|
if (tree() != NULL)
|
||||||
|
{
|
||||||
|
TString id; tree()->curr_id(id); // id del nodo corrente dell'albero
|
||||||
|
|
||||||
|
// Controllo se il tree control e' gia' posizionato bene
|
||||||
|
XVT_TREEVIEW_NODE cursel = xvt_treelist_get_selected_node(_ctrl);
|
||||||
|
nextsel = xvt_treelist_find_node_string(_ctrl, id);
|
||||||
|
if (nextsel != NULL && cursel == nextsel)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (nextsel == NULL)
|
||||||
|
{
|
||||||
|
xvt_treelist_suspend(_ctrl); // Sospendo le notifiche degli eventi
|
||||||
|
TString_array a;
|
||||||
|
a.add(id);
|
||||||
|
// Creo la lista dei progenitori
|
||||||
|
while (tree()->goto_father())
|
||||||
|
{
|
||||||
|
const int i = a.add(EMPTY_STRING);
|
||||||
|
tree()->curr_id(a.row(i));
|
||||||
|
tree()->expand(); // Nel caso non fosse gia' espanso
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scandisco i progenitori partendo dalla radice
|
||||||
|
XVT_TREEVIEW_NODE parent = NULL; // was xvt_treeview_get_root_node(_ctrl);
|
||||||
|
bool killed = false; // Ho interrotto "bruscamente" la ricerca?
|
||||||
|
FOR_EACH_ARRAY_ROW_BACK(a, r, row)
|
||||||
|
{
|
||||||
|
if (killed)
|
||||||
|
break;
|
||||||
|
for (int i = 0; ; i++)
|
||||||
|
{
|
||||||
|
XVT_TREEVIEW_NODE child = xvt_treelist_get_child_node(_ctrl, parent, i);
|
||||||
|
if (child == NULL && i == 0) // Forse non c'e' nessun figlio ...
|
||||||
|
{
|
||||||
|
create_children(parent); // ... sara' vero?
|
||||||
|
child = xvt_treelist_get_child_node(_ctrl, parent, i);
|
||||||
|
}
|
||||||
|
if (child == NULL) // Certamente non ci sono piu' figli
|
||||||
|
{
|
||||||
|
//killed = true; // Non ho trovato quello che cercavo: esco subito
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const char* data = xvt_treelist_get_node_data(_ctrl, child);
|
||||||
|
if (*row == data)
|
||||||
|
{
|
||||||
|
nextsel = child;
|
||||||
|
if (*row == id) // Ho finito
|
||||||
|
killed = true;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
parent = child;
|
||||||
|
xvt_treelist_expand_node(_ctrl, child, FALSE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xvt_treelist_resume(_ctrl); // Riattivo le notifiche degli eventi
|
||||||
|
tree()->goto_node(id); // Riposiziono l'albero
|
||||||
|
}
|
||||||
|
if (nextsel != NULL)
|
||||||
|
{
|
||||||
|
xvt_treelist_select_node(_ctrl, nextsel, TRUE);
|
||||||
|
if (tree()->expanded())
|
||||||
|
xvt_treelist_expand_node(_ctrl, nextsel, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nextsel != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TTreelist_window::goto_selected()
|
||||||
|
{
|
||||||
|
bool ok = false;
|
||||||
|
XVT_TREEVIEW_NODE child = xvt_treelist_get_selected_node(_ctrl);
|
||||||
|
if (child != NULL)
|
||||||
|
{
|
||||||
|
const char* data = (const char*)xvt_treelist_get_node_data(_ctrl, child);
|
||||||
|
ok = tree()->goto_node(data);
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TTreelist_window::set_header(const char* head)
|
||||||
|
{
|
||||||
|
_header = head;
|
||||||
|
xvt_treelist_set_node_string(_ctrl, NULL, _header);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TTreelist_window::set_fields(const char* field)
|
||||||
|
{ _fields = field; }
|
||||||
|
|
||||||
|
|
||||||
|
TTreelist_window::TTreelist_window(int x, int y, int dx, int dy, WINDOW parent, TTreelist_field* owner)
|
||||||
|
: TTree_window(x, y, dx, dy, parent, owner)
|
||||||
|
{
|
||||||
|
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_COLOR;
|
||||||
|
|
||||||
|
WIN_DEF wd[2]; memset(&wd, 0, sizeof(wd));
|
||||||
|
wd->wtype = WC_TREELIST;
|
||||||
|
wd->v.ctl.ctrl_id = owner->dlg();
|
||||||
|
wd->v.ctl.font_id = xvtil_default_font();
|
||||||
|
xvt_vobj_get_client_rect(win(), &wd->rct);
|
||||||
|
wd->ctlcolors = xcc;
|
||||||
|
|
||||||
|
_ctrl = xvt_ctl_create_def(wd, win(), (long)this);
|
||||||
|
if (!_items.empty())
|
||||||
|
{
|
||||||
|
TToken_string header(80, '\t');
|
||||||
|
TToken_string fields(80, '\t');
|
||||||
|
FOR_EACH_ARRAY_ROW(_items, i, text)
|
||||||
|
{
|
||||||
|
header.add(text->get(0));
|
||||||
|
fields.add(text->get());
|
||||||
|
}
|
||||||
|
set_header(header);
|
||||||
|
set_fields(fields);
|
||||||
|
_items.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// TTreelist_field
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
word TTreelist_field::class_id() const
|
||||||
|
{ return CLASS_TREELIST_FIELD; }
|
||||||
|
|
||||||
|
bool TTreelist_field::is_kind_of(word cid) const
|
||||||
|
{ return cid == CLASS_TREELIST_FIELD || TTree_field::is_kind_of(cid); }
|
||||||
|
|
||||||
|
bool TTreelist_field::parse_item(TScanner& scanner)
|
||||||
|
{
|
||||||
|
if (scanner.key() == "DI") // Encouraged syntax: DISPLAY "Header@10" FieldName
|
||||||
|
{
|
||||||
|
const TString80 label = dictionary_translate_header(scanner.string());
|
||||||
|
TString80 fld = scanner.line(); fld.strip(" '\"");
|
||||||
|
|
||||||
|
TToken_string* item = new TToken_string(80, '\t');
|
||||||
|
item->add(label);
|
||||||
|
item->add(fld);
|
||||||
|
_items.add(item);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return TTree_field::parse_item(scanner);
|
||||||
|
}
|
||||||
|
|
||||||
|
TField_window* TTreelist_field::create_window(int x, int y, int dx, int dy, WINDOW parent)
|
||||||
|
{ return new TTreelist_window(x, y, dx, dy, parent, this); }
|
||||||
|
|
||||||
|
TTreelist_field::TTreelist_field(TMask* m) : TTree_field(m)
|
||||||
|
{ _items.destroy(); }
|
||||||
|
@ -165,5 +165,20 @@ public:
|
|||||||
TProp_field(TMask* m);
|
TProp_field(TMask* m);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class TTreelist_field : public TTree_field
|
||||||
|
{
|
||||||
|
protected: // TObject
|
||||||
|
virtual word class_id() const;
|
||||||
|
virtual bool is_kind_of(word cid) const;
|
||||||
|
|
||||||
|
protected: // TWindowed_field
|
||||||
|
virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent);
|
||||||
|
virtual bool parse_item(TScanner& scanner);
|
||||||
|
|
||||||
|
public:
|
||||||
|
TTreelist_field(TMask* m);
|
||||||
|
virtual ~TTreelist_field() { }
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user