Gestione ordinamenti in sheet di ricerca

git-svn-id: svn://10.65.10.50/branches/R_10_00@23139 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2015-11-30 16:18:56 +00:00
parent 6a84387e62
commit 07f592bd22
45 changed files with 1490 additions and 1354 deletions

@ -5,6 +5,7 @@
#include <dongle.h>
#include <golem.h>
#include <isamrpc.h>
#include <mask.h>
#include <prefix.h>
#include <progind.h>
#include <sqlset.h>
@ -113,14 +114,8 @@ void history()
last_module = mod;
else
mod.cut(0);
h << "<tr>" << "<td><b>" << mod << "</b></td>";
h << "<td>" << rel << "</td><td>";
if (np > patch)
h << "<b>" << name << "</b>";
else
h << name;
h << "</td><td>";
TString content;
if (http_get(server, remote, local))
{
ifstream i(local);
@ -130,12 +125,22 @@ void history()
i.getline(str.get_buffer(), str.size());
if (str.find('.') > 0 && fexist(str))
continue;
h << str << "<br/>";
content << str << "<br/>";
}
i.close();
xvt_fsys_remove_file(local);
}
h << "</td></tr>" << endl;
if (content.len() > 12)
{
h << "<tr>" << "<td><b>" << mod << "</b></td>";
h << "<td>" << rel << "</td><td>";
if (np > patch)
h << "<b>" << name << "</b>";
else
h << name;
h << "</td><td>" << content << "</td></tr>" << endl;
}
}
}
h << "</table></body></html>" << endl;
@ -164,7 +169,7 @@ public:
bool curr_prop(TString& prop, TVariant& value);
void set_read_only(bool ro = true);
TAdvanced_property_sheet(const char* title = "", int width = 78, int height = 20);
TAdvanced_property_sheet(const char* title = "", int width = 78, int height = 24);
};
long TAdvanced_property_sheet::handler(WINDOW win, EVENT* e)
@ -280,7 +285,7 @@ void TAdvanced_property_sheet::set_read_only(bool ro)
TAdvanced_property_sheet::TAdvanced_property_sheet(const char* title, int width, int height)
: TMask(title && *title ? title : TR("Proprietà"), 1, width, height), _pf(NULL)
{
add_button_tool(DLG_CANCEL, TR("Ritorna"), TOOL_CANCEL);
add_button_tool(DLG_CANCEL, TR("Chiudi"), TOOL_CANCEL);
add_button_tool(DLG_EXPORT, TR("Esporta"), TOOL_EXCEL);
if (is_power_reseller(true))
add_button_tool(DLG_EDIT, TR("Edit"), TOOL_EDIT);

@ -39,6 +39,38 @@ TApplication& main_app()
// Gestione dello sfondo della finestra principale
///////////////////////////////////////////////////////////
static clock_t _next_flash = 0;
HIDDEN void paint_title(WINDOW win, COLOR rgb, BOOLEAN bShadow = FALSE)
{
RCT r; xvt_vobj_get_client_rect(win, &r);
int BIGY = 3*ROWY/2;
xvtil_set_font(win, XVT_FFN_TIMES, XVT_FS_BOLD | XVT_FS_ITALIC, BIGY);
const char* t = main_app().title();
int w = xvt_dwin_get_text_width(win, t, -1);
if (w > r.right)
{
BIGY = BIGY*r.right/w;
xvtil_set_font(win, XVT_FFN_TIMES, XVT_FS_BOLD | XVT_FS_ITALIC, BIGY);
w = xvt_dwin_get_text_width(win, t, -1);
}
int x = (r.right-w)/2, y = r.top+BIGY+ROWY;
if (bShadow)
{ // Disegna ombra
const int k = max(BIGY/24, 1);
xvt_dwin_set_fore_color(win, MASK_LIGHT_COLOR);
xvt_dwin_draw_text(win, x+k, y+k, t, -1);
}
xvt_dwin_set_fore_color(win, rgb);
xvt_dwin_draw_text(win, x, y, t, -1);
xvtil_set_font(win, NULL, XVT_FS_NONE);
xvt_dwin_set_fore_color(win, PROMPT_COLOR);
}
HIDDEN void paint_background(WINDOW win)
{
RCT r; xvt_vobj_get_client_rect(win, &r);
@ -54,45 +86,43 @@ HIDDEN void paint_background(WINDOW win)
else
xvt_dwin_clear(win, MASK_DARK_COLOR);
int BIGY = 3*ROWY/2;
xvtil_set_font(win, XVT_FFN_TIMES, XVT_FS_BOLD | XVT_FS_ITALIC, BIGY);
const char* t = main_app().title();
int w = xvt_dwin_get_text_width(win, t, -1);
if (w > r.right)
{
BIGY = BIGY*r.right/w;
xvtil_set_font(win, XVT_FFN_TIMES, XVT_FS_BOLD | XVT_FS_ITALIC, BIGY);
w = xvt_dwin_get_text_width(win, t, -1);
}
int x = (r.right-w)/2, y = r.top+BIGY+ROWY;
if (ADVANCED_GRAPHICS)
{ // Disegna ombra
const int k = max(BIGY/24, 1);
xvt_dwin_set_fore_color(win, MASK_LIGHT_COLOR);
xvt_dwin_draw_text(win, x+k, y+k, t, -1);
}
xvt_dwin_set_fore_color(win, MASK_DARK_COLOR);
xvt_dwin_draw_text(win, x, y, t, -1);
xvtil_set_font(win, NULL, XVT_FS_NONE);
xvt_dwin_set_fore_color(win, PROMPT_COLOR);
paint_title(win, MASK_DARK_COLOR, ADVANCED_GRAPHICS);
TString spa; spa << dongle().product();
if (!xvt_sys_is_pda())
spa << " - " << dongle().reseller();
w = xvt_dwin_get_text_width(win, spa, -1);
x = (r.right-r.left-w)/2; y = r.bottom-CHARY;
int w = xvt_dwin_get_text_width(win, spa, -1);
int x = (r.right-r.left-w)/2, y = r.bottom-CHARY;
xvt_dwin_draw_text(win, x, y, spa, -1);
if (ADVANCED_GRAPHICS)
{
RCT ir;
xvt_rect_set(&ir, CHARY, r.bottom-TOOL_SIZE-CHARY, TOOL_SIZE+CHARY, r.bottom-CHARY);
const int sz = TOOL_SIZE <= 32 ? 32 : 48;
xvt_rect_set(&ir, CHARY, r.bottom-sz-CHARY, sz+CHARY, r.bottom-CHARY);
xvt_dwin_draw_icon_rect(win, &ir, ICON_RSRC);
xvt_rect_set(&ir, r.right-CHARY-TOOL_SIZE, r.bottom-TOOL_SIZE-CHARY, r.right-CHARY, r.bottom-CHARY);
xvt_rect_set(&ir, r.right-CHARY-sz, r.bottom-sz-CHARY, r.right-CHARY, r.bottom-CHARY);
xvt_dwin_draw_icon_rect(win, &ir, ICON_RSRC);
_next_flash = clock() + 5*CLOCKS_PER_SEC;
}
}
void TApplication::on_idle()
{
if (_next_flash > 0 && clock() > _next_flash)
{
const double delta = clock()-_next_flash;
if (delta < CLOCKS_PER_SEC)
{
COLOR rgb = blend_colors( MASK_DARK_COLOR, MASK_LIGHT_COLOR, delta/CLOCKS_PER_SEC);
paint_title(TASK_WIN, rgb);
}
else
{
paint_title(TASK_WIN, MASK_DARK_COLOR);
_next_flash = 0;
}
}
}
@ -285,7 +315,7 @@ bool TApplication::remove_menu(MENU_TAG id)
TApplication::TApplication()
: _god_vars(NULL),_savefirm(0), _running(FALSE), _create_ok(FALSE)
: _god_vars(NULL),_savefirm(0), _running(FALSE), _create_ok(FALSE)
{
}
@ -369,7 +399,7 @@ const char* TApplication::get_module_name() const
}
if (!ok)
{
error_box(FR("Il modulo '%s' non è autorizzato per l'utente %s"), (const char*)module, ((const char*)user()));
cantaccess_box(module);
module.cut(0);
}
}
@ -561,7 +591,7 @@ bool TApplication::get_version_info(int& year, int& release, int& tag, int& patc
patch = vep.get_int();
int checksum = vep.get_int();
bool valid = year >= 2151 && release > 0 && tag >= 0 && patch >= 0 &&
bool valid = year >= 2151 && release >= 12 && tag >= 0 && patch >= 0 &&
checksum == (year + release + tag + patch);
return valid;
}

@ -130,6 +130,7 @@ public:
virtual const char * extra_modules() const { return ""; }
// @cmember Abilita la verifica del modulo cui appartiene il programma
virtual bool check_autorization() const;
virtual void on_idle();
// @cmember Forza la chiusura dell'applicazione
void stop_run();

@ -176,6 +176,7 @@ public:
TCache(size_t size = 0); // 883 assigned by default
virtual ~TCache();
};
/*
__ass = TAssoc_array da scandire
__obj = variabile del cazzo che serve internamente al ciclo; va nominata e dimenticata

@ -1,7 +1,7 @@
<report name="bagn010a" lpi="6">
<description>Log di elaborazione</description>
<font face="Arial" size="10" />
<font face="Courier New" size="10" />
<section type="Head" />
<section type="Head" level="1">
<field type="Stringa" valign="center" align="center" width="80" height="3" pattern="1">

@ -197,12 +197,16 @@ bool TList_sheet::check(CheckTime t)
///////////////////////////////////////////////////////////
// Certified 100%
TBrowse::TBrowse(TEdit_field* f, TRelation* r, int key, const char* filter)
TBrowse::TBrowse(TEdit_field* f, TRelation* r, int key, const char* filter, const char* orderby)
: TBrowse_button(f),
_relation(r), _cursor(new TCursor (r, "", key)),
_filter(filter), _secondary(false), _alt_browse(NULL),
_relation(r), _filter(filter), _secondary(false), _alt_browse(NULL),
_custom_filter_handler(NULL)
{
if (*orderby && *orderby)
_cursor = new TSorted_cursor(r, orderby, "", key);
else
_cursor = new TCursor (r, "", key);
custom_cursor();
}
@ -252,9 +256,8 @@ static bool descr_filter_handler(TMask_field& f, KEY k)
void TBrowse::custom_cursor()
{
TRelation * relation = _relation == NULL ? _cursor->relation() : _relation;
int logicnum = relation->lfile().num();
TRelation* relation = _relation ? _relation : _cursor->relation();
const int logicnum = relation->lfile().num();
switch(logicnum)
{
case LF_ANAMAG :
@ -415,12 +418,14 @@ void TBrowse::parse_join(TScanner& scanner)
int key = 1;
if (scanner.popkey() == "KE")
key = scanner.integer();
else scanner.push();
else
scanner.push();
int alias = 0;
if (scanner.popkey() == "AL")
alias = scanner.integer();
else scanner.push();
else
scanner.push();
TToken_string exp(80);
if (scanner.pop() == "INTO")
@ -443,11 +448,10 @@ void TBrowse::parse_join(TScanner& scanner)
else
{
#ifdef DBG
if (j.len() > 4)
yesnofatal_box("'%s' non e' una tabella valida: %d", (const char*)j);
else
if (j[0] != '&' && j.len() > 4)
yesnofatal_box("'%s' non è una tabella valida: %d", (const char*)j);
#endif
_relation->add(j, exp, key, to, alias); // join table
_relation->add(j, exp, key, to, alias); // join table
}
}
@ -923,8 +927,7 @@ bool TBrowse::do_link(bool insert)
{
if (*f == '#')
{
const int id = atoi(++f);
app << field(id).get();
app << field().evaluate_field(f);
while (isspace(*f)) ++f;
while (isdigit(*f)) ++f;
if (*f)
@ -1489,7 +1492,7 @@ KEY TProfile_select::run()
running = false;
}
else
error_box("Esiste gia' un profilo di nome\n%s",
error_box("Esiste già un profilo di nome\n%s",
(const char*)name);
}
break;
@ -1507,7 +1510,7 @@ KEY TProfile_select::run()
running = false;
}
else
error_box("Esiste gia' un profilo di nome\n%s",
error_box("Esiste già un profilo di nome\n%s",
(const char*)name);
}
else

@ -229,7 +229,7 @@ public:
void do_output(CheckTime = RUNNING_CHECK);
// @cmember Costruttore
TBrowse(TEdit_field* f, TRelation* r, int key = 1, const char* filter = "");
TBrowse(TEdit_field* f, TRelation* r, int key = 1, const char* filter = "", const char* orderby = NULL);
// @cmember Costruttore
TBrowse(TEdit_field* f, TCursor* c);
// @cmember Distruttore

@ -3,7 +3,7 @@ ct CUP Tracciabilit
np No Profit
fe Comunicazione Polivalente
77 Percipienti
?? Modulo vario ex- Gestione IVA
gd Gestione DNinst
se Contabilità Semplificata
cg Contabilità Generale
ci Contabilità Industriale

@ -117,10 +117,11 @@ void COpenFile(logicname,filed,lockmode,dirflg)
}
} while TESTLOCK(fdir[dirflg].IOR) ;
strcpy(filed->SysName, CAddPref(filed->SysName)) ;
#ifndef _NDEBUG
if (strlen(filed->SysName) >= sizeof(filed->SysName))
xvt_dm_post_error(filed->SysName);
#endif
{
char msg[256]; sprintf(msg, "Nome troppo lungo '%s'" , filed->SysName);
xvt_dm_post_error(msg);
}
}
/*

@ -188,7 +188,7 @@ bool cantaccess_box(const char* filename)
{
if (filename == NULL || *filename < ' ')
filename = TR("questa funzione");
return error_box(FR("L'utente %s non può accedere a %s"), (const char*)user(), filename);
return error_box(FR("L'utente %s non puo' accedere a %s"), (const char*)user(), filename);
}
bool delete_box(const char* fmt, ...)

@ -74,5 +74,8 @@
#define CLI_AUTORIZ "AUTORIZ"
#define CLI_SPLITPAY "SPLITPAY"
#define CLI_UTENTE "UTENTE"
#define CLI_DATAAGG "DATAAGG"
#endif

@ -25,7 +25,7 @@ bool TConfig_application::create()
user_create();
dispatch_e_menu(_last_choice);
return TRUE;
return true;
}
bool TConfig_application::destroy()
@ -51,12 +51,12 @@ bool TConfig_application::menu(MENU_TAG m)
bool TConfig_application::user_create()
{
return TRUE;
return true;
}
bool TConfig_application::user_destroy()
{
return TRUE;
return true;
}
@ -86,10 +86,10 @@ void TConfig_application::save_mask(bool tosave)
{
TString val;
val << '"' << value << '"';
_cnf->set(fname, val, NULL, TRUE, index > -1 ? index : -1);
_cnf->set(fname, val, NULL, true, index > -1 ? index : -1);
}
else
_cnf->set(fname, value, NULL, TRUE, index > -1 ? index : -1);
_cnf->set(fname, value, NULL, true, index > -1 ? index : -1);
}
}
}
@ -205,17 +205,16 @@ void TConfig_application::on_firm_change()
void TConfig_application::set_config(int which)
{
_which_config= which;
}
bool TConfig_application::preprocess_config (TMask& mask, TConfig& config)
{
return TRUE;
return true;
}
bool TConfig_application::postprocess_config (TMask& mask, TConfig& config)
{
return TRUE;
return true;
}
// @doc EXTERNAL
@ -225,8 +224,8 @@ bool TConfig_application::postprocess_config (TMask& mask, TConfig& config)
//
// @rdesc Ritorna i seguenti valori:
//
// @flag TRUE | Se la modifica viene acettatta (dafault)
// @flag FALSE | Se la modifica non viene accettata
// @flag true | Se la modifica viene acettatta (dafault)
// @flag false | Se la modifica non viene accettata
bool TConfig_application::postprocess_config_changed(
const char* par, // @parm Paragrafo in corso di editing
const char* var, // @parm vedi <c TApplication>
@ -237,7 +236,7 @@ bool TConfig_application::postprocess_config_changed(
// in corso di editing. E' chiamata per ogni parametro modificato.
{
return TRUE;
return true;
}
TConfig_application::TConfig_application(int which_config)

@ -1,4 +1,4 @@
#define XI_INTERNAL
#define XI_INTERNAL
#include <xinclude.h>
#ifndef STX_DATA
@ -1277,15 +1277,10 @@ void TControl::set_caret_pos(int pos)
}
const char* TControl::caption() const
{
const char* c = xi_get_text(_obj, NULL, 512);
return c;
}
{ return xi_get_text(_obj, NULL, 512); }
void TControl::set_caption(const char* c)
{
xi_set_text(_obj, (char*)c);
}
{ xi_set_text(_obj, c); }
void TControl::destroy()
{
@ -1308,18 +1303,34 @@ TText_control::TText_control(WINDOW win, short cid,
bool bold, big;
COLOR color;
TString t = parse_caption(text, bold, big, color);
t.rtrim();
if (width <= 0)
width = t.len();
if (left >= 0)
{
t.rtrim();
if (width <= 0)
width = t.len();
}
else
{
if (width <= 0)
width = t.len();
t.rtrim();
}
XI_OBJ* itf = get_interface(win);
XI_RCT rct = coord2rct(itf, left, top, width, height);
rct.right += bold ? (width*XI_FU_MULTIPLE/4) : XI_FU_MULTIPLE;
if (big)
if (left >= 0)
rct.right += bold ? (width*XI_FU_MULTIPLE/4) : XI_FU_MULTIPLE;
else
rct.left -= bold ? (width*XI_FU_MULTIPLE/4) : XI_FU_MULTIPLE;
if (big)
{
rct.right += (rct.right - rct.left);
if (left >= 0)
rct.right += (rct.right - rct.left);
else
rct.left -= (rct.right - rct.left);
rct.bottom += short(xvt_font_get_size(BIG_FONT) - xvt_font_get_size(DEF_FONT));
}
}
const unsigned long attrib = flags2attr(flags);
XI_OBJ_DEF* def = xi_add_text_def(NULL, cid, &rct, attrib, t.get_buffer());
@ -1355,7 +1366,10 @@ TGroupbox_control::TGroupbox_control(WINDOW win, short cid,
{
XI_OBJ* itf = get_interface(win);
XI_RCT rct = coord2rct(itf, left, top, width, height);
rct.top = _obj->v.text->xi_rct.bottom - 2;
//rct.top = _obj->v.text->xi_rct.bottom - 2;
rct.top += XI_FU_MULTIPLE;
rct.bottom -= XI_FU_MULTIPLE / 2;
XI_OBJ_DEF* def = xi_add_rect_def(NULL, cid, &rct, XI_ATR_VISIBLE, 0, 0); // Ignore colors
@ -1378,7 +1392,12 @@ TGroupbox_control::TGroupbox_control(WINDOW win, short cid,
CHECKD(_rct, "Can't create Groupbox_control ", cid);
XI_RCT& rt = _obj->v.text->rct;
rt.top--; rt.bottom--;
//rt.top--; rt.bottom--;
const int txt_height = rt.bottom-rt.top;
rt.bottom = _rct->v.rect->rct.top - 1;
rt.top = rt.bottom - txt_height + 2;
rt.left = _rct->v.rect->rct.left;
rt.right = _rct->v.rect->rct.right;
xi_dequeue();
xi_tree_free(def);

@ -138,7 +138,7 @@ int TDate::wday() const
if (m <= 2) // Gennaio e Febbraio sono gli ultimi mesi dell'anno scorso
{
y --;
y--;
m += 12;
}

@ -1,3 +1,4 @@
#pragma once
#ifndef __DATE_H
#define __DATE_H

@ -402,19 +402,17 @@ const TString& TDongle::short_name() const
const TString& TDongle::server_name() const
{
if (network())
TString& tmp = get_tmp_string(50);
if (network() && !xvt_sys_dongle_server_running())
{
const int sr = xvt_sys_dongle_server_running();
if (sr == 0)
{
if (hardware() == _dongle_ssanet)
return ini_get_string(CONFIG_SSA, NULL, "Port");
return ini_get_string(CONFIG_INSTALL, "Server", "Dongle");
}
if (hardware() == _dongle_ssanet)
tmp = ini_get_string(CONFIG_SSA, NULL, "Port");
else
tmp = ini_get_string(CONFIG_INSTALL, "Server", "Dongle");
}
TString& tmp = get_tmp_string(50);
xvt_sys_get_host_name(tmp.get_buffer(), tmp.size());
if (tmp.blank())
xvt_sys_get_host_name(tmp.get_buffer(), tmp.size());
return tmp;
}
@ -679,9 +677,14 @@ bool TEnigma_machine::init()
{
_scan = new TScanner(DNINST_PATH);
::srand(883);
TString4 l1; line(l1);
_year_assist = atoi(l1);
::srand(_year_assist);
const TString& first_line = _scan->line();
if (first_line.len() == 4)
{
TString4 l1; decode_string(first_line, l1);
_year_assist = atoi(l1);
::srand(_year_assist);
}
}
return _scan != NULL;
}
@ -987,8 +990,9 @@ int Tdninst::check_customer() const
else
{
TEnigma_machine em;
if (em.ok() && em.year_assist() > 2100 && em.find_serno(serno))
if (em.ok() && em.year_assist() > 2150 && em.find_serno(serno))
{
const TDate oggi(TODAY);
error = 0;
TToken_string l(80, '=');
while (em.line(l) && error == 0)
@ -997,7 +1001,6 @@ int Tdninst::check_customer() const
break;
if (l[0]=='*' || l.starts_with("MustCall"))
{
const TDate oggi(TODAY);
TString16 str;
TDate ds;
if (parse_date(l, str, ds) && oggi >= ds)

@ -235,7 +235,7 @@ public:
void backtrace(int step = 1)
{ if (_ip > step) _ip -= step; else begin(); }
// @cmember Costruttore. Crea un array di 50 elementi
TCodearray(int size = 50) : TArray(size), _ip(0)
TCodearray(int size = 64) : TArray(size), _ip(0)
{}
// @cmember Distruttore
virtual ~TCodearray()

@ -56,6 +56,8 @@ bool edit_url(const char* url)
bool ok = xvt_sys_goto_url(url, "edit") != 0;
if (!ok)
ok = goto_url(url);
if (ok)
do_events();
return ok;
}

@ -1,4 +1,5 @@
#define __ISAM_CPP
#define _CRT_SECURE_NO_WARNINGS 1
#include <config.h>
#include <execp.h>
@ -11,7 +12,6 @@
#include <prefix.h>
#include <progind.h>
#include <recarray.h>
#include <relation.h>
#include <scanner.h>
#include <tabmod.h>
#include <utility.h>
@ -207,7 +207,7 @@ void __putfieldbuff(byte l, byte d, byte t, const char* s, char* recout)
if (!__field_changed)
return;
}
strncpy(&recout[l - len], s, len) ;
strncpy(&recout[l-len], s, len) ;
}
else
{
@ -441,68 +441,6 @@ HIDDEN void browse_null(char *start, int nc)
// Traduce l'espressione chiave di CodeBase
/*HIDDEN const char * translate_key(const char* key)
{
// Trasforma l'espressione
TToken_string t = key;
TToken_string k(t.get(0),'+');
TToken_string range("",',');
TString ws;
const bool is_dup = t.get(1)[0] == 'X';
const int items = k.items();
t = "";
for (int i = 0; i<items; i++) // scorre i campi dell'espressione
{
ws = k.get(i); ws.upper(); // Primo campo
const bool is_upper = ws.find("UPPER") >= 0;
const bool is_sub = ws.find("SUBSTR") >= 0;
int paren1 = ws.find('('); // Trova la prima parentesi aperta
int paren2,last,from = 0,to = 0;
if (paren1 >= 0 && is_sub && is_upper)
paren1 = ws.find('('); // Trova la seconda parentesi (in questo caso c'e' per forza)
if (paren1 >= 0) // Trova la prima virgola o parentesi chiusa (per qualsiasi espressione)
{
paren2 = ws.find(',');
if (paren2 == -1) // se non ci sono virgole trova la parentesi chiusa
paren2 = ws.find(')');
CHECK(paren2 > paren1,"Something wrong happened translating CodeBase expressions.");
if (is_sub) // Se e' una sottostringa estrae i campi DA e A
{
range = ws;
last = ws.find(')');
range.sub(paren2,last); // dalla virgola alla parentesi
from = range.get_int(0);
to = range.get_int(1);
}
ws = ws.sub(paren1+1,paren2); // Nome del campo pulito pulito
ws.upper();
}
if (is_upper)
t << "UPPER(";
t << ws; // aggiunge il nome del campo
if (is_sub)
{
t << "[";
t << from << ",";
t << to << "]";
}
if (is_upper)
t << ")";
t << '+';
}
t.rtrim(1); // Toglie il + in piu'
t.add(is_dup ? "X" : " ");
TString& tmp = get_tmp_string();
tmp = t;
return tmp;
} */
HIDDEN int __build_key(const RecDes& recd, int numkey, const RecType recin, char *key, bool build_x_cb)
/* *recd; descrittore record */
/* numkey; numero chiave */
@ -964,7 +902,7 @@ int TBaseisamfile::_readat(TRectype& rec, TRecnotype nrec, word lockop)
if (_lasterr != NOERR)
_lasterr = get_error(_lasterr);
else
rec = (const char *) DB_getrecord(fhnd);
rec = (const char*)DB_getrecord(fhnd);
_recno = DB_recno(fhnd);
if (rec.has_memo())
rec.init_memo(_recno, _isam_handle);
@ -978,7 +916,7 @@ int TBaseisamfile::_write(const TRectype& rec)
// Controlla che la chiave sia piena
TString256 key;
__build_key(rec.rec_des(), 1, rec.string(), key.get_buffer(), TRUE);
__build_key(rec.rec_des(), 1, rec.string(), key.get_buffer(), true);
if (key.blank())
return _iskeyerr;
@ -1359,7 +1297,8 @@ bool TBaseisamfile::is_changed_since(long& last) const
bool yes = false;
#ifdef WIN32
const int fh = ::_sopen(filename(), _O_RDONLY, _SH_DENYNO);
int fh = 0;
::_sopen_s(&fh, filename(), _O_RDONLY, _SH_DENYNO, _S_IREAD);
if (fh > 0)
{
struct stat stat;
@ -1625,7 +1564,7 @@ int TIsamtempfile::close()
if (c & 8 || c & 2) // CLIPPER and DBIII format
{
f.ext("cgp");
FILE *fp=fopen(f,"r");
FILE* fp=NULL; fopen_s(&fp, f, "r");
char in[16];
while (fgets(in,16,fp)!=NULL)
{
@ -2175,7 +2114,7 @@ int TSystemisamfile::update(
{
tmpfname.ext("cgp");
TFilename a;
FILE *fp=fopen(tmpfname,"rb");
FILE *fp=NULL; fopen_s(&fp, tmpfname,"rb");
while (fgets(a.get_buffer(),16,fp) != NULL)
{
a.rtrim(1); // Cut \n
@ -2572,7 +2511,7 @@ int TSystemisamfile::overwrite(
{
int err=NOERR;
FILE* fl = fopen(from, "r");
FILE* fl = NULL; fopen_s(&fl, from, "r");
if (fl == NULL)
{
error_box("Impossibile aprire il file %s",from);
@ -2798,8 +2737,7 @@ int TSystemisamfile::dump(
// @xref <mf TSystemisamfile::load>
{
FILE* f = fopen(to, "w");
FILE* f = NULL; fopen_s(&f, to, "w");
if (f == NULL)
{
setstatus(2);
@ -3008,8 +2946,7 @@ int TSystemisamfile::dump(
// @xref <mf TSystemisamfile::load>
{
FILE* f = fopen(to, "w");
FILE* f = NULL; fopen_s(&f, to, "w");
if (f == NULL)
{
setstatus(2);
@ -3262,7 +3199,7 @@ TRectype::TRectype(const TRectype& r)
*_memo_data = *r._memo_data;
}
memcpy(_rec, r._rec, _length);
strcpy(_tab, r._tab);
strcpy_s(_tab, sizeof(_tab), r._tab);
setempty(r.empty());
}
@ -3330,7 +3267,7 @@ void TRectype::init_memo(TRecnotype recno, TIsam_handle file)
void TRectype::settab(const char *tab)
{
strcpy(_tab, tab);
strcpy_s(_tab, sizeof(_tab), tab);
zero();
}
@ -3818,7 +3755,7 @@ TRectype& TRectype::operator =(const TRectype& rec)
init_memo(rec._memo_data->recno(), rec._memo_data->file());
*_memo_data = *rec._memo_data;
}
strcpy(_tab, rec._tab);
strcpy_s(_tab, sizeof(_tab), rec._tab);
setempty(rec.empty()); // Copy emptiness status
return *this;
}
@ -3919,10 +3856,10 @@ void TRectype::renum_key(const char* field, const char* val)
// Certified 99%
TRectype& TRectype::operator =(const char* rec)
{
if (rec && * rec)
if (rec && *rec)
{
memcpy(_rec, rec, _length);
setempty(FALSE);
setempty(false);
}
else
zero();
@ -3932,7 +3869,7 @@ TRectype& TRectype::operator =(const char* rec)
const char* TRectype::key(int numkey) const
{
TString& tmp = get_tmp_string(256);
__build_key(rec_des(), numkey, _rec, tmp.get_buffer(), FALSE);
__build_key(rec_des(), numkey, _rec, tmp.get_buffer(), false);
return tmp;
}
@ -3956,8 +3893,8 @@ bool TRectype::send_mail(const char* action) const
bool ok = ::can_dispatch_transaction(*this);
if (ok)
{
TFilename ininame; ininame.temp();
if (ok) // Test qualunque per usare {}
TFilename ininame; ininame.temp("msg", "ini");
if (ok) // Dummy test per {}
{
TConfig ini(ininame, "Transaction");
ini.set("Action", action);
@ -3965,7 +3902,7 @@ bool TRectype::send_mail(const char* action) const
fill_transaction(ini);
}
ok = ::dispatch_transaction(*this, ininame);
::remove(ininame);
ininame.fremove();
}
return ok;
}

@ -2207,15 +2207,48 @@ bool TEdit_field::parse_item(TScanner& scanner)
}
else scanner.push();
TString filter;
TString filter;
if (scanner.popkey() == "SE")
filter = (const char*)scanner.line();
else
scanner.push();
TToken_string orderby;
if (scanner.popkey() == "BY")
{
const char sep = orderby.separator();
orderby.separator(' ');
orderby = scanner.line();
orderby.strip_double_spaces();
orderby.replace(' ', sep);
orderby.separator(sep);
// Trasforma i nomi dei files in numeri se necessario
if (orderby.find('.') > 0)
{
TToken_string fld(16, '.');
TString16 name;
for (int i = 0; orderby.get(i, fld); i++)
{
if (!isdigit(fld[0]) && fld.find('.') > 0)
{
fld.get(0, name);
const int num = ::table2logic(name);
if (num != 0)
{
fld.add(num, 0);
orderby.add(fld, i);
}
}
}
}
}
else
scanner.push();
if (r != NULL)
{
_browse = new TBrowse(this, r, key, filter); // create browse with no filter ...
_browse = new TBrowse(this, r, key, filter, orderby); // create browse
// ... complete relation by parsing all Join items ...
while (scanner.popkey() == "JO")
@ -2868,7 +2901,7 @@ void TDate_field::create(WINDOW w)
TEdit_field::create(w);
if (automagic())
{
TDate d(TODAY);
const TDate d(TODAY);
set(d.string());
}
}

@ -6,7 +6,7 @@
#define NPAUT 2
#define FEAUT 3
#define M77AUT 4
// #define GIAUT 5 Obsoleta Gestione IVA implicita in CG (7)
#define GDAUT 5
#define SEAUT 6
#define CGAUT 7
#define CIAUT 8

@ -547,9 +547,6 @@ TSpreadsheet::TSpreadsheet(
l->active_back_color = FOCUS_BACK_COLOR;
l->white_space_color = MASK_DARK_COLOR;
l->rule_color = MASK_DARK_COLOR;
#ifdef LINUX
l->scroll_on_thumb_track = true;
#endif
// Definizione della prima colonna (numero di riga)
word attr = XI_ATR_RJUST;
@ -759,9 +756,7 @@ void TSpreadsheet::update_rec(int rec)
const bool has_focus = rec == selected() && mask().focus_field().dlg() == owner().dlg();
// if (has_focus) xi_set_focus(get_interface());
XI_OBJ row;
XI_MAKE_ROW(&row, _obj, riga);
XI_OBJ row; XI_MAKE_ROW(&row, _obj, riga);
xi_cell_request(&row); // Update internal values
if (has_focus)

@ -223,7 +223,8 @@ void TMultiple_rectype::renum_key()
if (i==0)
oldkey=b->key().build_key();
// convertire al piu' presto le seguenti righe ...
TRectype * rec = new TRectype(b->key());
//TRectype * rec = new TRectype(b->key()); // Crea riga della classe base?
TRectype* rec = new_body_record(logicnum); // Crea riga della classe giusta!
set_body_key(*rec);
b->set_key(rec); // Aggiorna righe
// .. nella piu' economiche

@ -24,26 +24,8 @@
// [JCW 95-Dec-20] comments added for distribution 95a
// [JCW 96-Jan-01] removed UDP capabilities from skstream
#ifdef INCSTR_H
#include <incstr.h>
#endif
#ifdef WIN32
#include "winsock.h"
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#define SOCKET int
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define SOCKADDR_IN sockaddr_in
#define closesocket close
#define BYTE byte
#endif
#pragma warning(disable:4005)
#include "winsock2.h"
//
// sockbuf
@ -954,7 +936,7 @@ bool TSocketClient::HttpGetFile(CONNID id, const char* remote, const char* local
return ok;
}
HIDDEN int find_href(const TString& riga, int from, TString& filename)
HIDDEN int find_href(const TString& riga, int from, TString& filename, const TString& pattern)
{
while (from >= 0)
{
@ -971,10 +953,10 @@ HIDDEN int find_href(const TString& riga, int from, TString& filename)
else
{
filename = riga.mid(href);
from = -1;
from = riga.len();
}
filename.trim();
if (filename.match("*.*"))
if (filename.match(pattern, true))
break;
}
else
@ -988,9 +970,9 @@ HIDDEN int find_href(const TString& riga, int from, TString& filename)
bool TSocketClient::HttpGetDir(CONNID id, const char* remote, TString_array& list)
{
TFilename local; local.temp();
TFilename local; local.temp("dir", "html");
TString server = remote, pattern;
TString server = remote, pattern = "*.*";
bool ok = false;
if (server.find('*') > 0 || server.find('?') > 0)
{
@ -1005,18 +987,15 @@ bool TSocketClient::HttpGetDir(CONNID id, const char* remote, TString_array& lis
ok = HttpGetFile(id, server, local);
if (ok)
{
TString riga(512);
TString riga(1024);
TFilename name;
ifstream s(local);
while (!s.eof())
{
s.getline(riga.get_buffer(), riga.size());
riga.lower();
for (int href = find_href(riga, 0, name); href >= 0; href = find_href(riga, href, name))
{
if (pattern.blank() || name.match(pattern, true))
list.add(name);
}
for (int href = find_href(riga, 0, name, pattern); href >= 0; href = find_href(riga, href, name, pattern))
list.add(name);
}
s.close();
xvt_fsys_remove_file(local);

@ -1,3 +1,4 @@
#pragma once
#ifndef __OBJECT_H
#define __OBJECT_H

@ -800,12 +800,15 @@ long TFile_manager::last_change(TIsam_handle name) const
return i.last_change();
}
int TFile_manager::close_closeable()
int TFile_manager::close_closeable(bool firm_only)
{
_open_files = 0; // Ricalcolo per sicurezza
for (TIsam_handle n = _fileinfo.last(); n > 0; n = _fileinfo.pred(n))
{
TFile_info& i = fileinfo(n);
if (firm_only && i.dir_type() != _nordir)
continue;
if (i.is_open())
{
_open_files++;
@ -821,9 +824,9 @@ int TFile_manager::close_closeable()
return _open_files;
}
void TFile_manager::close_all()
void TFile_manager::close_all(bool firm_only)
{
const int zoccolo_duro = close_closeable();
const int zoccolo_duro = close_closeable(firm_only);
#ifdef DBG
if (zoccolo_duro > 0)
NFCHECK("%d files refuse to be closed!", zoccolo_duro);
@ -832,6 +835,8 @@ void TFile_manager::close_all()
for (int n = _recinfo.last(); n > 0; n = _recinfo.pred(n))
{
const TRecord_info& r = recinfo(n);
if (firm_only && r.dir_type() != _nordir)
continue;
if (r.mutable_dir())
_recinfo.destroy(n);
}
@ -1016,14 +1021,15 @@ void TPrefix::set(
return;
if (_prefix != ".")
{
_manager.close_all();
const bool firm_only = !xvt_str_same(name, "COM") && !xvt_str_same(name, "DEF");
_manager.close_all(firm_only);
CCloseDir(NORDIR);
CCloseDir(COMDIR);
CCloseRecDir(NORDIR);
CCloseRecDir(COMDIR);
}
if (strcmp(name, "DEF") == 0)
if (xvt_str_same(name, "DEF"))
{
const char* prfx = CGetPref();
xvt_fsys_parse_pathname(prfx, NULL, NULL, _prefix.get_buffer(), NULL, NULL);
@ -1080,12 +1086,11 @@ bool TPrefix::exist(long codditta) const
bool TPrefix::test(const char* s) const
{
if (s && *s && strcmp(s, "DEF") != 0)
if (s && *s && !xvt_str_same(s, "DEF"))
{
TFilename s1(__ptprf);
s1.add(s);
s1.add("dir.gen");
s1.add("dir.gen");
if (s1.exist())
{
if (xvt_fsys_access(s1, 0x2) != 0)

@ -54,8 +54,8 @@ public:
void notify_change(TIsam_handle name);
long last_change(TIsam_handle name) const;
int close_closeable();
void close_all();
int close_closeable(bool firm_only = false);
void close_all(bool firm_only = false);
void open_all();
TFile_manager();
@ -138,19 +138,16 @@ public:
// @cmember Setta lo studio corrente
bool set_studio(const char* study, long firm = 0);
// @cmember Ritorna il contenuto della variabile <p _prefix>
const char* name() const
{ return _prefix;}
const char* name() const { return _prefix; }
// @cmember Ritorna il livello degli archivi
unsigned int filelevel() const
{return _filelevel;}
unsigned int filelevel() const { return _filelevel; }
// @cmember Ritorna il livello standard degli archivi
unsigned int get_stdlevel() const { return _stdlevel; }
void set_stdlevel(unsigned int sl) { _stdlevel = sl; }
// @cmember Ritorna il numero di archivi
int items() const
{ return _items; }
int items() const { return _items; }
// @cmember Ritorna la descrizione del file passato
const char* description(const char* cod) const;
// @cmember Ritorna la descrizione del file passato
@ -166,7 +163,7 @@ public:
// @cmember Riapre tutti gli archivi della ditta attiva
void reopen() const ;
TIsam_handle open_isamfile(int& logicnum, TFilename& name, bool excl = FALSE, bool idx = TRUE)
TIsam_handle open_isamfile(int& logicnum, TFilename& name, bool excl = false, bool idx = true)
{ return _manager.open(logicnum, name, excl, idx); }
int close_isamfile(TIsam_handle& name)

@ -55,11 +55,11 @@
#define RDOC_DAPROVV "DAPROVV"
#define RDOC_DANDOC "DANDOC"
#define RDOC_DAIDRIGA "DAIDRIGA"
#define RDOC_ACODNUM "DACODNUM"
#define RDOC_AANNO "DAANNO"
#define RDOC_APROVV "DAPROVV"
#define RDOC_ANDOC "DANDOC"
#define RDOC_AIDRIGA "DAIDRIGA"
#define RDOC_ACODNUM "ACODNUM"
#define RDOC_AANNO "AANNO"
#define RDOC_APROVV "APROVV"
#define RDOC_ANDOC "ANDOC"
#define RDOC_AIDRIGA "AIDRIGA"
#define RDOC_CODCMS "CODCMS"
#define RDOC_FASCMS "FASCMS"
#define RDOC_CODCOSTO "CODCOSTO"

@ -5,16 +5,13 @@
#include <colors.h>
#include <dongle.h>
#include <expr.h>
#include <modaut.h>
#include <progind.h>
#include <recarray.h>
#include <recset.h>
#include <relation.h>
#include <sheet.h>
#include <utility.h>
#include <xml.h>
#include <statbar.h>
///////////////////////////////////////////////////////////
// Utility
///////////////////////////////////////////////////////////
@ -105,7 +102,7 @@ bool TRecordset::save_as_html(const char* path)
if (out.fail())
return false;
TProgind pi(items(), TR("Esportazione in corso..."), true, true);
TProgress_monitor pi(items(), TR("Esportazione in corso..."), true);
out << "<html>" << endl;
save_html_head(out, main_app().title());
@ -177,7 +174,7 @@ bool TRecordset::save_as_html(const char* path)
TString val;
for (bool ok = move_first(); ok; ok = move_next())
{
if (!pi.addstatus(1))
if (!pi.add_status())
break;
out << " <tr>" << endl;
@ -235,7 +232,7 @@ bool TRecordset::save_as_html(const char* path)
out << "</body>" << endl;
out << "</html>" << endl;
return !pi.iscancelled();
return !pi.is_cancelled();
}
bool TRecordset::save_as_text(const char* path)
@ -244,7 +241,7 @@ bool TRecordset::save_as_text(const char* path)
if (out.fail())
return false;
TProgind pi(items(), TR("Esportazione in corso..."), true, true);
TProgress_monitor pi(items(), TR("Esportazione in corso..."), true);
TString val;
const char sep = text_separator();
@ -291,11 +288,11 @@ bool TRecordset::save_as_text(const char* path)
}
}
out << endl;
if (!pi.addstatus(1))
if (!pi.add_status())
break;
}
return !pi.iscancelled();
return !pi.is_cancelled();
}
bool TRecordset::save_as_campo(const char* path)
@ -304,7 +301,7 @@ bool TRecordset::save_as_campo(const char* path)
if (out.fail())
return false;
TProgind pi(items(), TR("Esportazione in corso..."), true, true);
TProgress_monitor pi(items(), TR("Esportazione in corso..."), true);
out << "[Head]" << endl;
out << "Version=0";
@ -349,10 +346,10 @@ bool TRecordset::save_as_campo(const char* path)
}
}
out << endl;
if (!pi.addstatus(1))
if (!pi.add_status())
break;
}
return !pi.iscancelled();
return !pi.is_cancelled();
}
bool TRecordset::save_as_dbf(const char* table, int mode)
@ -1647,7 +1644,7 @@ void TISAM_recordset::set(const char* use)
const TString& TISAM_recordset::driver_version() const
{
TString& tmp = get_tmp_string(20);
TString& tmp = get_tmp_string();
DB_version(tmp.get_buffer(), tmp.size());
return tmp;
}

@ -1,22 +1,18 @@
#ifndef __RECORDSET_H
#define __RECORDSET_H
#ifndef __ASSOC_H
#include <assoc.h>
#ifndef XVT_INCL_XVT
#include <xvt.h>
#endif
#ifndef __SHEET_H
#include <sheet.h>
#ifndef __RELATION_H
#include <relation.h>
#endif
#ifndef __VARIANT_H
#include <variant.h>
#endif
#ifndef __XVT_H
#include <xvt.h>
#endif
struct TRecordset_column_info : public TObject
{
TString _name; // Table.Column
@ -40,16 +36,16 @@ struct TAttributes : public TObject
COLOR _back;
COLOR _fore;
public:
XVT_FNTID get_font() const{ return _font; }
COLOR get_background() const { return _back; }
COLOR get_foreground() const { return _fore; }
void set_font(XVT_FNTID font) { _font = font; }
void set_background(COLOR back) { _back = back; }
void set_foreground(COLOR fore) { _fore = fore; }
public:
XVT_FNTID get_font() const{ return _font; }
COLOR get_background() const { return _back; }
COLOR get_foreground() const { return _fore; }
void set_font(XVT_FNTID font) { _font = font; }
void set_background(COLOR back) { _back = back; }
void set_foreground(COLOR fore) { _fore = fore; }
TAttributes() : _font(NULL), _back(COLOR_INVALID), _fore(COLOR_INVALID) {}
virtual ~TAttributes() {}
TAttributes() : _font(NULL), _back(COLOR_INVALID), _fore(COLOR_INVALID) {}
virtual ~TAttributes() {}
};
@ -163,22 +159,6 @@ public:
virtual ~TISAM_recordset();
};
///////////////////////////////////////////////////////////
// TRecordset_sheet
///////////////////////////////////////////////////////////
class TRecordset_sheet : public TSheet
{
TRecordset& _query;
protected:
virtual void get_row(long r, TToken_string& row);
virtual long get_items() const;
public:
TRecordset_sheet(TRecordset& sql, const char* title = "Query", byte buttons = 0);
};
///////////////////////////////////////////////////////////
// Utility
///////////////////////////////////////////////////////////

@ -2039,7 +2039,7 @@ bool TRelation_application::mask2mail(const TMask& m)
bool ok = _curr_trans_from.empty() && ::can_dispatch_transaction(get_relation()->curr());
if (ok)
{
TFilename ininame; ininame.temp();
TFilename ininame; ininame.temp("msg", "ini");
if (ok) // Test qualunque per usare {}
{
TConfig ini(ininame, "Transaction");

@ -1,9 +1,9 @@
#include <colors.h>
#include <defmask.h>
#include <expr.h>
#include <mask.h>
#include <printer.h>
#include <recarray.h>
#include <relation.h>
#include <reprint.h>
#include <utility.h>
#include <xml.h>
@ -2989,9 +2989,9 @@ void TReport::msg_isam_read(TVariant_stack& stack)
else
{
TLocalisamfile file(logicnum);
file.setkey(fkey);
TRectype& rec = file.curr();
rec = keyrec;
file.setkey(fkey);
if (file.read() != NOERR)
rec.zero();
do_isam_read_output(rec, out); // Se rec e' vuoto azzera gli outputs

@ -1907,7 +1907,7 @@ void TBook::split_file(int colonne)
{
TProgind pi(pages(), TR("Rigenerazione pagine"), true, true);
TFilename temp; temp.temp();
TFilename temp; temp.temp("bck");
ofstream out(temp);
TPointer_array index;
@ -1979,7 +1979,7 @@ void TBook::join_file(int pps)
{
TProgind pi(pages(), TR("Rigenerazione pagine"), true, true);
TFilename temp; temp.temp();
TFilename temp; temp.temp("bck");
ofstream out(temp);
close_output(); // Chiudo file di stampa eventualmente aperto
@ -2178,7 +2178,7 @@ bool TBook::export_pdf(TFilename& filename, bool signature)
{
// Evita problemi di aggiornamento del pdf: deve sempre rigenerarlo!
if (filename.exist() && !filename.fremove())
return error_box(FR("Impossibile riscrivere %s"), (const char*)filename);
return cantwrite_box(filename);
_pdf_file = filename;
_pagefrom = 1;

@ -1,10 +1,6 @@
#ifndef __SCANNER_H
#define __SCANNER_H
#ifndef INCSTR_H
#include <incstr.h>
#endif
#ifndef __STRINGS_H
#include <strings.h>
#endif

@ -78,7 +78,7 @@ public:
void enable_row(long r, bool on);
void disable_row(long r);
bool row_enabled(long n) const { return _disabled[n] == FALSE; }
bool row_enabled(long n) const { return !_disabled[n]; }
bool one_enabled() const { return _disabled.ones() < _sheet->items(); }
byte column_type(int c) const { CHECKD(c >= 0 && c < MAX_COL, "Bad column ", c); return _type[c]; }
@ -106,8 +106,8 @@ TSheet_control::TSheet_control(
short dy, // @parm Lunghezza (in caratteri) dello spreasheet
const char* flags, // @parm Flags di abilitazione
const char* head) // @parm Titolo delle colonne
: _sheet(NULL), _cur_rec(0), _check_enabled(FALSE),
_save_columns_order(FALSE)
: _sheet(NULL), _cur_rec(0), _check_enabled(false),
_save_columns_order(false)
{
const int NUMBER_WIDTH = 7;
@ -173,7 +173,7 @@ TSheet_control::TSheet_control(
if (i == 0 && v <= 1)
{
_type[i] = 'C';
_check_enabled = TRUE;
_check_enabled = true;
fixed_columns++;
f_width += v+1;
}
@ -221,15 +221,15 @@ TSheet_control::TSheet_control(
XI_LIST_DEF* l = listdef->v.list;
l->min_heading_height = xi_button_calc_height_font(xi_get_system_font()) * lines_in_header;
l->max_lines_in_cell = lines_in_cell;
l->sizable_columns = TRUE;
l->movable_columns = TRUE;
l->sizable_columns = true;
l->movable_columns = true;
l->fixed_columns = fixed_columns;
l->scroll_bar = TRUE;
l->scroll_bar_button = TRUE;
l->scroll_bar = true;
l->scroll_bar_button = true;
l->white_space_color = MASK_DARK_COLOR;
l->rule_color = MASK_DARK_COLOR;
#ifdef LINUX
l->scroll_on_thumb_track = TRUE;
l->scroll_on_thumb_track = true;
#endif
// Definizione della prima colonna (numero di riga)
@ -238,9 +238,9 @@ TSheet_control::TSheet_control(
2 * XI_FU_MULTIPLE, NUMBER_WIDTH , "");
coldef->app_data = (long)this;
coldef->v.column->heading_platform = TRUE;
coldef->v.column->column_platform = TRUE;
coldef->v.column->center_heading = TRUE;
coldef->v.column->heading_platform = true;
coldef->v.column->column_platform = true;
coldef->v.column->center_heading = true;
for (h = new_header.get(0), i = 0; h && i < MAX_COL; h = new_header.get(), i++)
{
@ -253,10 +253,10 @@ TSheet_control::TSheet_control(
v_width[i] * XI_FU_MULTIPLE, m_width[i], (char*)h);
coldef->app_data = (long)this;
coldef->v.column->heading_platform = TRUE;
coldef->v.column->center_heading = TRUE;
coldef->v.column->heading_platform = true;
coldef->v.column->center_heading = true;
if (m_width[i] > 64)
coldef->v.column->wrap_text = TRUE;
coldef->v.column->wrap_text = true;
if (i == 0 && _type[i] == 'C')
{
@ -395,6 +395,7 @@ void TSheet_control::make_current(long rec)
{
XI_MAKE_ROW(&o, _obj, newrow);
xi_cell_request(&o);
_obj->v.list->focus_cell->v.cell.row = newrow;
}
}
@ -493,7 +494,7 @@ void TSheet_control::enable_check(bool on)
bool TSheet_control::one_checked() const
{
bool yes = FALSE;
bool yes = false;
if (check_enabled())
{
const long first = _checked.first_one();
@ -507,8 +508,8 @@ void TSheet_control::check(
long n, // @parm Numero della riga da attivare/disattivare
bool on) // @parm Operazione da effettuare sulla riga:
//
// @flag TRUE | Attiva la riga <p n>.esima (default)
// @flag FALSE | Disattiva la riga <p n>.esima
// @flag true | Attiva la riga <p n>.esima (default)
// @flag false | Disattiva la riga <p n>.esima
{
if (n < 0)
{
@ -566,8 +567,8 @@ void TSheet_control::enable_row(
long n, // @parm Numero della riga da abilitare/diabilitare (default -1)
bool on) // @parm Operazione da svolgere sulla riga
//
// @flag TRUE | Abilita la riga <p n>-esima (default)
// @flag FALSE | Disabilita la riga <p n>-esima
// @flag true | Abilita la riga <p n>-esima (default)
// @flag false | Disabilita la riga <p n>-esima
// @comm Se <p n> e' minore di 0 allora vengono abilitate/disabilitate tutte le righe
{
@ -603,7 +604,7 @@ void TSheet_control::save_columns_order(const TEdit_field& field) const
TConfig config(CONFIG_USER, parag); // Apre il file di configurazione
TToken_string order(127); // Nuovo ordine delle colonne
if (_save_columns_order == TRUE) // Se vale 3 devo solo resettare
if (_save_columns_order == 1) // Se vale 3 devo solo resettare
{
int num;
XI_OBJ** column = xi_get_member_list(_obj, &num);
@ -624,7 +625,7 @@ void TSheet_control::save_columns_order(const TEdit_field& field) const
RCT rct; xi_get_rect(column[i], (XinRect *) &rct);
order << ',' << rct.right - rct.left;
}
config.set("Browse", order, NULL, TRUE, field.dlg());
config.set("Browse", order, NULL, true, field.dlg());
}
else
config.remove("Browse", field.dlg());
@ -645,7 +646,7 @@ void TSheet_control::load_columns_order(const TEdit_field& field)
else
set_columns_order(&order);
}
_save_columns_order = FALSE;
_save_columns_order = false;
}
void TSheet_control::align_column(int c, bool right)
@ -713,7 +714,8 @@ void TSheet_control::set_columns_order(TToken_string* order)
xi_set_focus(focus);
}
HIDDEN long _rec_to_select = -1;
// HIDDEN long _rec_to_select = -1;
// Certified 75%
bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
{
@ -729,7 +731,7 @@ bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
xiev->v.rec_request.data_rec = n;
}
else
refused = TRUE;
refused = true;
break;
case XIE_GET_LAST:
xiev->v.rec_request.data_rec = items()-1;
@ -739,7 +741,7 @@ bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
{
const long n = xiev->v.rec_request.spec_rec + (xiev->type == XIE_GET_NEXT ? +1 : -1) ;
if (n < 0 || n >= items())
refused = TRUE;
refused = true;
else
xiev->v.rec_request.data_rec = n;
}
@ -803,7 +805,7 @@ bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
_sheet->get_cell_colors(rec, col, xiev->v.cell_request.color, xiev->v.cell_request.back_color);
}
else
refused = TRUE;
refused = true;
}
else
{
@ -831,7 +833,7 @@ bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
_sheet->stop_run(K_ENTER);
}
else
refused = TRUE;
refused = true;
}
break;
case XIE_ON_LIST:
@ -842,7 +844,7 @@ bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
const long rec = row2rec(xiev->v.xi_obj->v.row);
if (_disabled[rec])
{
refused = TRUE;
refused = true;
// Cerca la prossima riga abilitata e valida
const int dir = rec > selected() ? +1: -1;
const long max = items();
@ -854,10 +856,13 @@ bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
}
else
{
/*
if (_sheet->_select_row < 0)
make_current(rec);
else
_rec_to_select = rec;
*/
_sheet->post_select(rec);
}
}
break;
@ -896,21 +901,21 @@ bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
make_current(rec);
}
}
refused = TRUE;
refused = true;
break;
case XIE_COL_MOVE:
if (xiev->v.column.in_fixed ||
xiev->v.column.col_nbr < xi_get_fixed_columns(xiev->v.column.list))
refused = TRUE;
refused = true;
else
_save_columns_order = TRUE;
_save_columns_order = true;
break;
case XIE_COL_SIZE:
{
if (_obj->v.list->hsb_win)
_save_columns_order = TRUE;
_save_columns_order = true;
else
refused = TRUE; // Non permetto il resize in assenza di scroll bar orizzontale
refused = true; // Non permetto il resize in assenza di scroll bar orizzontale
}
break;
case XIE_BUTTON:
@ -956,7 +961,7 @@ bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
if (rec >= 0)
{
_sheet->post_select(rec);
refused = TRUE;
refused = true;
}
}
break;
@ -1025,6 +1030,12 @@ TSheet::TSheet(short x, short y, short dx, short dy,
add_button(DLG_EXPORT, TR("~Excel"), 0, TOOL_EXCEL);
set_handler(DLG_EXPORT, export_handler);
if (buttons & 0x20)
{
add_button(DLG_EDIT, TR("~Filtro"), K_CTRL+'F', TOOL_ELABORA);
set_handler(DLG_EDIT, filtro_handler);
}
if (buttons & 0x08) add_button(DLG_QUIT, "Fine", K_ESC, TOOL_QUIT);
else add_button(DLG_CANCEL, "Annulla", K_ESC, TOOL_CANCEL);
@ -1151,7 +1162,8 @@ void TSheet::force_update(int r)
void TSheet::start_run()
{
const bool on = items() > 0 && _sheet->one_enabled();
const long imax = items();
const bool on = imax > 0 && _sheet->one_enabled();
// Abilita selezione se c'e' almeno un elemento
int pos = id2pos(DLG_SELECT);
@ -1170,11 +1182,11 @@ void TSheet::start_run()
if (on)
{
long i = selected();
if (i < 0 || i >= items())
if (i < 0 || i >= imax)
i = 0;
if (row_disabled(i))
for (i = 0; row_disabled(i); i++);
post_select(i);
for (; i < imax && row_disabled(i); i++);
if (i >= 0 && i < imax && i != selected())
post_select(i);
}
}
@ -1247,7 +1259,7 @@ bool TSheet::on_key(KEY key)
f.on_key(K_SPACE);
if (b.exit_key() > 0)
stop_run(b.exit_key());
return TRUE;
return true;
}
}
}
@ -1294,10 +1306,13 @@ void TSheet::on_idle()
{
if (_select_row >= 0)
{
const short focus_id = low_get_focus_id(curr_win());
_sheet->select(_select_row);
if (focus_id == _sheet->id())
_sheet->set_focus_rec(-1);
if (_select_row < items())
{
const short focus_id = low_get_focus_id(curr_win());
_sheet->select(_select_row);
if (focus_id == _sheet->id())
_sheet->set_focus_rec(-1);
}
_select_row = -1;
}
TMask::on_idle();
@ -1462,6 +1477,20 @@ bool TSheet::export_handler(TMask_field& f, KEY k)
return true;
}
bool TSheet::filter_dialog()
{ return sorry_box("Filtro non attivabile"); }
bool TSheet::filtro_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE)
{
TSheet& s = (TSheet&)f.mask();
s.filter_dialog();
return false;
}
return true;
}
void TSheet::save_columns_order(const TEdit_field& field)
{ sheet().save_columns_order(field); }
@ -1583,7 +1612,7 @@ TCursor_sheet::TCursor_sheet(TCursor* cursor, const char* fields,
{
const byte c = sheet().column_type(campo);
if (c == ' ')
sheet().align_column(campo, TRUE);
sheet().align_column(campo, true);
}
_key_cols.set(campo, in_key(fr));
@ -1591,17 +1620,17 @@ TCursor_sheet::TCursor_sheet(TCursor* cursor, const char* fields,
}
}
HIDDEN bool _can_post = FALSE;
HIDDEN bool _can_post = false;
KEY TCursor_sheet::run()
{
_cursor->freeze(TRUE);
_cursor->freeze(true);
select(_cursor->pos());
_can_post = TRUE;
_can_post = true;
const KEY k = TSheet::run();
_cursor->freeze(FALSE);
_cursor->freeze(false);
return k;
}
@ -1632,6 +1661,75 @@ bool TCursor_sheet::get_cell_colors(int row, int col, COLOR& fore, COLOR& back)
return TSheet::get_cell_colors(row, col, fore, back);
}
bool TCursor_sheet::filter_dialog()
{
TRectype rec = _cursor->curr();
const RecDes& rd = rec.rec_des();
const KeyDes& k0 = rd.Ky[0];
const int kfields = k0.NkFields;
TMask m(TR("Filtro"), 1, 78, kfields+5);
m.add_button_tool(DLG_OK, "", TOOL_OK);
m.add_button_tool(DLG_CANCEL, "", TOOL_CANCEL);
for (int i = 0; i < kfields; i++)
{
const int nf = k0.FieldSeq[i] % MaxFields;
const char* fname = rec.fieldname(nf);
const TFieldtypes ft = rec.type(fname);
TString16 prompt = fname; prompt.left_just(12);
TString4 flags;
switch (ft)
{
case _alfafld:
case _charfld:
m.add_string(101+i, 0, prompt, 1, i+1, rec.length(fname), flags).set_field(fname);
break;
case _intzerofld:
case _longzerofld:
flags << "Z";
case _wordfld:
case _intfld:
case _longfld:
m.add_number(101+i, 0, prompt, 1, i+1, rec.length(fname), flags).set_field(fname);
break;
case _datefld:
m.add_date(101+i, 0, prompt, 1, i+1, flags).set_field(fname);
break;
default:
break;
}
}
for (int i = 0; i < kfields-1; i++)
{
const int nf = k0.FieldSeq[i] % MaxFields;
const char* fname = rec.fieldname(nf);
TMask_field* f = m.find_by_fieldname(fname);
if (f)
f->set(rec.get(fname));
}
if (m.run() == K_ENTER)
{
rec.zero();
for (int i = 0; i < kfields; i++)
{
const int nf = k0.FieldSeq[i] % MaxFields;
const char* fname = rec.fieldname(nf);
const TMask_field* f = m.find_by_fieldname(fname);
if (f) rec.put(fname, f->get());
}
TWait_cursor hourglass;
_cursor->freeze(false);
_cursor->setregion(rec, rec);
_cursor->items();
_cursor->freeze(true);
force_update();
}
return true;
}
///////////////////////////////////////////////////////////
// TBrowse_sheet
///////////////////////////////////////////////////////////
@ -1708,12 +1806,12 @@ bool TBrowse_sheet::browse_field_handler(TMask_field& f, KEY k)
if (rec >= 0 && rec != _cur_browse->selected())
{
_cur_browse->select(rec); // Non mettere post_select
_can_post = TRUE;
_can_post = true;
RCT r; f.get_rect(r);
xvt_dwin_invalidate_rect(f.parent(), &r); // Non ricordo a cosa serva aggiornare il campo di testo
}
return TRUE;
return true;
}
bool TBrowse_sheet::last_browse_field_handler(TMask_field& f, KEY k)
@ -1724,7 +1822,7 @@ bool TBrowse_sheet::last_browse_field_handler(TMask_field& f, KEY k)
if (k == K_TAB && _can_post)
{
_cur_browse->post_select(_cur_browse->selected());
_can_post = FALSE;
_can_post = false;
}
else
{
@ -1797,6 +1895,7 @@ long TBrowse_sheet::handler(
}
break;
default:
/*
{
RCT r; sheet().get_rect(r);
if (xvt_rect_has_point(&r, ep->v.mouse.where) && _rec_to_select >= 0)
@ -1805,6 +1904,7 @@ long TBrowse_sheet::handler(
_rec_to_select = -1;
}
}
*/
break;
}
break;
@ -1834,7 +1934,7 @@ long TBrowse_sheet::handler(
return TCursor_sheet::handler(win, ep);
}
bool lst_handler(TMask_field& lst, KEY k)
static bool keysel_handler(TMask_field& lst, KEY k)
{
if (k == K_SPACE)
{
@ -1848,24 +1948,26 @@ bool lst_handler(TMask_field& lst, KEY k)
return true;
}
#define DLG_KEY_SELECTOR 69
void TBrowse_sheet::create_key_selector(TToken_string& ca)
{
const int items = ca.items();
if (items > 1)
{
TToken_string co;
TToken_string co(3*items);
for (int i = 0; i < items; i++)
co.add(i);
TList_field& lst = add_list(69, 0, PR("Ordinamento per "), 1, 0, 16, "", co, ca);
lst.set_handler(lst_handler);
TList_field& lst = add_list(DLG_KEY_SELECTOR, 0, PR("Ordinamento per "), 1, 0, 16, "", co, ca);
lst.set_handler(keysel_handler);
}
}
void TBrowse_sheet::update_key_selector(int sel)
{
if (id2pos(69) >= 0) // Has been created?
set(69, sel, 0); // Don't fire any events!
TMask_field* ks = find_by_id(DLG_KEY_SELECTOR);
if (ks != NULL) // Has been created?
ks->set(sel); // Don't fire any events!
}
TBrowse_sheet::TBrowse_sheet(TCursor* cursor, const char* fields,
@ -2020,6 +2122,10 @@ KEY TBrowse_sheet::run()
{
_cur_browse = this;
update_key_selector(_sel);
TMask_field* f = find_by_id(field().dlg());
if (f && !f->empty())
browse_field_handler(*f, K_SPACE); // Posizione iniziale
const KEY key = TCursor_sheet::run();
_cur_browse = NULL;
return key;

@ -31,13 +31,15 @@ protected: // TMask
static bool tutti_handler(TMask_field& f, KEY k);
static bool export_handler(TMask_field& f, KEY k);
static bool filtro_handler(TMask_field& f, KEY k);
protected:
void reset_parked() { _parked = -1; }
virtual void get_row(long r, TToken_string& row) { row.cut(0); }
virtual long get_items() const { return 0L; }
virtual bool get_ini_paragraph(const TEdit_field& owner, TString& parag) const;
virtual bool filter_dialog();
TSheet_control& sheet();
// @cmember Permette di riposizionare i bottoni all'interno della pagina
@ -191,6 +193,7 @@ protected: // TSheet
bool in_key(const TFieldref& fr) const;
virtual bool get_cell_colors(int row, int col, COLOR& fore, COLOR& back) const;
virtual bool filter_dialog();
// @access Public Member
public: // TSheet
@ -259,7 +262,6 @@ public:
void add_custom_filter(const char* regexp);
void set_custom_filter_handler(CONTROL_HANDLER custom_filter_handler) { _custom_filter_handler = custom_filter_handler;}
// @cmember Costruttore
TBrowse_sheet(TCursor* cursor, const char* fields, const char* title, const char* head, byte buttons, TEdit_field& f, TToken_string& siblings,CONTROL_HANDLER custom_filter_handler = NULL);
// @cmember Distruttore
@ -269,6 +271,26 @@ public:
virtual KEY run();
};
///////////////////////////////////////////////////////////
// TRecordset_sheet
///////////////////////////////////////////////////////////
#ifndef __RECORDSET_H
class TRecordset;
#endif
class TRecordset_sheet : public TSheet
{
TRecordset& _query;
protected:
virtual void get_row(long r, TToken_string& row);
virtual long get_items() const;
public:
TRecordset_sheet(TRecordset& sql, const char* title = "Query", byte buttons = 0);
};
#define FOR_EACH_CHECKED_ROW(__sheet, __r, __riga) \
TToken_string* __riga = NULL; if ((__sheet).one_checked()) \
for(long __r=0; __r < (__sheet).items() && (__riga = &(__sheet).row(__r))->not_empty(); __r++) \

@ -72,12 +72,26 @@ sqlite3* TSQLite::open(const char* fname)
if (err == SQLITE_OK)
{
if (xvt_fsys_is_fixed_drive(_currdb.path()) &&
ini_get_int(CONFIG_INSTALL, "Main", "Type") == 1) // Single user scenario
{
sqlite3_exec(_handle, "PRAGMA locking_mode=EXCLUSIVE", NULL, NULL, NULL);
sqlite3_exec(_handle, "PRAGMA synchronous=OFF", NULL, NULL, NULL);
sqlite3_exec(_handle, "PRAGMA journal_mode=WAL", NULL, NULL, NULL);
}
else
{
sqlite3_exec(_handle, "PRAGMA locking_mode=NORMAL", NULL, NULL, NULL);
sqlite3_exec(_handle, "PRAGMA synchronous=NORMAL", NULL, NULL, NULL);
sqlite3_exec(_handle, "PRAGMA journal_mode=DELETE", NULL, NULL, NULL);
}
create_dbf_times();
}
else
{
const char* errmsg = sqlite3_errmsg(_handle); // Stringa di sitema: inutile sqlite3_free(errmsg)
error_box(errmsg);
_handle = NULL;
}
return _handle;
@ -224,27 +238,30 @@ bool TSQLite::bind_record(const TRectype& rec, const RecDes& rd, sqlite3_stmt* p
bool TSQLite::import(int logicnum)
{
const TString& table = logic2table(logicnum);
const bool already = exists(table);
long last = get_dbf_time(table);
if (logicnum >= LF_USER) // Dummy test, 'last' should be updated ALWAYS!
{
TBaseisamfile file(logicnum);
if (!file.is_changed_since(last))
if (!file.is_changed_since(last) && already)
return true;
}
else
return false;
const RecDes& rd = prefix().get_recdes(logicnum);
TString sql;
if (exists(table))
if (already)
{
// Drop old table (and associated indexes?)
sql.cut(0) << "DROP TABLE "<< table << ';';
sql.cut(0) << "DROP TABLE " << table << ';';
exec(sql);
}
// Create new table
sql.cut(0) << "CREATE TABLE "<< table << "\n(";
sql.cut(0) << "CREATE TABLE " << table << "\n(";
int i;
for (i = 0; i < rd.NFields; i++)
{
@ -271,8 +288,7 @@ bool TSQLite::import(int logicnum)
{
cur.freeze();
msg << TR("Importazione tabella") << ' ' << table;
msg << ": " << items << ' ' << TR("righe");
msg << TR("Importazione ") << table << ": " << items << ' ' << TR("righe");
TProgress_monitor pi(items, msg);
// Creo il comando INSERT INTO table VALUES(?,?,?,?,?,?);
@ -284,6 +300,7 @@ bool TSQLite::import(int logicnum)
}
sql << ");";
TPerformance_profiler pp(msg);
exec("BEGIN"); // Inizio transazione
sqlite3_stmt* pStatement = NULL;
@ -292,11 +309,11 @@ bool TSQLite::import(int logicnum)
const TRectype& curr = rel.curr();
for (cur = 0; cur.pos() < items; ++cur)
{
if (!pi.add_status())
break;
bind_record(curr, rd, pStatement); // Sostituisce i ? coi veri valori
rc = sqlite3_step(pStatement); // Ritorna sempre 101 (SQLITE_DONE)
rc = sqlite3_reset(pStatement); // Azzero lo statement per ricominciare
if (!pi.add_status())
break;
}
rc = sqlite3_finalize(pStatement);
@ -306,13 +323,11 @@ bool TSQLite::import(int logicnum)
if (rd.NKeys > 0)
{
// Creo gli indici DOPO l'importazione per maggiore velocita'
msg.format("Creazione di %d indici sulla tabella %s", rd.NKeys, (const char*)table);
TProgress_monitor pi(rd.NKeys, msg);
msg.format("Creazione di %d indici su %s", rd.NKeys, (const char*)table);
TProgress_monitor pi(rd.NKeys, msg, false);
exec("BEGIN"); // Inizio transazione
for (int index = 0; index < rd.NKeys; index++)
{
if (!pi.addstatus(1))
break;
const KeyDes& kd = rd.Ky[index];
sql = "CREATE ";
if (!kd.DupKeys) sql << "UNIQUE ";
@ -324,10 +339,10 @@ bool TSQLite::import(int logicnum)
sql << rd.Fd[ndx].Name;
}
sql << ");";
exec("BEGIN"); // Inizio transazione
exec(sql);
exec("COMMIT"); // Fine transazione
pi.add_status();
}
exec("COMMIT"); // Fine transazione
}
set_dbf_time(table, last); // Aggiorna ora di ultima modifica
@ -341,22 +356,20 @@ bool TSQLite::parse_select_from(const char* szSql)
TString sql(szSql);
sql.trim(); sql.upper();
if (!sql.starts_with("SELECT"))
if (!sql.starts_with("SELECT "))
return false;
const int from = sql.find("FROM");
const int from = sql.find("FROM ");
if (from < 0)
return false;
const int where_pos = sql.find("WHERE", from);
const int where_pos = sql.find("WHERE ", from);
TToken_string tables(sql.sub(from+5, where_pos), ',');
TString table;
TProgress_monitor pi(tables.items(), TR("Importazione tabelle"));
FOR_EACH_TOKEN(tables, tok)
{
if (!pi.add_status())
break;
table = tok;
const int join_pos = table.find("JOIN ");
if (join_pos > 0)
@ -378,6 +391,8 @@ bool TSQLite::parse_select_from(const char* szSql)
pi.set_text(table);
import(logicnum);
}
if (!pi.add_status())
break;
}
return true;
@ -486,9 +501,9 @@ TRecnotype TSQL_recordset::items() const
{
TString sql; parsed_text(sql);
TPerformance_profiler prof("SQL query");
_TheDataBase.exec("PRAGMA show_datatypes = ON;", NULL, NULL);
_TheDataBase.exec("PRAGMA show_datatypes=ON;", NULL, NULL);
_TheDataBase.exec(sql, query_get_items, (TSQL_recordset*)this);
_TheDataBase.exec("PRAGMA show_datatypes = OFF;", NULL, NULL);
_TheDataBase.exec("PRAGMA show_datatypes=OFF;", NULL, NULL);
}
return _items;
}

@ -1,3 +1,4 @@
#pragma once
#ifndef __STDTYPES_H
#define __STDTYPES_H
@ -65,10 +66,6 @@ bool test_assistance_year();
void init_global_vars();
void free_global_vars();
#ifdef LINUX
#define __int64 long long //verificare
#endif
#endif // __STDTYPES_H

@ -29,6 +29,9 @@ const int MAX_SIZE = 65535;
inline bool is_space(char c)
{ return c >= '\t' && c <= ' '; }
inline int round16(int n)
{ const int k = (n/16 + 1) * 16; CHECKD(k>=n,"Round16 failed ", k); return k; }
// Certified 99%
// @doc EXTERNAL
//
@ -41,17 +44,19 @@ void TString::resize(
// @comm Non funziona con le stringhe static e per valori negativi di <p size>
{
CHECKD(size >= 0, "Invalid string resize ", size);
char* s = new char[size+1];
if (cpy && _str) strcpy(s, _str);
else *s = '\0';
char* s = (char*)calloc(round16(size+1), 1);
if (_str)
delete _str;
{
if (cpy && *_str)
strcpy_s(s, size+1, _str);
free(_str);
}
_str = s;
_size = size;
}
// Certified 99% (uses resize)
// @doc EXTERNAL
//
@ -65,8 +70,7 @@ TString& TString::set(
if (s && *s)
{
const int sz = strlen(s);
if (sz > size()) resize(sz, false);
strncpy(s, size());
strncpy(s, sz);
}
else
{
@ -93,12 +97,12 @@ int TString::make_room(
if (spare < s)
{
const int min_size = lun + s;
int new_size = 3 * min_size / 2;
int new_size = round16(3 * min_size / 2);
if (new_size > MAX_SIZE)
new_size = MAX_SIZE;
if (new_size < min_size)
fatal_box("Stringa di lunghezza eccessiva (%d)", min_size);
resize(int(new_size), true);
fatal_box("Stringa di lunghezza superiore a %d)", min_size);
resize(new_size, true);
}
return lun;
}
@ -124,7 +128,7 @@ TString::~TString()
{
if (_str)
{
delete _str;
free(_str);
#ifdef DBG
_str = NULL;
_size = -883;
@ -136,7 +140,7 @@ char TString::shift(int n)
{
CHECK(n>0 && n<=len(),"Errore di scorrimento");
const char r=*(_str+n-1);
strcpy(_str, _str+n);
strcpy_s(_str, _size+1, _str+n);
return r;
}
@ -145,7 +149,7 @@ TString& TString::operator <<(const char* s)
if (s && *s)
{
const int pos = make_room(strlen(s));
strcpy(&_str[pos], s);
strcpy_s(&_str[pos], _size-pos+1, s);
}
return *this;
}
@ -569,7 +573,7 @@ TString& TString::ltrim(
for (s = _str; *s && is_space(*s); s++);
if (s != _str)
strcpy(_str, s);
strcpy_s(_str, _size+1, s);
return *this;
}
@ -838,8 +842,9 @@ int TString::strncpy(const char* s, int n)
{
if (n > size())
resize(n, false);
for (; *s && i < n; i++)
_str[i] = *s++;
strncpy_s(_str, _size+1, s, n);
i = strlen(s);
if (n < i) i = n;
}
_str[i] = '\0';
return i;
@ -859,7 +864,7 @@ TString& TString::format(
char spark[512] = { 0 };
va_list pars;
va_start(pars, fmt);
const unsigned int tot = _vsnprintf(spark, sizeof(spark)-1, fmt, pars);
const unsigned int tot = _vsnprintf(spark, sizeof(spark), fmt, pars);
va_end(pars);
CHECK(tot < sizeof(spark), "Ue'! Quanto scrivi?");
@ -981,7 +986,7 @@ TString& TString::insert(
make_room(l);
const TString& spark = mid(pos); // Scrivi in spark la stringa da pos in poi
overwrite(s, pos); // Aggiungi s
strcpy(&_str[pos+l], spark); // Aggiungi spark
strcpy_s(&_str[pos+l], _size-(pos+l)+1, spark); // Aggiungi spark
}
return *this;
}
@ -1010,9 +1015,11 @@ word TString::hash() const
// TFixed_string
///////////////////////////////////////////////////////////
// Certified 100%
// Certified 99%
// Se la size del buffer str è di 16, allora la size stringa è di 15 (15 + '\0' = 16)
// es: char buf[16]; TFixed_string str(buf, sizeof(buf));
TFixed_string::TFixed_string(const char* str, int size)
: TString((char*)str, (size <= 0) ? strlen(str) : size-1)
: TString((char*)str, (size <= 0) ? strlen(str) : size-1)
{
CHECK(str, "NULL buffer for fixed string");
if (size > 0 && memchr(str, '\0', size) == NULL)
@ -1245,28 +1252,23 @@ bool TFilename::ok() const
}
// Certified 70%
const TFilename& TFilename::tempdir()
TFilename& TFilename::tempdir()
{
static TFilename _tempdir;
const bool create = _tempdir.empty() || !_tempdir.ends_with(user(), true);
if (create)
{
_tempdir.cut(0);
xvt_sys_get_profile_string(NULL, "Main", "Temp", "", _tempdir.get_buffer(), _tempdir.size());
if (_tempdir.blank())
const int maxlen = 28; // Lunghezza max nome file temporaneo = 42 -> lunghezza max cartella 42-14 = 28
DIRECTORY tmp = { 0 }; xvt_fsys_get_temp_dir(&tmp);
xvt_fsys_convert_dir_to_str(&tmp, _tempdir.get_buffer(), _tempdir.size());
if (_tempdir.len() > maxlen) // troppo lunga!
{
xvt_sys_get_env("TEMP", _tempdir.get_buffer(), _tempdir.size());
if (_tempdir.blank())
xvt_sys_get_env("TMP", _tempdir.get_buffer(), _tempdir.size());
if (_tempdir.len() > 28) // troppo lunga!
{
_tempdir.currdir();
_tempdir.add("temp");
xvt_sys_set_profile_string(NULL, "Main", "Temp", _tempdir);
}
_tempdir.currdir().add("temp");
if (_tempdir.len() > maxlen) // ancora troppo lunga!
_tempdir = "c:\\temp";
xvt_sys_set_profile_string(NULL, "Main", "Temp", _tempdir);
}
bool ok = dexist(_tempdir);
if (!ok) // Codebase NON funziona senza una temp esistente!
{
@ -1276,19 +1278,17 @@ const TFilename& TFilename::tempdir()
}
const int last = len()-1;
if (!is_not_slash(_str[last]))
if (is_slash(_str[last]))
_tempdir.cut(last);
_tempdir.lower();
TString theuser(user());
if (theuser.empty())
TString theuser = user();
if (theuser.blank())
theuser = ::dongle().administrator();
theuser.lower();
const int f = _tempdir.find(theuser);
if (f < 0 || f != _tempdir.len() - theuser.len())
if (!_tempdir.ends_with(user(), true))
_tempdir.add(theuser);
_tempdir.lower();
ok = dexist(_tempdir);
if (!ok)
{
@ -1304,62 +1304,58 @@ const TFilename& TFilename::tempdir()
return *this;
}
const TFilename& TFilename::currdir()
TFilename& TFilename::currdir()
{
DIRECTORY d; xvt_fsys_get_dir(&d);
xvt_fsys_convert_dir_to_str(&d, get_buffer(), size());
return *this;
}
// Certified 50%
// @doc EXTERNAL
TFilename& TFilename::slash_terminate()
{
if (empty())
operator<<(SLASH);
else
{
if (!is_slash(_str[len()-1]))
operator<<(find("/") >= 0 ? '/' : '\\');
}
return *this;
}
// @mfunc Genera il nome di un file temporaneo
const TFilename& TFilename::temp(
TFilename& TFilename::temp(
const char* prefix, // @parm Eventuale prefisso da assegnare al file temporaneo
const char* extension) // @parm Eventuale estensione da assegnare al file temporaneo
// @comm Nel generare il nome del file controlla se esistono dei caratteri jolly e li elimina.
{
if (extension && *extension)
{
TFilename root; root.tempdir();
if (prefix && *prefix)
{
bool has_path = false;
for (const char *s = prefix; !has_path && *s; s++)
has_path = *s ==':' || is_slash(*s);
if (has_path)
root = prefix;
else
root.add(prefix);
}
for (unsigned int n = (unsigned int)clock(); ; n++)
{
TString8 name; name.format("%05lu", n % 100000);
set(root); operator<<(name);
ext(extension);
if (!exist())
break;
}
}
else
TFilename root; root.tempdir();
root.slash_terminate();
if (prefix && *prefix)
{
tempdir();
if (prefix && *prefix)
bool has_path = false;
for (const char *s = prefix; !has_path && *s; s++)
has_path = *s ==':' || is_slash(*s);
if (has_path)
{
set(prefix); // Copia prefisso e ...
strip("$#*?."); // ... toglie caratteri jolly
root = prefix;
if (xvt_fsys_dir_exists(root))
root.slash_terminate();
}
else
cut(0);
char* t = _tempnam(NULL, _str);
CHECK(t != NULL, "Can't execute tempnam");
set(t);
free(t);
else
root.add(prefix);
}
CHECKS(!exist(), "Il file temporaneo esiste già: ", _str);
for (unsigned int n = (unsigned int)clock(); ; n++)
{
TString8 name; name.format("%05lu", n % 100000);
set(root); operator<<(name);
if (extension && *extension)
ext(extension);
if (!exist())
break;
}
return *this;
}
@ -1372,7 +1368,7 @@ bool TFilename::is_absolute_path() const
return is_slash(*s);
}
const TFilename& TFilename::make_absolute_path()
TFilename& TFilename::make_absolute_path()
{
if (is_relative_path())
{

@ -483,30 +483,24 @@ public:
// @class TFilename | Classe per la gestione dei nome dei file
//
// @base public | TString
class TFilename : public TString
class TFilename : public TString256
// @author:(INTERNAL) Guido
{
// @access Public Member
public:
// @cmember Costruttore
TFilename(const char* n = "") : TString(260)
{ set(n); }
TFilename(const char* n = "") : TString256(n) { }
// @cmember Costruttore
TFilename(const TString& n) : TString(260)
{ set(n); }
TFilename(const TString& n) : TString256(n) { }
// @cmember Costruttore
TFilename(const TFilename& n) : TString(260)
{ set(n); }
TFilename(const TFilename& n) : TString256(n) { }
// @cmember Assegnazione tra TFilename e stringa
const TString& operator =(const char* s)
{ return set(s); }
const TString& operator =(const char* s) { return set(s); }
// @cmember Assegnazione tra TFilename e TString
const TString& operator =(const TString& s)
{ return set((const char*)s); }
const TString& operator =(const TString& s) { return set((const char*)s); }
// @cmember Assegnazione tra TFilename e TFilename
const TString& operator =(const TFilename& s)
{ return set((const char*)s); }
const TString& operator =(const TFilename& s) { return set((const char*)s); }
// @cmember Controlla il formato del nome del file
virtual bool ok() const;
@ -524,7 +518,9 @@ public:
// @cmember Controlla se si tratta di un path relativo
bool is_relative_path() const { return !is_absolute_path(); }
// @cmember Trasforma un path da relativo ad assoluto
const TFilename& make_absolute_path();
TFilename& make_absolute_path();
// @cmember aggiunge uno slash finale
TFilename& TFilename::slash_terminate();
// @cmember Testa se il file esiste
bool exist() const;
// @cmember Cancella il file
@ -542,11 +538,11 @@ public:
// @cmember Ritorna il nome della cartella del file
const char* path() const;
// @cmember Genera il nome di un file temporaneo
const TFilename& temp(const char* prefix = NULL, const char* extension = NULL);
TFilename& temp(const char* prefix = NULL, const char* extension = NULL);
// @cmember Genera il nome della directory temporanea
const TFilename& tempdir();
TFilename& tempdir();
// @cmember Genera il nome della directory corrente
const TFilename& currdir();
TFilename& currdir();
// @cmember Prepone il nome della dir custom
bool custom_path(const char* path_list = NULL);
};

@ -291,7 +291,7 @@ HIDDEN bool _cf_val(TMask_field& f, KEY key)
if (cf.empty()) return true;
if (cf.len() == 11 && isdigit(cf[0]))
{
const TString& stato = f.mask().get(atoi(get_val_param(0)));
const TString& stato = get_fld_val_param(f, 0);
if (stato.full() && stato != "IT")
return true;
ok = pi_check (stato, cf);
@ -302,7 +302,7 @@ HIDDEN bool _cf_val(TMask_field& f, KEY key)
{
if(f.dirty())
{
ok = f.yesno_box(TR("Codice fiscale errato: lo accetto ugualmente?"));
ok = f.noyes_box(TR("Codice fiscale errato: si desidera accettarlo ugualmente?"));
if (ok) f.set_dirty(false);
}
else
@ -345,7 +345,7 @@ HIDDEN bool _xt_pi_val(TMask_field& f, KEY key)
if (pi != s1 && pi != s2 && pi != s3)
{
TString16 ui; ui.format("%03d", s1);
if (f.yesno_box(FR("Ufficio IVA della partita IVA non congruente: correggere in %s?"),
if (f.yesno_box(FR("Ufficio IVA non congruente con la partita IVA:\nsi desidera correggerlo in %s?"),
(const char*)ui))
{
value.overwrite(ui, 7);
@ -378,12 +378,7 @@ HIDDEN bool _xt_cf_val(TMask_field& f, KEY key)
return false;
if (cf.len() == 11 && real::is_natural(cf))
{
// if (!_xt_pi_val(f, key)) return false;
// TString16 stato(f.mask().get(atoi(get_val_param(0))));
// if ((stato.not_empty()) && (stato != "IT")) return true;
return true;
}
bool passed = __cf_check(cf);
if (!passed) return true;
@ -398,15 +393,16 @@ HIDDEN bool _xt_cf_val(TMask_field& f, KEY key)
TString16 data = fld_dat.get();
TString4 com = fld_com.get();
TString16 wm("LMNPQRSTUV");
int p;
if ((p = wm.find(cf[ 6])) >= 0) cf[ 6] = '0' + p;
if ((p = wm.find(cf[ 7])) >= 0) cf[ 7] = '0' + p;
if ((p = wm.find(cf[ 9])) >= 0) cf[ 9] = '0' + p;
if ((p = wm.find(cf[10])) >= 0) cf[10] = '0' + p;
if ((p = wm.find(cf[12])) >= 0) cf[12] = '0' + p;
if ((p = wm.find(cf[13])) >= 0) cf[13] = '0' + p;
if ((p = wm.find(cf[14])) >= 0) cf[14] = '0' + p;
const TFixed_string nm("LMNPQRSTUV");
int p = 0;
if ((p = nm.find(cf[ 6])) >= 0) cf[ 6] = '0' + p;
if ((p = nm.find(cf[ 7])) >= 0) cf[ 7] = '0' + p;
if ((p = nm.find(cf[ 9])) >= 0) cf[ 9] = '0' + p;
if ((p = nm.find(cf[10])) >= 0) cf[10] = '0' + p;
if ((p = nm.find(cf[12])) >= 0) cf[12] = '0' + p;
if ((p = nm.find(cf[13])) >= 0) cf[13] = '0' + p;
if ((p = nm.find(cf[14])) >= 0) cf[14] = '0' + p;
int gn = atoi(cf.mid(9,2));
if ((sesso == 'F' && gn < 40) || (sesso == 'M' && gn > 40))
@ -420,7 +416,9 @@ HIDDEN bool _xt_cf_val(TMask_field& f, KEY key)
if (gn > 40) gn -= 40; // Aggiusta giorno di nascita delle donne
// Controllo data di nascita
wm = "ABCDEHLMPRST";
const TFixed_string wm = "ABCDEHLMPRST";
if (data.full())
{
const TDate d(data);
@ -447,7 +445,7 @@ HIDDEN bool _xt_cf_val(TMask_field& f, KEY key)
if (mn > 0)
{
int anno = atoi(cf.mid(6, 2));
anno += anno < 10 ? 2000 : 1900;
anno += anno < 25 ? 2000 : 1900;
const TDate d(gn, mn, anno);
fld_dat.set(d.string());
}
@ -470,7 +468,6 @@ HIDDEN bool _xt_cf_val(TMask_field& f, KEY key)
return true;
}
HIDDEN bool _xtz_cf_val(TMask_field& f, KEY key)
{
return f.empty() || _xt_cf_val(f, key);
@ -513,7 +510,8 @@ HIDDEN bool _fixlen_val(TMask_field& f, KEY)
const int length = get_int_val_param(0);
const bool ok = s.len() == length;
if (!ok)
f.error_box(FR("La lunghezza del campo deve essere %d caratteri"), length);
f.error_box(FR("La lunghezza del campo deve essere %d %s"),
length, f.is_kind_of(CLASS_REAL_FIELD) ? TR("cifre") : TR("caratteri"));
return ok;
}

@ -272,7 +272,7 @@ bool TVariable_rectype::exist(const char* fieldname) const
return TRectype::exist(fieldname);
}
const TString & TVariable_rectype::get_str(const char* fieldname) const
const TString& TVariable_rectype::get_str(const char* fieldname) const
{
TVariable_field* f = (TVariable_field*) _virtual_fields.objptr(fieldname);

@ -206,7 +206,7 @@ public:
virtual word class_id() const { return CLASS_AUTO_VARIABLE_RECTYPE; }
virtual bool is_kind_of(word id) const { return id == class_id() || TVariable_rectype::is_kind_of(id); }
// @cmember Indica se esiste il campo <p fieldname>
virtual bool exist(const char* fieldname) const { return fieldname && *fieldname;}
virtual bool exist(const char* fieldname) const { return fieldname && *fieldname; }
// @cmember Distruttore
virtual ~TAuto_variable_rectype() {}

File diff suppressed because it is too large Load Diff

@ -38,11 +38,12 @@ WINDOW xvtil_create_statbar();
void xvtil_statbar_set(const char* text, bool def = FALSE);
void xvtil_statbar_refresh();
void xvtil_statbar_destroy();
int xvtil_statbar_height();
int xvtil_statbar_height();
bool xvtil_popup_message(const char* msg);
bool xvtil_popup_warning(const char* msg);
bool xvtil_popup_error(const char* msg);
bool xvtil_system_error(unsigned long lasterror, ...);
void beep(int severity = 0);
void do_events();