PORTING alla versione 4.56 di XVT piu' altre f...te
applicat.cpp Aggiornata alla 4.5 la gestione dei 3d controls, corretto routing di certi E_COMMAND corretta gestione title di XVT_CONFIG controls.cpp Intercettati eventi XIE_COLMOVE e XIE_COLSIZE intrappolato bottone sinistro del mouse e ignorati gli altri config.cpp Migliorata gestione paragrafi con righe vuote probabile ottimizzazione del reperimento delle variabili config.h Tolto un CAZZ di Ferdinando colors.cpp Creato per gestire scelta colori colors.h Aggiunta funzione di conversione colori mask.cpp Gestione popup menu sheet.cpp Salvataggio colonne msksheet.cpp Salvataggio colonne e colorazione righe printer.cpp Migliorato riconoscimento fax e calcolo dimensioni foglio tabapp.cpp Ora prima creo la relazione e poi la maschera principale xvtility.cpp Aggiornata la gestione dei controlli 3D di Windows mask.h Aggiunto metodo per avere il numero della sottomaschera git-svn-id: svn://10.65.10.50/trunk@3890 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
a1095f6e04
commit
bf819df0be
@ -7,7 +7,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#if XVT_OS == XVT_OS_WIN
|
#if XVT_OS == XVT_OS_WIN
|
||||||
# include <toolhelp.h>
|
#include <toolhelp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <applicat.h>
|
#include <applicat.h>
|
||||||
@ -230,11 +230,20 @@ long TApplication::handler(WINDOW win, EVENT* ep)
|
|||||||
about();
|
about();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (ep->v.cmd.tag > MAX_MENU_TAG)
|
||||||
|
{
|
||||||
|
WINDOW w = cur_win();
|
||||||
|
if (w != NULL_WIN && w != win)
|
||||||
|
::dispatch_e_menu(w, ep->v.cmd.tag);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (ep->v.cmd.tag >= BAR_ITEM(1))
|
if (ep->v.cmd.tag >= BAR_ITEM(1))
|
||||||
{
|
{
|
||||||
if(!menu(ep->v.cmd.tag))
|
if(!menu(ep->v.cmd.tag))
|
||||||
stop_run();
|
stop_run();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -320,13 +329,12 @@ void TApplication::terminate()
|
|||||||
if (_create_ok)
|
if (_create_ok)
|
||||||
{
|
{
|
||||||
destroy(); // Distruzione files e maschere
|
destroy(); // Distruzione files e maschere
|
||||||
|
|
||||||
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT
|
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT
|
||||||
const word WM_WAKEUP = RegisterWindowMessage("WAKEUP");
|
const word WM_WAKEUP = RegisterWindowMessage("WAKEUP");
|
||||||
const HTASK ht = GetCurrentTask();
|
const HTASK ht = GetCurrentTask();
|
||||||
SendMessage(HWND_BROADCAST, WM_WAKEUP, (unsigned int)ht, 0L);
|
SendMessage(HWND_BROADCAST, WM_WAKEUP, (unsigned int)ht, 0L);
|
||||||
#endif
|
|
||||||
|
|
||||||
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT
|
|
||||||
if (fexist("prassi.hlp"))
|
if (fexist("prassi.hlp"))
|
||||||
{
|
{
|
||||||
HWND hwnd = (HWND)xvt_vobj_get_attr(TASK_WIN, ATTR_NATIVE_WINDOW);
|
HWND hwnd = (HWND)xvt_vobj_get_attr(TASK_WIN, ATTR_NATIVE_WINDOW);
|
||||||
@ -440,11 +448,6 @@ void TApplication::check_parameters(
|
|||||||
else user() = "PRASSI";
|
else user() = "PRASSI";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT
|
|
||||||
const long twin_style = WSF_ICONIZABLE | WSF_SIZE | WSF_CLOSE | WSF_MAXIMIZED;
|
|
||||||
xvt_vobj_set_attr(NULL_WIN,ATTR_WIN_PM_TWIN_STARTUP_STYLE, twin_style);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// @doc EXTERNAL
|
// @doc EXTERNAL
|
||||||
@ -500,14 +503,24 @@ void TApplication::run(
|
|||||||
TString caption; caption << "PRASSI S.p.A. - " << mod;
|
TString caption; caption << "PRASSI S.p.A. - " << mod;
|
||||||
|
|
||||||
XVT_CONFIG cfg;
|
XVT_CONFIG cfg;
|
||||||
cfg.base_appl_name = (char*)base.name();
|
|
||||||
cfg.appl_name = (char*)(const char*)_title;
|
|
||||||
cfg.taskwin_title = (char*)(const char*)caption;
|
|
||||||
cfg.menu_bar_ID = TASK_MENUBAR+addbar;
|
cfg.menu_bar_ID = TASK_MENUBAR+addbar;
|
||||||
cfg.about_box_ID = 0;
|
cfg.about_box_ID = 0;
|
||||||
|
cfg.base_appl_name = (char*)base.name();
|
||||||
|
cfg.appl_name = (char*)(const char*)title;
|
||||||
|
cfg.taskwin_title = (char*)(const char*)caption;
|
||||||
|
|
||||||
xvt_vobj_set_attr(NULL_WIN,ATTR_WIN_PM_DRAWABLE_TWIN, TRUE);
|
xvt_vobj_set_attr(NULL_WIN,ATTR_WIN_PM_DRAWABLE_TWIN, TRUE);
|
||||||
|
|
||||||
|
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT
|
||||||
|
const long twin_style = WSF_ICONIZABLE | WSF_SIZE | WSF_CLOSE | WSF_MAXIMIZED;
|
||||||
|
xvt_vobj_set_attr(NULL_WIN,ATTR_WIN_PM_TWIN_STARTUP_STYLE, twin_style);
|
||||||
|
|
||||||
|
#ifdef ATTR_WIN_USE_CTL3D
|
||||||
|
xvt_vobj_set_attr(NULL_WIN, ATTR_WIN_USE_CTL3D, TRUE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
_application = this;
|
_application = this;
|
||||||
xvt_app_create(argc, argv, 0L, task_eh, &cfg);
|
xvt_app_create(argc, argv, 0L, task_eh, &cfg);
|
||||||
}
|
}
|
||||||
|
98
include/colors.cpp
Executable file
98
include/colors.cpp
Executable file
@ -0,0 +1,98 @@
|
|||||||
|
#if XVT_OS == XVT_OS_WIN
|
||||||
|
#define STRICT
|
||||||
|
#include <windows.h>
|
||||||
|
#include <commdlg.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <colors.h>
|
||||||
|
|
||||||
|
COLOR RGB2COLOR(unsigned char red, unsigned char green, unsigned char blue)
|
||||||
|
{
|
||||||
|
COLOR def = MAKE_COLOR(red, green, blue);
|
||||||
|
|
||||||
|
// Se nel colore non compare l'indice cerca di calcolarlo
|
||||||
|
const unsigned char color_index = (unsigned char)(def >> 12);
|
||||||
|
if (color_index <= 0x0 || color_index > 0xF)
|
||||||
|
{
|
||||||
|
const COLOR native_color[11] = { COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_CYAN,
|
||||||
|
COLOR_MAGENTA, COLOR_YELLOW, COLOR_BLACK, COLOR_DKGRAY,
|
||||||
|
COLOR_GRAY, COLOR_LTGRAY, COLOR_WHITE };
|
||||||
|
def &= 0x00FFFFFF;
|
||||||
|
for (int c = 0; c < 11; c++)
|
||||||
|
{
|
||||||
|
// Confronta solo la terna R,G,B
|
||||||
|
if (def == (native_color[c] & 0x00FFFFFF))
|
||||||
|
{
|
||||||
|
def = native_color[c];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
|
||||||
|
COLOR choose_color(COLOR col, WINDOW win)
|
||||||
|
{
|
||||||
|
int ok = FALSE;
|
||||||
|
|
||||||
|
#if XVT_OS == XVT_OS_WIN
|
||||||
|
CHOOSECOLOR cc;
|
||||||
|
memset(&cc, 0, sizeof(cc)); // Azzera struttura
|
||||||
|
|
||||||
|
if (win == NULL_WIN) win = TASK_WIN; // Sceglie una finestra valida
|
||||||
|
|
||||||
|
HWND hwnd = (HWND)xvt_vobj_get_attr(win, ATTR_NATIVE_WINDOW);
|
||||||
|
HDC hdc = GetDC(hwnd);
|
||||||
|
|
||||||
|
// Legge la palette di sistema
|
||||||
|
PALETTEENTRY* pe = NULL;
|
||||||
|
int max_entries = 0;
|
||||||
|
if (GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
|
||||||
|
{
|
||||||
|
max_entries = GetDeviceCaps(hdc, SIZEPALETTE);
|
||||||
|
pe = new PALETTEENTRY[max_entries];
|
||||||
|
GetSystemPaletteEntries(hdc, 0, max_entries, pe);
|
||||||
|
}
|
||||||
|
ReleaseDC(hwnd, hdc);
|
||||||
|
|
||||||
|
// Definisce i 16 colori customizzabili
|
||||||
|
unsigned long custom_colors[16];
|
||||||
|
for (int c = 0; c < 16; c++)
|
||||||
|
{
|
||||||
|
if (pe)
|
||||||
|
{
|
||||||
|
const PALETTEENTRY& e = pe[c < 8 ? c : max_entries - 16 + c];
|
||||||
|
custom_colors[c] = RGB(e.peRed, e.peGreen, e.peBlue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const unsigned char val = (c & 0x8) ? 255 : 127;
|
||||||
|
const unsigned char red = (c & 0x1) ? val : 0;
|
||||||
|
const unsigned char green = (c & 0x2) ? val : 0;
|
||||||
|
const unsigned char blue = (c & 0x4) ? val : 0;
|
||||||
|
custom_colors[c] = RGB(red, green, blue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pe)
|
||||||
|
{
|
||||||
|
delete pe;
|
||||||
|
pe = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cc.lStructSize = sizeof(cc); // Setta dimensioni
|
||||||
|
cc.hwndOwner = hwnd; // Setta finestra padre
|
||||||
|
cc.rgbResult = RGB(XVT_COLOR_GET_RED(c), XVT_COLOR_GET_GREEN(c), XVT_COLOR_GET_BLUE(c));
|
||||||
|
cc.lpCustColors = custom_colors; // Fissa colori custom
|
||||||
|
cc.Flags = CC_RGBINIT; // Usa col come primo colore
|
||||||
|
|
||||||
|
ok = ChooseColor(&cc) != 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ok)
|
||||||
|
col = RGB2COLOR(GetRValue(cc.rgbResult), GetGValue(cc.rgbResult), GetBValue(cc.rgbResult));
|
||||||
|
else
|
||||||
|
col = COLOR_INVALID;
|
||||||
|
|
||||||
|
return col;
|
||||||
|
}
|
@ -5,6 +5,9 @@
|
|||||||
#include <xvt.h>
|
#include <xvt.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
COLOR RGB2COLOR(unsigned char red, unsigned char green, unsigned char blue);
|
||||||
|
COLOR choose_color(COLOR col = COLOR_BLACK, WINDOW win = NULL_WIN);
|
||||||
|
|
||||||
extern COLOR MASK_BACK_COLOR;
|
extern COLOR MASK_BACK_COLOR;
|
||||||
extern COLOR MASK_LIGHT_COLOR;
|
extern COLOR MASK_LIGHT_COLOR;
|
||||||
extern COLOR MASK_DARK_COLOR;
|
extern COLOR MASK_DARK_COLOR;
|
||||||
|
@ -1,22 +1,12 @@
|
|||||||
#include <xvt.h>
|
|
||||||
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_NT
|
|
||||||
#include <io.h>
|
|
||||||
#else
|
|
||||||
#include <stdio.h>
|
|
||||||
#endif
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <applicat.h>
|
#include <applicat.h>
|
||||||
|
#include <colors.h>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <date.h>
|
#include <date.h>
|
||||||
#include <scanner.h>
|
#include <scanner.h>
|
||||||
#include <prefix.h>
|
#include <prefix.h>
|
||||||
#include <utility.h>
|
#include <utility.h>
|
||||||
|
|
||||||
extern "C"
|
extern "C" { int rename(const char*, const char*); };
|
||||||
{
|
|
||||||
int rename(const char*, const char*);
|
|
||||||
};
|
|
||||||
|
|
||||||
// @doc EXTERNAL
|
// @doc EXTERNAL
|
||||||
|
|
||||||
@ -73,17 +63,18 @@ bool TConfig::_read_paragraph()
|
|||||||
void TConfig::_write_paragraph(
|
void TConfig::_write_paragraph(
|
||||||
ofstream& out) // @parm Indirizzo dell'utput sul quale scrivere il paragrafo
|
ofstream& out) // @parm Indirizzo dell'utput sul quale scrivere il paragrafo
|
||||||
|
|
||||||
// @comm Scrive le variabili del paragrafo attivo. Nel caso il paragrafo non
|
// @comm Scrive sullo stream <p>out le variabili del paragrafo attivo.
|
||||||
// era presente viene aggiunto nel file.
|
|
||||||
{
|
{
|
||||||
_data.restart();
|
if (_data.items() > 0) // Inutile scrivere paragrafi vuoti!
|
||||||
out << '[' << _paragraph << ']' << endl;
|
|
||||||
for (int i = 0; i < _data.items(); i++)
|
|
||||||
{
|
{
|
||||||
THash_object* o = _data.get_hashobj();
|
out << '[' << _paragraph << ']' << endl;
|
||||||
out << o->key() << "\t= " << (TString&)(o->obj()) << '\n';
|
|
||||||
}
|
_data.restart();
|
||||||
|
for (THash_object* o = _data.get_hashobj(); o; o = _data.get_hashobj())
|
||||||
|
out << o->key() << " = " << (TString&)(o->obj()) << '\n';
|
||||||
|
|
||||||
out << endl;
|
out << endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TConfig::_write_file()
|
void TConfig::_write_file()
|
||||||
@ -95,25 +86,32 @@ void TConfig::_write_file()
|
|||||||
ofstream out(temp);
|
ofstream out(temp);
|
||||||
|
|
||||||
TString l(1024);
|
TString l(1024);
|
||||||
TString80 cnf; cnf << '[' << _paragraph << ']';
|
TString cnf; cnf << '[' << _paragraph << ']';
|
||||||
|
|
||||||
bool skip = FALSE, done = FALSE;
|
bool skip = FALSE, done = FALSE, skip_empty = TRUE;
|
||||||
|
|
||||||
while (!in.eof())
|
while (!in.eof())
|
||||||
{
|
{
|
||||||
in.getline((char *) (const char *) l, l.size());
|
in.getline((char*)(const char*)l, l.size());
|
||||||
l.trim();
|
l.trim();
|
||||||
|
|
||||||
if (cnf == l)
|
if (cnf == l)
|
||||||
{
|
{
|
||||||
// write paragraph and all variables
|
// write paragraph and all variables
|
||||||
_write_paragraph(out);
|
_write_paragraph(out);
|
||||||
skip = TRUE; done = TRUE;
|
skip = skip_empty = done = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (skip) skip = l[0] != '[';
|
if (skip)
|
||||||
if (!skip) out << l << '\n';
|
skip = l[0] != '[';
|
||||||
|
if (!skip)
|
||||||
|
{
|
||||||
|
const bool empty = l.empty();
|
||||||
|
if (!empty || !skip_empty)
|
||||||
|
out << l << endl;
|
||||||
|
skip_empty = empty;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// new paragraph
|
// new paragraph
|
||||||
@ -132,9 +130,10 @@ void TConfig::_write_file()
|
|||||||
|
|
||||||
void TConfig::set_paragraph(const char* section)
|
void TConfig::set_paragraph(const char* section)
|
||||||
{
|
{
|
||||||
if (section != NULL && section != _paragraph)
|
if (section != NULL && _paragraph != section)
|
||||||
{
|
{
|
||||||
if (_dirty) _write_file();
|
if (_dirty)
|
||||||
|
_write_file();
|
||||||
_paragraph = section;
|
_paragraph = section;
|
||||||
_dirty = FALSE;
|
_dirty = FALSE;
|
||||||
_read_paragraph();
|
_read_paragraph();
|
||||||
@ -159,15 +158,39 @@ bool TConfig::exist(
|
|||||||
{
|
{
|
||||||
if (index >= 0)
|
if (index >= 0)
|
||||||
{
|
{
|
||||||
TString80 vvar(var);
|
TString key(80);
|
||||||
vvar << '(' << index << ')';
|
key << var << '(' << index << ')';
|
||||||
return _data.is_key(vvar);
|
return _data.is_key(key);
|
||||||
}
|
}
|
||||||
return _data.is_key(var);
|
return _data.is_key(var);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @doc EXTERNAL
|
// @doc EXTERNAL
|
||||||
|
|
||||||
|
// @mfunc Elimina una variabile dal paragrafo corrente
|
||||||
|
//
|
||||||
|
// @rdesc Ritorna i seguenti valori:
|
||||||
|
//
|
||||||
|
// @flag TRUE | Se la variabile esiteva
|
||||||
|
// @flag FALSE | Se la variabile non esiteva
|
||||||
|
bool TConfig::remove(
|
||||||
|
const char* var, // @parm Nome della variabile
|
||||||
|
int index) // @parm Indice dell'elemento dell'array (default -1)
|
||||||
|
|
||||||
|
// @comm Se <p index> e' <gt>= 0 viene costruito il nome dell'elemento
|
||||||
|
// dell'array da cercare, diversamente viene cercata la variabile
|
||||||
|
// normale passata in <p var>.
|
||||||
|
{
|
||||||
|
TString key(var);
|
||||||
|
if (index >= 0)
|
||||||
|
key << '(' << index << ')';
|
||||||
|
const bool ok = _data.remove(key);
|
||||||
|
if (ok) _dirty = TRUE;
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @doc EXTERNAL
|
||||||
|
|
||||||
// @mfunc Ritorna il valore della variabile nella sezione corrente o in
|
// @mfunc Ritorna il valore della variabile nella sezione corrente o in
|
||||||
// quella specificata
|
// quella specificata
|
||||||
//
|
//
|
||||||
@ -187,27 +210,26 @@ TString& TConfig::get(
|
|||||||
// @xref <mf TConfig::get_long> <mf TConfig::get_int> <mf TConfig::get_bool>
|
// @xref <mf TConfig::get_long> <mf TConfig::get_int> <mf TConfig::get_bool>
|
||||||
// <mf TConfig::get_color>
|
// <mf TConfig::get_color>
|
||||||
{
|
{
|
||||||
HIDDEN TString256 s;
|
if (section) // Cambia paragrafo se necessario
|
||||||
|
|
||||||
const char* v = var;
|
|
||||||
if (index >= 0) // Mette indice tra parentesi
|
|
||||||
{
|
|
||||||
s = var;
|
|
||||||
s << '(' << index << ')';
|
|
||||||
v = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_paragraph(section);
|
set_paragraph(section);
|
||||||
|
|
||||||
if (_data.is_key(v))
|
TString* val;
|
||||||
s = (TString&)_data[v];
|
if (index >= 0)
|
||||||
else
|
|
||||||
{
|
{
|
||||||
s = def;
|
TString v(80);
|
||||||
if (s.not_empty())
|
v << var << '(' << index << ')';
|
||||||
set(var, def, section, TRUE, index);
|
val = (TString*)_data.objptr(v);
|
||||||
}
|
}
|
||||||
return s;
|
else
|
||||||
|
val = (TString*)_data.objptr(var);
|
||||||
|
|
||||||
|
if (val == NULL) // Se non la trova inserisci il default
|
||||||
|
{
|
||||||
|
set(var, def, section, TRUE, index);
|
||||||
|
val = &get(var, NULL, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *val;
|
||||||
}
|
}
|
||||||
|
|
||||||
// @doc EXTERNAL
|
// @doc EXTERNAL
|
||||||
@ -329,38 +351,6 @@ bool TConfig::get_bool(
|
|||||||
return s != "" && (s == "X" || s == "ON" || s == "YES" || s == "OK" || s == "TRUE");
|
return s != "" && (s == "X" || s == "ON" || s == "YES" || s == "OK" || s == "TRUE");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HIDDEN void RGB_COLOR(COLOR c, int& r, int& g, int& b)
|
|
||||||
{
|
|
||||||
r = int(c >> 16) & 0xFF;
|
|
||||||
g = int(c >> 8) & 0xFF;
|
|
||||||
b = int(c) & 0xFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
COLOR RGB2COLOR(unsigned char red, unsigned char green, unsigned char blue)
|
|
||||||
{
|
|
||||||
COLOR def = MAKE_COLOR(red, green, blue);
|
|
||||||
|
|
||||||
// Se nel colore non compare l'indice cerca di calcolarlo
|
|
||||||
const byte color_index = byte(def >> 12);
|
|
||||||
if (color_index < 0x1 || color_index > 0xF)
|
|
||||||
{
|
|
||||||
const COLOR native_color[11] = { COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_CYAN,
|
|
||||||
COLOR_MAGENTA, COLOR_YELLOW, COLOR_BLACK, COLOR_DKGRAY,
|
|
||||||
COLOR_GRAY, COLOR_LTGRAY, COLOR_WHITE };
|
|
||||||
for (int c = 0; c < 11; c++)
|
|
||||||
{
|
|
||||||
if (def == (native_color[c] & 0x00FFFFFF)) // Confronta solo la terna R,G,B
|
|
||||||
{
|
|
||||||
def = native_color[c];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return def;
|
|
||||||
}
|
|
||||||
|
|
||||||
// @doc EXTERNAL
|
// @doc EXTERNAL
|
||||||
|
|
||||||
// @mfunc Ritorna il valore del colore settato nella variabile nella
|
// @mfunc Ritorna il valore del colore settato nella variabile nella
|
||||||
@ -389,8 +379,9 @@ COLOR TConfig::get_color(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int r, g, b; RGB_COLOR(def, r, g, b);
|
TString16 d;
|
||||||
TString16 d; d.format("%d,%d,%d", r, g, b);
|
d.format("%d,%d,%d",
|
||||||
|
XVT_COLOR_GET_RED(def), XVT_COLOR_GET_GREEN(def), XVT_COLOR_GET_BLUE(def));
|
||||||
set(var, d, section, TRUE, index);
|
set(var, d, section, TRUE, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -422,17 +413,18 @@ bool TConfig::set(
|
|||||||
// implementare un array.
|
// implementare un array.
|
||||||
// <nl>Il paragrafo passato in <p section> diventa quello attivo.
|
// <nl>Il paragrafo passato in <p section> diventa quello attivo.
|
||||||
|
|
||||||
|
if (section)
|
||||||
set_paragraph(section);
|
set_paragraph(section);
|
||||||
TString vvar(var); if (index != -1) vvar << '(' << index << ')';
|
|
||||||
|
|
||||||
bool itwas = _data.is_key(vvar);
|
const bool itwas = exist(var, index);
|
||||||
|
|
||||||
if (itwas && !force)
|
if (itwas && !force)
|
||||||
warning_box("Tentativo di ridefinizione simbolo: %s", (const char*)vvar);
|
warning_box("Tentativo di ridefinizione simbolo: %s(%d)", var, index);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_dirty = TRUE;
|
TString256 vvar(var); if (index >= 0) vvar << '(' << index << ')';
|
||||||
_data.add(vvar, new TString(value), force);
|
_data.add(vvar, new TString(value), force);
|
||||||
|
_dirty = TRUE;
|
||||||
}
|
}
|
||||||
return itwas;
|
return itwas;
|
||||||
}
|
}
|
||||||
@ -444,6 +436,15 @@ bool TConfig::set(const char* var, long value, const char* section,
|
|||||||
return set(var,t,section,force,index);
|
return set(var,t,section,force,index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TConfig::set_color(const char* var, COLOR col, const char* section,
|
||||||
|
bool force, int index)
|
||||||
|
{
|
||||||
|
TString16 t;
|
||||||
|
t.format("%d,%d,%d", XVT_COLOR_GET_RED(col), XVT_COLOR_GET_GREEN(col), XVT_COLOR_GET_BLUE(col));
|
||||||
|
return set(var,t,section,force,index);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// @doc EXTERNAL
|
// @doc EXTERNAL
|
||||||
|
|
||||||
// @mfunc Ritorna quanti elementi dell'array nominato sono presenti nella
|
// @mfunc Ritorna quanti elementi dell'array nominato sono presenti nella
|
||||||
@ -455,14 +456,8 @@ word TConfig::items(
|
|||||||
// @comm Il paragrafo passato in <p section> diventa quello attivo.
|
// @comm Il paragrafo passato in <p section> diventa quello attivo.
|
||||||
// <nl>Possono esserci dei "buchi" causati da set() errate
|
// <nl>Possono esserci dei "buchi" causati da set() errate
|
||||||
{
|
{
|
||||||
set_paragraph(section);
|
if (section) set_paragraph(section);
|
||||||
TString vvar(16);
|
for (int cnt = 0; exist(var, cnt); cnt++);
|
||||||
for (int cnt = 0; /* uncazzo */ ;cnt++)
|
|
||||||
{
|
|
||||||
vvar = var; vvar << '(' << cnt << ')';
|
|
||||||
if (!_data.is_key(var))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -487,11 +482,12 @@ void TConfig::init(
|
|||||||
c.close();
|
c.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_paragraph.empty())
|
if (_paragraph.blank())
|
||||||
{
|
{
|
||||||
_paragraph = main_app().name();
|
_paragraph = main_app().name();
|
||||||
_paragraph.cut(2);
|
_paragraph.cut(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
_ispresent = _read_paragraph();
|
_ispresent = _read_paragraph();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -500,13 +496,14 @@ int TConfig::list_paragraphs(TString_array& pl)
|
|||||||
TScanner s(_file);
|
TScanner s(_file);
|
||||||
pl.destroy();
|
pl.destroy();
|
||||||
while (s.line().not_empty())
|
while (s.line().not_empty())
|
||||||
|
{
|
||||||
if (s.token()[0] == '[')
|
if (s.token()[0] == '[')
|
||||||
{
|
{
|
||||||
TToken_string* p = new TToken_string(s.token());
|
TToken_string* p = new TToken_string(s.token());
|
||||||
p->strip("[]");
|
p->strip("[]");
|
||||||
pl.add(p);
|
pl.add(p);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return pl.items();
|
return pl.items();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -540,21 +537,23 @@ TConfig::TConfig(int which_config, const char* paragraph)
|
|||||||
{
|
{
|
||||||
case CONFIG_DITTA:
|
case CONFIG_DITTA:
|
||||||
_file << main_app().get_firm_dir() << '/' << "prassid.ini";
|
_file << main_app().get_firm_dir() << '/' << "prassid.ini";
|
||||||
if (!fexist(_file)) fcopy("prassid.ini", _file);
|
if (!fexist(_file))
|
||||||
|
fcopy("prassid.ini", _file);
|
||||||
break;
|
break;
|
||||||
case CONFIG_STUDIO:
|
case CONFIG_STUDIO:
|
||||||
case CONFIG_USER:
|
case CONFIG_USER:
|
||||||
case CONFIG_STAMPE:
|
case CONFIG_STAMPE:
|
||||||
_file = firm2dir(-1); // Directory dati
|
_file = firm2dir(-1); // Directory dati
|
||||||
_file.add("config");
|
_file.add("config"); // Directory config
|
||||||
if (!fexist(_file))
|
if (!fexist(_file)) // Creala se becessario
|
||||||
make_dir(_file);
|
make_dir(_file);
|
||||||
|
|
||||||
switch (which_config)
|
switch (which_config)
|
||||||
{
|
{
|
||||||
case CONFIG_STUDIO:
|
case CONFIG_STUDIO:
|
||||||
_file.add("prassis.ini");
|
_file.add("prassis.ini");
|
||||||
if (!fexist(_file)) fcopy("prassis.ini", _file);
|
if (!fexist(_file))
|
||||||
|
fcopy("prassis.ini", _file);
|
||||||
break;
|
break;
|
||||||
case CONFIG_STAMPE:
|
case CONFIG_STAMPE:
|
||||||
_file.add("print.ini");
|
_file.add("print.ini");
|
||||||
|
@ -100,6 +100,9 @@ public:
|
|||||||
// sezione corrente o in quella specificata
|
// sezione corrente o in quella specificata
|
||||||
COLOR get_color(const char* var, const char* section = NULL, int index = -1, COLOR def = 0);
|
COLOR get_color(const char* var, const char* section = NULL, int index = -1, COLOR def = 0);
|
||||||
|
|
||||||
|
// @cmember Setta il colore nella sezione corrente o specificata
|
||||||
|
bool set_color(const char* var, COLOR col, const char* section = NULL, bool force = TRUE, int index = -1);
|
||||||
|
|
||||||
// @cmember Setta la variabile nella sezione corrente o specificata
|
// @cmember Setta la variabile nella sezione corrente o specificata
|
||||||
bool set(const char* var, const char* value, const char* section = NULL, bool force = TRUE, int index = -1);
|
bool set(const char* var, const char* value, const char* section = NULL, bool force = TRUE, int index = -1);
|
||||||
// @cmember Setta la variabile nella sezione corrente o specificata
|
// @cmember Setta la variabile nella sezione corrente o specificata
|
||||||
@ -108,6 +111,9 @@ public:
|
|||||||
// @cmember Controlla se esite una variabile nel paragrafo attivo
|
// @cmember Controlla se esite una variabile nel paragrafo attivo
|
||||||
bool exist(const char* var, int index = -1);
|
bool exist(const char* var, int index = -1);
|
||||||
|
|
||||||
|
// @cmember Elimina una variabile nel paragrafo attivo
|
||||||
|
bool remove(const char* var, int index = -1);
|
||||||
|
|
||||||
// @cmember Controlla se il paragrafo corrente e' nuovo (TRUE se nuovo)
|
// @cmember Controlla se il paragrafo corrente e' nuovo (TRUE se nuovo)
|
||||||
bool new_paragraph()
|
bool new_paragraph()
|
||||||
{ return !_ispresent; }
|
{ return !_ispresent; }
|
||||||
@ -125,7 +131,7 @@ public:
|
|||||||
// @cmember Riempie <p vl> con la lista dei nomi delle variabili
|
// @cmember Riempie <p vl> con la lista dei nomi delle variabili
|
||||||
// nella sezione corrente o in quella indicata; se
|
// nella sezione corrente o in quella indicata; se
|
||||||
// add_value e' TRUE ci mette "variabile<pipe>valore"
|
// add_value e' TRUE ci mette "variabile<pipe>valore"
|
||||||
// ACHTUNG: l'array e' in ordine HASH (CAZZ)
|
// ACHTUNG: l'array e' in ordine HASH
|
||||||
int list_variables(TString_array& vl, bool add_value = FALSE, const char* section = NULL);
|
int list_variables(TString_array& vl, bool add_value = FALSE, const char* section = NULL);
|
||||||
|
|
||||||
// @cmember Ritorna l'intero array delle variabili della sezione
|
// @cmember Ritorna l'intero array delle variabili della sezione
|
||||||
@ -146,6 +152,4 @@ public:
|
|||||||
virtual ~TConfig();
|
virtual ~TConfig();
|
||||||
};
|
};
|
||||||
|
|
||||||
COLOR RGB2COLOR(unsigned char red, unsigned char green, unsigned char blue);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -39,6 +39,7 @@ typedef struct _stx_data
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
HIDDEN bool _button_blocked = FALSE;
|
HIDDEN bool _button_blocked = FALSE;
|
||||||
|
HIDDEN int _last_mouse_button = 0;
|
||||||
|
|
||||||
short get_focus_id(WINDOW win)
|
short get_focus_id(WINDOW win)
|
||||||
{
|
{
|
||||||
@ -315,8 +316,8 @@ void init_controls()
|
|||||||
event_map[XIE_SELECT] = a_select;
|
event_map[XIE_SELECT] = a_select;
|
||||||
event_map[XIE_UPDATE] = a_update;
|
event_map[XIE_UPDATE] = a_update;
|
||||||
event_map[XIE_COL_DELETE] = a_ignore;
|
event_map[XIE_COL_DELETE] = a_ignore;
|
||||||
event_map[XIE_COL_MOVE] = a_ignore;
|
event_map[XIE_COL_MOVE] = a_obj;
|
||||||
event_map[XIE_COL_SIZE] = a_ignore;
|
event_map[XIE_COL_SIZE] = a_obj;
|
||||||
event_map[XIE_POST_NAVIGATION]= a_post;
|
event_map[XIE_POST_NAVIGATION]= a_post;
|
||||||
|
|
||||||
if (_picture == NULL)
|
if (_picture == NULL)
|
||||||
@ -508,15 +509,14 @@ HIDDEN void xi_event_handler(XI_OBJ* itf, XI_EVENT* xiev)
|
|||||||
case a_xvt:
|
case a_xvt:
|
||||||
switch (xiev->v.xvte.type)
|
switch (xiev->v.xvte.type)
|
||||||
{
|
{
|
||||||
|
case E_MOUSE_DOWN:
|
||||||
|
_last_mouse_button = xiev->v.xvte.v.mouse.button;
|
||||||
|
break;
|
||||||
case E_CHAR:
|
case E_CHAR:
|
||||||
{
|
{
|
||||||
XI_OBJ* fo = xi_get_focus(itf);
|
XI_OBJ* fo = xi_get_focus(itf);
|
||||||
if (fo != NULL && fo->type == XIT_CELL)
|
if (fo != NULL && fo->type == XIT_CELL)
|
||||||
ctl = (TControl*)xi_get_app_data(fo->parent);
|
ctl = (TControl*)xi_get_app_data(fo->parent);
|
||||||
#ifdef DBG
|
|
||||||
if (xiev->v.xvte.v.chr.ch == K_DOWN || xiev->v.xvte.v.chr.ch == K_UP)
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1301,7 +1301,7 @@ bool TButton_control::event_handler(XI_OBJ* itf, XI_EVENT* xiev)
|
|||||||
|
|
||||||
if (xiev->type == XIE_BUTTON)
|
if (xiev->type == XIE_BUTTON)
|
||||||
{
|
{
|
||||||
if (xi_move_focus(_obj))
|
if (_last_mouse_button == 0 && xi_move_focus(_obj))
|
||||||
{
|
{
|
||||||
switch (_obj->v.btn->type)
|
switch (_obj->v.btn->type)
|
||||||
{
|
{
|
||||||
@ -1314,8 +1314,6 @@ bool TButton_control::event_handler(XI_OBJ* itf, XI_EVENT* xiev)
|
|||||||
}
|
}
|
||||||
ok = notify_key(K_SPACE);
|
ok = notify_key(K_SPACE);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
ok = FALSE;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (xiev->type == XIE_POST_NAVIGATION)
|
if (xiev->type == XIE_POST_NAVIGATION)
|
||||||
|
@ -65,8 +65,13 @@ ITEM M_EDIT_DELETE "Cerca il prossimo\tF8" DISABLED
|
|||||||
MENUBAR BROWSE_BAR
|
MENUBAR BROWSE_BAR
|
||||||
|
|
||||||
MENU BROWSE_BAR
|
MENU BROWSE_BAR
|
||||||
|
SUBMENU BROWSE_BAR+1 "~Proprieta'"
|
||||||
|
|
||||||
|
MENU BROWSE_BAR+1
|
||||||
ITEM M_EDIT_COPY "~Salva impostazioni colonne"
|
ITEM M_EDIT_COPY "~Salva impostazioni colonne"
|
||||||
ITEM M_EDIT_UNDO "~Ripristina impostazioni colonne"
|
ITEM M_EDIT_UNDO "~Ripristina impostazioni colonne"
|
||||||
|
SEPARATOR
|
||||||
|
ITEM M_EDIT_SEARCH "~Informazioni"
|
||||||
|
|
||||||
ACCEL MENU_FILE "f" alt
|
ACCEL MENU_FILE "f" alt
|
||||||
|
|
||||||
|
@ -91,6 +91,7 @@ void TMask::init_mask()
|
|||||||
|
|
||||||
TMask::TMask(const char* title, int pages, int cols, int rows,
|
TMask::TMask(const char* title, int pages, int cols, int rows,
|
||||||
int xpos, int ypos)
|
int xpos, int ypos)
|
||||||
|
: _mask_num(0)
|
||||||
{
|
{
|
||||||
init_mask();
|
init_mask();
|
||||||
for (_pages = 0; _pages < pages; _pages++)
|
for (_pages = 0; _pages < pages; _pages++)
|
||||||
@ -194,6 +195,7 @@ void TMask::add_default_tag_buttons()
|
|||||||
}
|
}
|
||||||
|
|
||||||
TMask::TMask(const char* maskname, int num, int max)
|
TMask::TMask(const char* maskname, int num, int max)
|
||||||
|
: _mask_num(num)
|
||||||
{
|
{
|
||||||
if (maskname && *maskname)
|
if (maskname && *maskname)
|
||||||
read_mask(maskname, num, max);
|
read_mask(maskname, num, max);
|
||||||
@ -601,6 +603,85 @@ void TMask::on_button(short)
|
|||||||
/* Non devo fare niente !!! non essendo una TWindow */
|
/* Non devo fare niente !!! non essendo una TWindow */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TMask::handler(WINDOW win, EVENT* ep)
|
||||||
|
{
|
||||||
|
static TSheet_field* _last_sheet = NULL;
|
||||||
|
|
||||||
|
if (ep->type == E_MOUSE_DOWN && ep->v.mouse.button == 1)
|
||||||
|
{
|
||||||
|
_last_sheet = NULL;
|
||||||
|
for (int f = fields()-1; f >= 0; f--)
|
||||||
|
{
|
||||||
|
TMask_field& cur_fld = fld(f);
|
||||||
|
if (cur_fld.parent() == win)
|
||||||
|
{
|
||||||
|
RCT rct; cur_fld.get_rect(rct);
|
||||||
|
if (xvt_rect_has_point(&rct, ep->v.mouse.where))
|
||||||
|
{
|
||||||
|
if (cur_fld.is_kind_of(CLASS_SHEET_FIELD))
|
||||||
|
_last_sheet = (TSheet_field*)&cur_fld;
|
||||||
|
else
|
||||||
|
cur_fld.on_key(K_F11);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_last_sheet)
|
||||||
|
{
|
||||||
|
TSheet_field& sht = (TSheet_field&)*_last_sheet;
|
||||||
|
#if (XVT_PTK_VERSION_MAJOR > 4) || (XVT_PTK_VERSION_MAJOR == 4 && XVT_PTK_VERSION_MINOR >= 50)
|
||||||
|
MENU_ITEM* menu = xvt_res_get_menu(BROWSE_BAR);
|
||||||
|
if (menu)
|
||||||
|
{
|
||||||
|
const PNT& p = ep->v.mouse.where;
|
||||||
|
RCT cr; xvt_vobj_get_client_rect(win, &cr);
|
||||||
|
XVT_POPUP_ALIGNMENT pa = XVT_POPUP_CENTER;
|
||||||
|
if (p.h < cr.right / 3)
|
||||||
|
pa = XVT_POPUP_LEFT_ALIGN;
|
||||||
|
else
|
||||||
|
if (p.h > 2 * cr.right / 3)
|
||||||
|
pa = XVT_POPUP_RIGHT_ALIGN;
|
||||||
|
|
||||||
|
xvt_menu_popup(menu->child, win, p, pa, NULL);
|
||||||
|
xvt_res_free_menu_tree(menu);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
ASK_RESPONSE r = xvt_dm_post_ask("Annulla", "Ripristina", "Salva",
|
||||||
|
"Ordinamento delle colonne");
|
||||||
|
if (r == RESP_2)
|
||||||
|
sht.reset_columns_order();
|
||||||
|
if (r == RESP_2 || r == RESP_3)
|
||||||
|
sht.save_columns_order();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ep->type == E_COMMAND)
|
||||||
|
{
|
||||||
|
if (_last_sheet)
|
||||||
|
{
|
||||||
|
switch (ep->v.cmd.tag)
|
||||||
|
{
|
||||||
|
case M_EDIT_UNDO:
|
||||||
|
_last_sheet->reset_columns_order();
|
||||||
|
case M_EDIT_COPY:
|
||||||
|
_last_sheet->save_columns_order();
|
||||||
|
break;
|
||||||
|
case M_EDIT_SEARCH:
|
||||||
|
_last_sheet->on_key(K_F11);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TWindow::handler(win, ep);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// @doc EXTERNAL
|
// @doc EXTERNAL
|
||||||
|
|
||||||
// @mfunc Assegna una azione al tasto non standard
|
// @mfunc Assegna una azione al tasto non standard
|
||||||
|
@ -43,12 +43,18 @@ class TMask : public TWindow
|
|||||||
// @ccost:(INTERNAL) MAX_PAGES | 16 | Massimo numero di pagine nella maschera
|
// @ccost:(INTERNAL) MAX_PAGES | 16 | Massimo numero di pagine nella maschera
|
||||||
enum { MAX_PAGES = 16 };
|
enum { MAX_PAGES = 16 };
|
||||||
|
|
||||||
|
// @cmember Gestisce gli eventi della finestra
|
||||||
|
virtual void handler(WINDOW win, EVENT* ep);
|
||||||
|
|
||||||
// @access:(INTERNAL) Private Member
|
// @access:(INTERNAL) Private Member
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// @cmember:(INTERNAL) Windows delle pagine
|
// @cmember:(INTERNAL) Windows delle pagine
|
||||||
WINDOW _pagewin[MAX_PAGES+1];
|
WINDOW _pagewin[MAX_PAGES+1];
|
||||||
|
|
||||||
|
// @cmember:(INTERNAL) Numero della maschera all'interno del file sorgente
|
||||||
|
int _mask_num;
|
||||||
|
|
||||||
// @cmember:(INTERNAL) Numero di pagine della maschera
|
// @cmember:(INTERNAL) Numero di pagine della maschera
|
||||||
int _pages;
|
int _pages;
|
||||||
// @cmember:(INTERNAL) Pagina corrente
|
// @cmember:(INTERNAL) Pagina corrente
|
||||||
@ -64,6 +70,7 @@ class TMask : public TWindow
|
|||||||
// @cmember:(INTERNAL) Primo controllo che deve ricevere il focus
|
// @cmember:(INTERNAL) Primo controllo che deve ricevere il focus
|
||||||
int _first_focus;
|
int _first_focus;
|
||||||
|
|
||||||
|
// @cmember:(INTERNAL) Numero del controllo con il focus
|
||||||
int _focus;
|
int _focus;
|
||||||
|
|
||||||
// @cmember:(INTERNAL) Puntatore allo sheet che contiene la maschera (puo' essere NULL)
|
// @cmember:(INTERNAL) Puntatore allo sheet che contiene la maschera (puo' essere NULL)
|
||||||
@ -166,6 +173,10 @@ public:
|
|||||||
const TFilename& source_file() const
|
const TFilename& source_file() const
|
||||||
{ return _source_file; }
|
{ return _source_file; }
|
||||||
|
|
||||||
|
// @cmember Ritorna il numero della maschera nel file (> 0 se spreadsheet)
|
||||||
|
int number() const
|
||||||
|
{ return _mask_num; }
|
||||||
|
|
||||||
// @cmember Aggiunge alla maschera tutti i bottoni Pag. n
|
// @cmember Aggiunge alla maschera tutti i bottoni Pag. n
|
||||||
void add_default_tag_buttons();
|
void add_default_tag_buttons();
|
||||||
|
|
||||||
|
@ -399,8 +399,11 @@ bool TMask_field::active() const
|
|||||||
|
|
||||||
void TMask_field::set_dirty(bool d)
|
void TMask_field::set_dirty(bool d)
|
||||||
{
|
{
|
||||||
if (_flags.dirty == 3 && d == FALSE)
|
if (_flags.dirty == 3)
|
||||||
|
{
|
||||||
|
if (d == FALSE) // Non permette di annullare il dirty dei campi errati
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
_flags.dirty = d;
|
_flags.dirty = d;
|
||||||
set_focusdirty(d);
|
set_focusdirty(d);
|
||||||
}
|
}
|
||||||
@ -684,10 +687,10 @@ bool TOperable_field::on_key(
|
|||||||
case K_F11:
|
case K_F11:
|
||||||
{
|
{
|
||||||
TString msg(80);
|
TString msg(80);
|
||||||
msg = "State utilizzando il campo ";
|
msg << "Identificatore: " << dlg() << '\n'
|
||||||
msg << dlg() << " della maschera " << mask().source_file();
|
<< "Maschera: " << mask().source_file() << '\n';
|
||||||
if (field() != NULL)
|
if (field() != NULL)
|
||||||
msg << "\ncorrispondente al campo su record " << *field();
|
msg << "Campo: " << *field();
|
||||||
message_box(msg);
|
message_box(msg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1979,12 +1982,33 @@ int TBrowse::do_input(
|
|||||||
|
|
||||||
void TBrowse::do_output(CheckTime t)
|
void TBrowse::do_output(CheckTime t)
|
||||||
{
|
{
|
||||||
|
static TBit_array _checked;
|
||||||
|
static short _checking = 0;
|
||||||
|
|
||||||
if (t == FINAL_CHECK)
|
if (t == FINAL_CHECK)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
bool master;
|
||||||
|
if (_checking == 0)
|
||||||
|
{
|
||||||
|
master = TRUE;
|
||||||
|
_checking = field().dlg();
|
||||||
|
_checked.reset();
|
||||||
|
// Rendo intoccabili i campi del MIO output
|
||||||
|
for (const char* fld = _out_id.get(0); fld && *fld; fld = _out_id.get())
|
||||||
|
{
|
||||||
|
const short id = field().atodlg(fld);
|
||||||
|
_checked.set(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
master = FALSE;
|
||||||
|
|
||||||
TString sum;
|
TString sum;
|
||||||
TToken_string flds(24, '+');
|
TToken_string flds(24, '+');
|
||||||
|
|
||||||
|
const TRelation& relation = *_cursor->relation();
|
||||||
|
|
||||||
_out_fn.restart();
|
_out_fn.restart();
|
||||||
for (const char* fld = _out_id.get(0); fld && *fld; fld = _out_id.get())
|
for (const char* fld = _out_id.get(0); fld && *fld; fld = _out_id.get())
|
||||||
{
|
{
|
||||||
@ -2005,20 +2029,39 @@ void TBrowse::do_output(CheckTime t)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
const TFieldref fld(fr, 0);
|
const TFieldref fld(fr, 0);
|
||||||
sum << fld.read(*_cursor->relation());
|
sum << fld.read(relation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool hit = f.get() != sum;
|
const bool changing = f.get() != sum;
|
||||||
f.set(sum);
|
if (changing)
|
||||||
if (field().dlg() != id && hit)
|
{
|
||||||
|
bool hit = FALSE;
|
||||||
|
if (master)
|
||||||
|
{
|
||||||
|
f.set(sum);
|
||||||
|
hit = id != _checking; // Il mio handler viene fatto nella on_key
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!_checked[id])
|
||||||
|
{
|
||||||
|
f.set(sum);
|
||||||
|
_checked.set(id);
|
||||||
|
hit = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hit)
|
||||||
{
|
{
|
||||||
f.on_hit();
|
|
||||||
if (t == RUNNING_CHECK)
|
|
||||||
f.check();
|
f.check();
|
||||||
|
f.on_hit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (master)
|
||||||
|
_checking = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2217,9 +2260,8 @@ KEY TBrowse::run()
|
|||||||
KEY k = K_ESC;
|
KEY k = K_ESC;
|
||||||
long selected = 0;
|
long selected = 0;
|
||||||
|
|
||||||
TToken_string siblings;
|
TToken_string siblings, vals;
|
||||||
create_siblings(siblings);
|
create_siblings(siblings);
|
||||||
TToken_string vals;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
byte buttons = 0;
|
byte buttons = 0;
|
||||||
@ -2239,6 +2281,7 @@ KEY TBrowse::run()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const char* i = _inp_id.get(0); i; i = _inp_id.get())
|
for (const char* i = _inp_id.get(0); i; i = _inp_id.get())
|
||||||
{
|
{
|
||||||
if (*i != '"' && strchr(i, '@') == NULL)
|
if (*i != '"' && strchr(i, '@') == NULL)
|
||||||
@ -2254,7 +2297,6 @@ KEY TBrowse::run()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TBrowse_sheet s(_cursor, _items, caption, _head, buttons, &field(), siblings);
|
TBrowse_sheet s(_cursor, _items, caption, _head, buttons, &field(), siblings);
|
||||||
k = s.run();
|
k = s.run();
|
||||||
selected = s.selected();
|
selected = s.selected();
|
||||||
@ -2431,8 +2473,6 @@ const TBrowse* TEdit_field::parse_browse(TScanner& scanner) const
|
|||||||
const int id = scanner.integer();
|
const int id = scanner.integer();
|
||||||
const TEdit_field& f = mask().efield(id);
|
const TEdit_field& f = mask().efield(id);
|
||||||
const TBrowse* b = f.browse();
|
const TBrowse* b = f.browse();
|
||||||
if (b == NULL)
|
|
||||||
NFCHECK("La USE del campo %d e' nulla e non puo' essere copiata nel campo %d", id, dlg());
|
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2476,7 +2516,11 @@ bool TEdit_field::parse_item(TScanner& scanner)
|
|||||||
TString16 tabmaskname;
|
TString16 tabmaskname;
|
||||||
|
|
||||||
if (logicnum > 0)
|
if (logicnum > 0)
|
||||||
|
{
|
||||||
|
TDir d; d.get(logicnum);
|
||||||
|
if (fexist(d.filename())) // Controlla l'esistenza del file
|
||||||
r = new TRelation(logicnum);
|
r = new TRelation(logicnum);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tabmaskname = scanner.pop();
|
tabmaskname = scanner.pop();
|
||||||
@ -2492,7 +2536,7 @@ bool TEdit_field::parse_item(TScanner& scanner)
|
|||||||
{
|
{
|
||||||
key = scanner.integer();
|
key = scanner.integer();
|
||||||
#ifdef DBG
|
#ifdef DBG
|
||||||
if (key < 1 || key > 15)
|
if (key < 1 || key > MAX_KEYS)
|
||||||
{
|
{
|
||||||
yesnofatal_box("Chiave %d non valida nella USE del campo %d", key, dlg());
|
yesnofatal_box("Chiave %d non valida nella USE del campo %d", key, dlg());
|
||||||
key = 1;
|
key = 1;
|
||||||
@ -2507,6 +2551,8 @@ bool TEdit_field::parse_item(TScanner& scanner)
|
|||||||
else
|
else
|
||||||
scanner.push();
|
scanner.push();
|
||||||
|
|
||||||
|
if (r != NULL)
|
||||||
|
{
|
||||||
_browse = new TBrowse(this, r, key, filter);
|
_browse = new TBrowse(this, r, key, filter);
|
||||||
|
|
||||||
if (tabmaskname.not_empty())
|
if (tabmaskname.not_empty())
|
||||||
@ -2514,8 +2560,9 @@ bool TEdit_field::parse_item(TScanner& scanner)
|
|||||||
tabmaskname.insert("MBATB", 0);
|
tabmaskname.insert("MBATB", 0);
|
||||||
browse()->set_insert(tabmaskname);
|
browse()->set_insert(tabmaskname);
|
||||||
}
|
}
|
||||||
|
|
||||||
_check_enabled = TRUE;
|
_check_enabled = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2535,19 +2582,14 @@ bool TEdit_field::parse_item(TScanner& scanner)
|
|||||||
return browse()->parse_copy(what, *b);
|
return browse()->parse_copy(what, *b);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef DBG
|
|
||||||
return yesnofatal_box("Impossibile COPY senza USE nel campo %d", dlg());
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scanner.key() == "JO")
|
if (scanner.key() == "JO")
|
||||||
{
|
{
|
||||||
#ifdef DBG
|
if (browse())
|
||||||
if(browse() == NULL)
|
|
||||||
return yesnofatal_box("JOIN senza USE nel campo %d", dlg());
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
browse()->parse_join(scanner);
|
browse()->parse_join(scanner);
|
||||||
|
else
|
||||||
|
scanner.line();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2577,21 +2619,17 @@ bool TEdit_field::parse_item(TScanner& scanner)
|
|||||||
{
|
{
|
||||||
if (_browse)
|
if (_browse)
|
||||||
_browse->parse_input(scanner);
|
_browse->parse_input(scanner);
|
||||||
#ifdef DBG
|
|
||||||
else
|
else
|
||||||
yesnofatal_box("INPUT senza USE o SHEET nel campo %d", _ctl_data._dlg);
|
scanner.line();
|
||||||
#endif
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scanner.key() == "DI")
|
if (scanner.key() == "DI")
|
||||||
{
|
{
|
||||||
#ifdef DBG
|
if (browse())
|
||||||
if(!browse())
|
|
||||||
return yesnofatal_box("DISPLAY senza USE nel campo %d", _ctl_data._dlg);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
browse()->parse_display(scanner);
|
browse()->parse_display(scanner);
|
||||||
|
else
|
||||||
|
scanner.line();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2599,21 +2637,17 @@ bool TEdit_field::parse_item(TScanner& scanner)
|
|||||||
{
|
{
|
||||||
if (_browse)
|
if (_browse)
|
||||||
_browse->parse_output(scanner);
|
_browse->parse_output(scanner);
|
||||||
#ifdef DBG
|
|
||||||
else
|
else
|
||||||
return yesnofatal_box("OUTPUT senza USE nel campo %d", dlg());
|
scanner.line();
|
||||||
#endif
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scanner.key() == "AD")
|
if (scanner.key() == "AD")
|
||||||
{
|
{
|
||||||
#ifdef DBG
|
if (browse())
|
||||||
if(browse() == NULL)
|
|
||||||
return yesnofatal_box("ADD senza USE nel campo %d", dlg());
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
browse()->parse_insert(scanner);
|
browse()->parse_insert(scanner);
|
||||||
|
else
|
||||||
|
scanner.line();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,12 +12,14 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <colors.h>
|
#include <colors.h>
|
||||||
|
#include <config.h>
|
||||||
#include <controls.h>
|
#include <controls.h>
|
||||||
#include <keys.h>
|
|
||||||
#include <msksheet.h>
|
#include <msksheet.h>
|
||||||
#include <urldefid.h>
|
#include <urldefid.h>
|
||||||
#include <utility.h>
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
// TRow_property
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// TSpreadsheet
|
// TSpreadsheet
|
||||||
@ -42,8 +44,18 @@ class TSpreadsheet : public TControl
|
|||||||
TString_array _str;
|
TString_array _str;
|
||||||
// @cmember:(INTERNAL) Array delle colonne disattivate (solo visualizzazione)
|
// @cmember:(INTERNAL) Array delle colonne disattivate (solo visualizzazione)
|
||||||
TBit_array _column_disabled;
|
TBit_array _column_disabled;
|
||||||
// @cmember:(INTERNAL) Array dell celle disattivate (solo visualizzazione)
|
|
||||||
TArray _disabled;
|
struct TRow_property : public TObject
|
||||||
|
{
|
||||||
|
TBit_array _disabled;
|
||||||
|
COLOR _back, _fore;
|
||||||
|
|
||||||
|
TRow_property();
|
||||||
|
virtual ~TRow_property() { }
|
||||||
|
};
|
||||||
|
|
||||||
|
// @cmember:(INTERNAL) Array delle proprieta' delle righe
|
||||||
|
TArray _property;
|
||||||
|
|
||||||
// @cmember:(INTERNAL) Maschera in cui e' contenuto lo spreadsheet
|
// @cmember:(INTERNAL) Maschera in cui e' contenuto lo spreadsheet
|
||||||
TMask _mask;
|
TMask _mask;
|
||||||
@ -74,6 +86,10 @@ class TSpreadsheet : public TControl
|
|||||||
int _needs_update;
|
int _needs_update;
|
||||||
// @cmember:(INTERNAL) Numero della riga a cui saltare appena possibile
|
// @cmember:(INTERNAL) Numero della riga a cui saltare appena possibile
|
||||||
int _selection_posted;
|
int _selection_posted;
|
||||||
|
// @cmember:(INTERNAL) Dimensioni delle colonne
|
||||||
|
int _default_width[32]; // 32 = MAX_COLS
|
||||||
|
// @cmember:(INTERNAL) Bisogna salvare l'ordien delle colonne
|
||||||
|
bool _save_columns_order;
|
||||||
|
|
||||||
// @cmember:(INTERNAL) Inizializza lo spreadsheet
|
// @cmember:(INTERNAL) Inizializza lo spreadsheet
|
||||||
void init();
|
void init();
|
||||||
@ -133,6 +149,9 @@ protected:
|
|||||||
// @cmember Cerca la colonna col
|
// @cmember Cerca la colonna col
|
||||||
XI_OBJ* find_column(int col) const;
|
XI_OBJ* find_column(int col) const;
|
||||||
|
|
||||||
|
// @cmember Cerca le proprieta' della riga r e volendo le crea pure
|
||||||
|
TRow_property* get_property(int r, bool create = FALSE);
|
||||||
|
|
||||||
TSheet_field& owner() const { return (TSheet_field&)*_fld; }
|
TSheet_field& owner() const { return (TSheet_field&)*_fld; }
|
||||||
|
|
||||||
// @access Public Member
|
// @access Public Member
|
||||||
@ -182,6 +201,13 @@ public:
|
|||||||
// @cmember Permette di invertire la posizione di due righe
|
// @cmember Permette di invertire la posizione di due righe
|
||||||
void swap_rows(const int fromindex, const int toindex);
|
void swap_rows(const int fromindex, const int toindex);
|
||||||
|
|
||||||
|
// @cmember Salva la disposizione delle colonne
|
||||||
|
void save_columns_order() const;
|
||||||
|
// @cmember Salva la disposizione delle colonne
|
||||||
|
void load_columns_order();
|
||||||
|
// @cmember Setta la disposizione delle colonne
|
||||||
|
void set_columns_order(TToken_string* order);
|
||||||
|
|
||||||
// @cmember Setta la larghezza della colonna
|
// @cmember Setta la larghezza della colonna
|
||||||
void set_column_width(const int col, const int width) const;
|
void set_column_width(const int col, const int width) const;
|
||||||
// @cmember Setta il titolo della colonna
|
// @cmember Setta il titolo della colonna
|
||||||
@ -192,6 +218,10 @@ public:
|
|||||||
void enable_cell(int row, int column, bool on = TRUE);
|
void enable_cell(int row, int column, bool on = TRUE);
|
||||||
// @cmember Controlla se una cella e' disabilitata
|
// @cmember Controlla se una cella e' disabilitata
|
||||||
bool cell_disabled(int row, int column) const;
|
bool cell_disabled(int row, int column) const;
|
||||||
|
// @cmember Setta i colori di una riga
|
||||||
|
void set_back_and_fore_color(COLOR back, COLOR fore, int row);
|
||||||
|
// @cmember Legge i colori di una riga
|
||||||
|
void get_back_and_fore_color(COLOR& back, COLOR& fore, int row);
|
||||||
|
|
||||||
// @cmember Ritorna la maschera che appartiene allo spreadsheet
|
// @cmember Ritorna la maschera che appartiene allo spreadsheet
|
||||||
TMask& sheet_mask() const;
|
TMask& sheet_mask() const;
|
||||||
@ -247,6 +277,12 @@ public:
|
|||||||
virtual ~TSpreadsheet();
|
virtual ~TSpreadsheet();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
TSpreadsheet::TRow_property::TRow_property()
|
||||||
|
: _back(NORMAL_BACK_COLOR), _fore(NORMAL_COLOR)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
// @doc INTERNAL
|
// @doc INTERNAL
|
||||||
|
|
||||||
// @mfunc Costruttore
|
// @mfunc Costruttore
|
||||||
@ -265,7 +301,7 @@ TSpreadsheet::TSpreadsheet(
|
|||||||
_mask(maskname, maskno), _notify(NULL),
|
_mask(maskname, maskno), _notify(NULL),
|
||||||
_cur_row(0), _cur_col(1), _cur_rec(0), _edit_field(NULL), _active(TRUE),
|
_cur_row(0), _cur_col(1), _cur_rec(0), _edit_field(NULL), _active(TRUE),
|
||||||
_row_dirty(FALSE), _cell_dirty(FALSE), _check_enabled(TRUE),
|
_row_dirty(FALSE), _cell_dirty(FALSE), _check_enabled(TRUE),
|
||||||
_needs_update(-1), _selection_posted(-1)
|
_needs_update(-1), _selection_posted(-1), _save_columns_order(FALSE)
|
||||||
{
|
{
|
||||||
const int NUMBER_WIDTH = 3;
|
const int NUMBER_WIDTH = 3;
|
||||||
const int MAX_COL = 32;
|
const int MAX_COL = 32;
|
||||||
@ -289,7 +325,6 @@ TSpreadsheet::TSpreadsheet(
|
|||||||
|
|
||||||
const int cid = FIRST_FIELD+i; // Column & Field ID
|
const int cid = FIRST_FIELD+i; // Column & Field ID
|
||||||
const TOperable_field & f = (TOperable_field &) _mask.field(cid); // Field on mask
|
const TOperable_field & f = (TOperable_field &) _mask.field(cid); // Field on mask
|
||||||
// CHECKD(f, "The spreadsheet mask needs ALSO field ", cid);
|
|
||||||
|
|
||||||
TString testa(h);
|
TString testa(h);
|
||||||
const int at = testa.find('@');
|
const int at = testa.find('@');
|
||||||
@ -423,6 +458,14 @@ TSpreadsheet::TSpreadsheet(
|
|||||||
CHECKD(_obj, "Can't create spreadsheet ", owner().dlg());
|
CHECKD(_obj, "Can't create spreadsheet ", owner().dlg());
|
||||||
|
|
||||||
update_tab_cid();
|
update_tab_cid();
|
||||||
|
|
||||||
|
int num;
|
||||||
|
XI_OBJ** column = xi_get_member_list(_obj, &num);
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
RCT rct; xi_get_rect(column[i], &rct);
|
||||||
|
_default_width[i] = rct.right - rct.left;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TSpreadsheet::~TSpreadsheet()
|
TSpreadsheet::~TSpreadsheet()
|
||||||
@ -434,7 +477,6 @@ TMask& TSpreadsheet::sheet_mask() const
|
|||||||
return ((TSpreadsheet*)this)->_mask;
|
return ((TSpreadsheet*)this)->_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Converts a row number in the correspondig record number
|
// Converts a row number in the correspondig record number
|
||||||
int TSpreadsheet::row2rec(int& row)
|
int TSpreadsheet::row2rec(int& row)
|
||||||
{
|
{
|
||||||
@ -455,7 +497,6 @@ int TSpreadsheet::row2rec(int& row)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Converts a row number in the correspondig record number
|
// Converts a row number in the correspondig record number
|
||||||
int TSpreadsheet::rec2row(int record)
|
int TSpreadsheet::rec2row(int record)
|
||||||
{
|
{
|
||||||
@ -659,7 +700,7 @@ int TSpreadsheet::insert(
|
|||||||
const bool ok = notify(r, K_INS);
|
const bool ok = notify(r, K_INS);
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
_disabled.insert(NULL, r);
|
_property.insert(NULL, r);
|
||||||
owner().post_insert(r);
|
owner().post_insert(r);
|
||||||
xi_insert_row(_obj, INT_MAX);
|
xi_insert_row(_obj, INT_MAX);
|
||||||
|
|
||||||
@ -702,13 +743,13 @@ bool TSpreadsheet::destroy(
|
|||||||
|
|
||||||
if (rec < 0)
|
if (rec < 0)
|
||||||
{
|
{
|
||||||
_disabled.destroy();
|
|
||||||
_str.destroy();
|
_str.destroy();
|
||||||
|
_property.destroy();
|
||||||
set_dirty(_row_dirty = FALSE);
|
set_dirty(_row_dirty = FALSE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_disabled.destroy(rec, TRUE); // Destroy enable info
|
_property.destroy(rec, TRUE); // Destroy line info
|
||||||
ok = _str.destroy(rec, TRUE); // Destroy line
|
ok = _str.destroy(rec, TRUE); // Destroy line
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -821,6 +862,7 @@ bool TSpreadsheet::test_focus_change()
|
|||||||
bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
||||||
{
|
{
|
||||||
static KEY _lastab = K_TAB;
|
static KEY _lastab = K_TAB;
|
||||||
|
static char tmp[16];
|
||||||
|
|
||||||
BOOLEAN& refused = xiev->refused;
|
BOOLEAN& refused = xiev->refused;
|
||||||
|
|
||||||
@ -886,6 +928,11 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
|||||||
xiev->v.cell_request.back_color = DISABLED_BACK_COLOR;
|
xiev->v.cell_request.back_color = DISABLED_BACK_COLOR;
|
||||||
xiev->v.cell_request.attrib &= ~XI_ATR_ENABLED;
|
xiev->v.cell_request.attrib &= ~XI_ATR_ENABLED;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
get_back_and_fore_color(xiev->v.cell_request.back_color,
|
||||||
|
xiev->v.cell_request.color, rec);
|
||||||
|
}
|
||||||
|
|
||||||
if (e->has_query_button())
|
if (e->has_query_button())
|
||||||
{
|
{
|
||||||
@ -899,7 +946,8 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
src = format("%d", rec+1);
|
sprintf(tmp, "%d", rec+1);
|
||||||
|
src = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* dst = xiev->v.cell_request.s;
|
char* dst = xiev->v.cell_request.s;
|
||||||
@ -1132,6 +1180,16 @@ bool TSpreadsheet::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
|||||||
_check_enabled = TRUE;
|
_check_enabled = TRUE;
|
||||||
}
|
}
|
||||||
break;
|
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;
|
||||||
|
else
|
||||||
|
_save_columns_order = TRUE;
|
||||||
|
break;
|
||||||
|
case XIE_COL_SIZE:
|
||||||
|
_save_columns_order = TRUE;
|
||||||
|
break;
|
||||||
case XIE_GET_PERCENT:
|
case XIE_GET_PERCENT:
|
||||||
{
|
{
|
||||||
const long rec = xiev->v.get_percent.record;
|
const long rec = xiev->v.get_percent.record;
|
||||||
@ -1463,19 +1521,12 @@ XI_OBJ* TSpreadsheet::find_column(
|
|||||||
|
|
||||||
int num;
|
int num;
|
||||||
XI_OBJ** columns = xi_get_member_list(_obj, &num);
|
XI_OBJ** columns = xi_get_member_list(_obj, &num);
|
||||||
for (int c = num-1; c > 0; c--)
|
for (int c = num-1; c >= 0; c--)
|
||||||
{
|
{
|
||||||
if (columns[c]->cid == col)
|
if (columns[c]->cid == col)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return c >= 0 ? columns[c] : NULL;
|
||||||
if (c <= 0)
|
|
||||||
{
|
|
||||||
yesnofatal_box("Can't find column with id=%d", col);
|
|
||||||
c = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return columns[c];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1525,30 +1576,55 @@ void TSpreadsheet::enable_cell(
|
|||||||
{
|
{
|
||||||
if (column >= FIRST_FIELD)
|
if (column >= FIRST_FIELD)
|
||||||
column = cid2index(column);
|
column = cid2index(column);
|
||||||
TBit_array* ba = (TBit_array*)_disabled.objptr(row);
|
|
||||||
if (ba == NULL)
|
TRow_property* prop = get_property(row);
|
||||||
|
if (prop == NULL)
|
||||||
{
|
{
|
||||||
if (on) return; // Don't waste time and memory
|
if (on) return; // Don't waste time and memory
|
||||||
ba = new TBit_array(column);
|
prop = get_property(row, TRUE);
|
||||||
_disabled.add(ba, row);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TBit_array& ba = prop->_disabled;
|
||||||
if (column >= 0)
|
if (column >= 0)
|
||||||
{
|
{
|
||||||
ba->set(column, !on);
|
ba.set(column, !on);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (on)
|
if (on)
|
||||||
_disabled.destroy(row, FALSE); // Let's save some memory!
|
ba.reset();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ba->set(_columns); // Force right array size
|
ba.set(_columns); // Force right array size
|
||||||
ba->set(); // Set all bits
|
ba.set(); // Set all bits
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TSpreadsheet::set_back_and_fore_color(COLOR back, COLOR fore, int row)
|
||||||
|
{
|
||||||
|
TRow_property* prop = get_property(row, TRUE);
|
||||||
|
if (back != COLOR_INVALID)
|
||||||
|
prop->_back = back;
|
||||||
|
if (fore != COLOR_INVALID)
|
||||||
|
prop->_fore = fore;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSpreadsheet::get_back_and_fore_color(COLOR& back, COLOR& fore, int row)
|
||||||
|
{
|
||||||
|
TRow_property* prop = get_property(row, FALSE);
|
||||||
|
if (prop)
|
||||||
|
{
|
||||||
|
back = prop->_back;
|
||||||
|
fore = prop->_fore;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
back = NORMAL_BACK_COLOR;
|
||||||
|
fore = NORMAL_COLOR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// @doc INTERNAL
|
// @doc INTERNAL
|
||||||
|
|
||||||
// @mfunc Permette di abilitare/disabiltare una colonna
|
// @mfunc Permette di abilitare/disabiltare una colonna
|
||||||
@ -1568,19 +1644,21 @@ void TSpreadsheet::enable_column(
|
|||||||
if (change)
|
if (change)
|
||||||
{
|
{
|
||||||
XI_OBJ* column = find_column(col);
|
XI_OBJ* column = find_column(col);
|
||||||
|
if (column)
|
||||||
|
{
|
||||||
dword attr = xi_get_attrib(column);
|
dword attr = xi_get_attrib(column);
|
||||||
if (on) attr |= XI_ATR_ENABLED;
|
if (on) attr |= XI_ATR_ENABLED;
|
||||||
else attr &= ~XI_ATR_ENABLED;
|
else attr &= ~XI_ATR_ENABLED;
|
||||||
|
|
||||||
xi_set_attrib(column, attr); // Set new attributes
|
xi_set_attrib(column, attr); // Set new attributes
|
||||||
// update(-1); // Guy: Meno andi e rivieni
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TSpreadsheet::delete_column( const int col ) const
|
void TSpreadsheet::delete_column( const int col ) const
|
||||||
{
|
{
|
||||||
XI_OBJ* column = find_column(col);
|
XI_OBJ* column = find_column(col);
|
||||||
xi_delete( column );
|
if (column)
|
||||||
|
xi_delete(column);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1627,26 +1705,32 @@ void TSpreadsheet::swap_columns(const int fromid, const int toid) const
|
|||||||
void TSpreadsheet::swap_rows( const int fromindex, const int toindex)
|
void TSpreadsheet::swap_rows( const int fromindex, const int toindex)
|
||||||
{
|
{
|
||||||
_str.swap(fromindex, toindex);
|
_str.swap(fromindex, toindex);
|
||||||
_disabled.swap(fromindex, toindex);
|
_property.swap(fromindex, toindex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TSpreadsheet::set_column_width(const int col, const int width) const
|
void TSpreadsheet::set_column_width(const int col, const int width) const
|
||||||
{
|
{
|
||||||
XI_OBJ* column = find_column(col);
|
XI_OBJ* column = find_column(col);
|
||||||
|
if (column)
|
||||||
xi_set_column_width(column, width); // Force redraw
|
xi_set_column_width(column, width); // Force redraw
|
||||||
}
|
}
|
||||||
|
|
||||||
void TSpreadsheet::set_column_header(const int col, const TString& header) const
|
void TSpreadsheet::set_column_header(const int col, const TString& header) const
|
||||||
{
|
{
|
||||||
XI_OBJ* column = find_column(col);
|
XI_OBJ* column = find_column(col);
|
||||||
|
if (column)
|
||||||
|
{
|
||||||
xi_set_text(column, (char *)(const char *)header );
|
xi_set_text(column, (char *)(const char *)header );
|
||||||
RCT r; xi_get_rect(column, &r);
|
RCT r; xi_get_rect(column, &r);
|
||||||
xi_set_column_width(column, (r.right-r.left+1) / CHARX); // Force redraw
|
xi_set_column_width(column, (r.right-r.left+1) / CHARX); // Force redraw
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TSpreadsheet::set_column_justify(int col, bool right)
|
void TSpreadsheet::set_column_justify(int col, bool right)
|
||||||
{
|
{
|
||||||
XI_OBJ* column = find_column(col);
|
XI_OBJ* column = find_column(col);
|
||||||
|
if (column)
|
||||||
|
{
|
||||||
dword attr = xi_get_attrib(column);
|
dword attr = xi_get_attrib(column);
|
||||||
if (right)
|
if (right)
|
||||||
attr |= XI_ATR_RJUST;
|
attr |= XI_ATR_RJUST;
|
||||||
@ -1654,6 +1738,127 @@ void TSpreadsheet::set_column_justify(int col, bool right)
|
|||||||
attr &= ~XI_ATR_RJUST;
|
attr &= ~XI_ATR_RJUST;
|
||||||
xi_set_attrib(column, attr); // Set new attribute
|
xi_set_attrib(column, attr); // Set new attribute
|
||||||
update(-1);
|
update(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TSpreadsheet::TRow_property* TSpreadsheet::get_property(int row, bool create)
|
||||||
|
{
|
||||||
|
TRow_property* p = (TRow_property*)_property.objptr(row);
|
||||||
|
if (p == NULL && create)
|
||||||
|
{
|
||||||
|
p = new TRow_property;
|
||||||
|
_property.add(p, row);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Costruisce l'identificatore del paragrafo contenente la disposizione
|
||||||
|
// delle colonne del campo f
|
||||||
|
HIDDEN TFilename& field2parag(const TMask_field& f, TFilename& name)
|
||||||
|
{
|
||||||
|
const TMask& m = f.mask();
|
||||||
|
name = m.source_file();
|
||||||
|
name.ext(""); // Nome della maschera senza estensione
|
||||||
|
if (m.number() > 0) // Aggiunge l'eventuale numero di sotto-maschera
|
||||||
|
name << '(' << m.number() << ')';
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSpreadsheet::save_columns_order() const
|
||||||
|
{
|
||||||
|
if (_save_columns_order)
|
||||||
|
{
|
||||||
|
TFilename parag; field2parag(owner(), parag);
|
||||||
|
TConfig config(CONFIG_USER, parag); // Apre il file di configurazione
|
||||||
|
|
||||||
|
if (_save_columns_order == TRUE) // Se vale 3 devo solo resettare
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
XI_OBJ** column = xi_get_member_list(_obj, &num);
|
||||||
|
TToken_string order(127); // Nuovo ordine delle colonne
|
||||||
|
for (int i = 0; i < num; i++) // Scorre le colonne
|
||||||
|
{
|
||||||
|
order.add(column[i]->cid);
|
||||||
|
RCT rct; xi_get_rect(column[i], &rct);
|
||||||
|
order << ',' << rct.right - rct.left;
|
||||||
|
}
|
||||||
|
config.set("Browse", order, NULL, TRUE, owner().dlg());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
config.remove("Browse", owner().dlg());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSpreadsheet::load_columns_order()
|
||||||
|
{
|
||||||
|
TFilename parag; field2parag(owner(), parag);
|
||||||
|
TConfig config(CONFIG_USER, parag);
|
||||||
|
const int index = owner().dlg();
|
||||||
|
TToken_string order = config.get("Browse", NULL, index);
|
||||||
|
if (order.empty_items())
|
||||||
|
config.remove("Browse", index);
|
||||||
|
else
|
||||||
|
set_columns_order(&order);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSpreadsheet::set_columns_order(TToken_string* order)
|
||||||
|
{
|
||||||
|
XI_OBJ* itf = get_interface();
|
||||||
|
XI_OBJ* focus = xi_get_focus(itf);
|
||||||
|
xi_set_focus(itf);
|
||||||
|
|
||||||
|
int num_cols;
|
||||||
|
XI_OBJ** column = xi_get_member_list(_obj, &num_cols);
|
||||||
|
|
||||||
|
// Costante da sottrarre nella xi_column_set_pixel_width altrimenti la somma due volte!
|
||||||
|
const int offset = 2 * (int)xi_get_pref(XI_PREF_COLUMN_OFFSET);
|
||||||
|
const int fixed = xi_get_fixed_columns(_obj);
|
||||||
|
if (fixed > 1)
|
||||||
|
xi_set_fixed_columns(_obj, 1);
|
||||||
|
|
||||||
|
if (order == NULL)
|
||||||
|
{
|
||||||
|
for (int index = 0; index < num_cols; index++)
|
||||||
|
{
|
||||||
|
const short cid = index ? FIRST_FIELD + index - 1 : 0;
|
||||||
|
XI_OBJ* col = find_column(cid);
|
||||||
|
if (col)
|
||||||
|
{
|
||||||
|
if (index >= fixed)
|
||||||
|
xi_move_column(col, index);
|
||||||
|
|
||||||
|
RCT rct; xi_get_rect(col, &rct);
|
||||||
|
if (_default_width[index] != rct.right - rct.left)
|
||||||
|
xi_column_set_pixel_width(col, _default_width[index]-offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_save_columns_order = 0x3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TToken_string col(8, ',');
|
||||||
|
int pos = 0;
|
||||||
|
for (col = order->get(0); !col.blank(); col = order->get(), pos++)
|
||||||
|
{
|
||||||
|
const int cid = col.get_int(0);
|
||||||
|
const int width = col.get_int();
|
||||||
|
XI_OBJ* column = find_column(cid);
|
||||||
|
if (column) // Controlla che esista ancora
|
||||||
|
{
|
||||||
|
if (pos >= fixed && pos < num_cols)
|
||||||
|
xi_move_column(column, pos); // Sposta la colonna
|
||||||
|
if (width > XI_FU_MULTIPLE) // Se ha una larghezza valida
|
||||||
|
xi_column_set_pixel_width(column, width - offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_save_columns_order = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fixed > 1)
|
||||||
|
xi_set_fixed_columns(_obj, fixed);
|
||||||
|
|
||||||
|
if (focus)
|
||||||
|
xi_set_focus(focus);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Certified 99%
|
// Certified 99%
|
||||||
@ -1668,15 +1873,15 @@ void TSpreadsheet::set_column_justify(int col, bool right)
|
|||||||
// @flag FALSE| Se la cella e' abilitata
|
// @flag FALSE| Se la cella e' abilitata
|
||||||
bool TSpreadsheet::cell_disabled(int row, int column) const
|
bool TSpreadsheet::cell_disabled(int row, int column) const
|
||||||
{
|
{
|
||||||
TBit_array* ba = (TBit_array*)_disabled.objptr(row);
|
const TRow_property* prop = ((TSpreadsheet*)this)->get_property(row);
|
||||||
bool d;
|
bool d;
|
||||||
if (column < 0)
|
if (column < 0)
|
||||||
d = (ba == NULL) ? FALSE : (ba->ones() >= columns()-1);
|
d = (prop == NULL) ? FALSE : (prop->_disabled.ones() >= columns()-1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
d = _column_disabled[column]; // Controlla la colonna
|
d = _column_disabled[column]; // Controlla la colonna
|
||||||
if (d == FALSE && ba != NULL) // Se la colonna e' disabilitata e' inutile proseguire
|
if (d == FALSE && prop != NULL) // Se la colonna e' disabilitata e' inutile proseguire
|
||||||
d = (*ba)[column]; // Controlla la cella
|
d = prop->_disabled[column]; // Controlla la cella
|
||||||
}
|
}
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
@ -1828,6 +2033,8 @@ void TSheet_field::create(WINDOW parent)
|
|||||||
for (short id = FIRST_FIELD; ; id++)
|
for (short id = FIRST_FIELD; ; id++)
|
||||||
if (s.id2pos(id) < 0) break;
|
if (s.id2pos(id) < 0) break;
|
||||||
_last_column_id = id - 1;
|
_last_column_id = id - 1;
|
||||||
|
|
||||||
|
((TSpreadsheet*)_ctl)->load_columns_order();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2224,3 +2431,24 @@ void TSheet_field::row2mask(int n, TToken_string & r)
|
|||||||
val.format("Riga %d", n+1);
|
val.format("Riga %d", n+1);
|
||||||
m.set_caption(val);
|
m.set_caption(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TSheet_field::set_back_and_fore_color(COLOR back, COLOR fore, int row)
|
||||||
|
{
|
||||||
|
TSpreadsheet& s = (TSpreadsheet&)*_ctl;
|
||||||
|
s.set_back_and_fore_color(back, fore, row);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TSheet_field::reset_columns_order()
|
||||||
|
{
|
||||||
|
TSpreadsheet& s = (TSpreadsheet&)*_ctl;
|
||||||
|
s.set_columns_order(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSheet_field::save_columns_order()
|
||||||
|
{
|
||||||
|
const TSpreadsheet& s = (const TSpreadsheet&)*_ctl;
|
||||||
|
s.save_columns_order();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,8 +45,6 @@ protected:
|
|||||||
|
|
||||||
// @cmember Gestisce la chiamata all'handler del campo
|
// @cmember Gestisce la chiamata all'handler del campo
|
||||||
virtual bool on_hit();
|
virtual bool on_hit();
|
||||||
// @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo)
|
|
||||||
virtual bool on_key(KEY k);
|
|
||||||
|
|
||||||
// @cmember Legge la testata dello spreadsheet da <p scanner>
|
// @cmember Legge la testata dello spreadsheet da <p scanner>
|
||||||
virtual void parse_head(TScanner& scanner);
|
virtual void parse_head(TScanner& scanner);
|
||||||
@ -66,6 +64,9 @@ protected:
|
|||||||
|
|
||||||
// @access Public Member
|
// @access Public Member
|
||||||
public:
|
public:
|
||||||
|
// @cmember Gestisce la pressione del tasto (TRUE se la gestione ha avuto successo)
|
||||||
|
virtual bool on_key(KEY k);
|
||||||
|
|
||||||
// @cmember Ritorna una riga dello spreadsheet
|
// @cmember Ritorna una riga dello spreadsheet
|
||||||
TToken_string& row(int n);
|
TToken_string& row(int n);
|
||||||
// @cmember Ritorna un array con tutte le righe dello spreadsheet
|
// @cmember Ritorna un array con tutte le righe dello spreadsheet
|
||||||
@ -139,7 +140,12 @@ public:
|
|||||||
void set_column_header( const int col, const TString& header ) const;
|
void set_column_header( const int col, const TString& header ) const;
|
||||||
// @cmember Setta l'allineamento della colonna
|
// @cmember Setta l'allineamento della colonna
|
||||||
void set_column_justify(int col, bool right);
|
void set_column_justify(int col, bool right);
|
||||||
|
// @cmember Setta il colore dello sfondo e del testo di una o tutte le righe
|
||||||
|
void set_back_and_fore_color(COLOR back, COLOR fore, int row);
|
||||||
|
// @cmember Memorizza la disposizione delle colonne
|
||||||
|
void save_columns_order();
|
||||||
|
// @cmember Dispone le colonne come all'atto del caricamento
|
||||||
|
void reset_columns_order();
|
||||||
// @cmember Setta il member <p _append> con il valore di <p on>
|
// @cmember Setta il member <p _append> con il valore di <p on>
|
||||||
void set_append(bool on = TRUE)
|
void set_append(bool on = TRUE)
|
||||||
{ _append = on;}
|
{ _append = on;}
|
||||||
|
@ -914,13 +914,19 @@ void TPrinter::set_win_formlen(
|
|||||||
|
|
||||||
if (prwin != NULL_WIN)
|
if (prwin != NULL_WIN)
|
||||||
{
|
{
|
||||||
TString256 spc; spc.spaces(256); // Compute maximun number of chars per line
|
TString spc; // Compute maximum number of chars per line
|
||||||
|
// spc.spaces(256);
|
||||||
|
spc.fill('M', 256);
|
||||||
|
|
||||||
int w = 0;
|
int w = 0;
|
||||||
for (_formwidth = 256; _formwidth >= 80; _formwidth--)
|
for (_formwidth = spc.len(); _formwidth >= 80; _formwidth--)
|
||||||
{
|
{
|
||||||
w = xvt_dwin_get_text_width(prwin, (char*)(const char*)spc, _formwidth);
|
w = xvt_dwin_get_text_width(prwin, (char*)(const char*)spc, _formwidth);
|
||||||
if (w < pw) break;
|
if (w < pw) break;
|
||||||
}
|
}
|
||||||
|
if (isfax())
|
||||||
|
_horz_offset = 56;
|
||||||
|
else
|
||||||
_horz_offset = (_formwidth > 80) ? (int)(pw - w)/2 : 0;
|
_horz_offset = (_formwidth > 80) ? (int)(pw - w)/2 : 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1113,11 +1119,15 @@ bool TPrinter::isfax() const
|
|||||||
if (fax)
|
if (fax)
|
||||||
{
|
{
|
||||||
const char* name = (const char*)((TPrinter*)this)->get_printrcd() + 4;
|
const char* name = (const char*)((TPrinter*)this)->get_printrcd() + 4;
|
||||||
|
fax = strncmp(name, "FaxMan", 6) == 0;
|
||||||
|
if (!fax)
|
||||||
|
{
|
||||||
TToken_string p(256, ',');
|
TToken_string p(256, ',');
|
||||||
GetProfileString ("devices", name, "", (char*)(const char*)p, p.size());
|
GetProfileString ("devices", name, "", (char*)(const char*)p, p.size());
|
||||||
const char * driver = p.get(1);
|
const char * driver = p.get(1);
|
||||||
fax = driver != NULL && stricmp(driver, "EASYFAX") == 0;
|
fax = driver != NULL && stricmp(driver, "EASYFAX") == 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return fax;
|
return fax;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1802,14 +1812,13 @@ bool TPrinter::set()
|
|||||||
else
|
else
|
||||||
mask.set (MSK_TYPE, "0");
|
mask.set (MSK_TYPE, "0");
|
||||||
|
|
||||||
KEY k;
|
const int oldprn = _curprn;
|
||||||
|
|
||||||
int oldprn = _curprn;
|
|
||||||
s_printrcd * rcd = get_printrcd();
|
s_printrcd * rcd = get_printrcd();
|
||||||
TString oldrcd(_print_rcd_size);
|
|
||||||
|
|
||||||
|
TString oldrcd(_print_rcd_size);
|
||||||
memcpy((char *) (const char *) oldrcd, rcd, _print_rcd_size);
|
memcpy((char *) (const char *) oldrcd, rcd, _print_rcd_size);
|
||||||
|
|
||||||
|
KEY k;
|
||||||
while ((k = mask.run ()) != K_ESC && k != K_ENTER && k != K_INS)
|
while ((k = mask.run ()) != K_ESC && k != K_ENTER && k != K_INS)
|
||||||
{
|
{
|
||||||
if (k == DLG_SETPRINT)
|
if (k == DLG_SETPRINT)
|
||||||
@ -1822,9 +1831,14 @@ bool TPrinter::set()
|
|||||||
// determine index of currently selected printer
|
// determine index of currently selected printer
|
||||||
// ACTHUNG! Deep hacking of XVT internals! NON PORTABLE!
|
// ACTHUNG! Deep hacking of XVT internals! NON PORTABLE!
|
||||||
|
|
||||||
const char* name = (const char *)(_print_rcd + 4);
|
const char* name = (const char *)(get_printrcd() + 4);
|
||||||
_curprn = pn2.get_pos(name);
|
_curprn = pn2.get_pos(name);
|
||||||
CHECKS(_curprn >= 0, "Can't find printer ", name);
|
if (_curprn < 0)
|
||||||
|
{
|
||||||
|
NFCHECK("Can't find printer %s", name);
|
||||||
|
_curprn = oldprn;
|
||||||
|
}
|
||||||
|
|
||||||
mask.set(MSK_PRINTERS, pn1.get(_curprn));
|
mask.set(MSK_PRINTERS, pn1.get(_curprn));
|
||||||
// set_win_formlen(); // Update dimensions
|
// set_win_formlen(); // Update dimensions
|
||||||
}
|
}
|
||||||
@ -2067,7 +2081,6 @@ TFile_printer::TFile_printer (const char *ffile, const char *label, int len_rec,
|
|||||||
_nome_file_fissato = TRUE;
|
_nome_file_fissato = TRUE;
|
||||||
_formatta = FALSE;
|
_formatta = FALSE;
|
||||||
_label_fissata = TRUE;
|
_label_fissata = TRUE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TFile_printer::open()
|
void TFile_printer::open()
|
||||||
|
@ -30,6 +30,11 @@ class TSheet_control : public TControl
|
|||||||
// @cmember:(INTERNAL) Array di righe disabilitate
|
// @cmember:(INTERNAL) Array di righe disabilitate
|
||||||
TBit_array _disabled;
|
TBit_array _disabled;
|
||||||
|
|
||||||
|
// @cmember:(INTERNAL) Array delle largezze standard
|
||||||
|
int _default_width[MAX_COL];
|
||||||
|
|
||||||
|
bool _save_columns_order;
|
||||||
|
|
||||||
protected: // TControl
|
protected: // TControl
|
||||||
//@cmember Gestisce gli eventi delle celle
|
//@cmember Gestisce gli eventi delle celle
|
||||||
virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev);
|
virtual bool event_handler(XI_OBJ* itf, XI_EVENT* xiev);
|
||||||
@ -43,6 +48,7 @@ protected:
|
|||||||
|
|
||||||
void make_current(long rec);
|
void make_current(long rec);
|
||||||
XI_OBJ* find_column(int col) const;
|
XI_OBJ* find_column(int col) const;
|
||||||
|
XI_OBJ* find_column(const char* head) const;
|
||||||
|
|
||||||
public: // TControl
|
public: // TControl
|
||||||
virtual void set_rect(const RCT& r);
|
virtual void set_rect(const RCT& r);
|
||||||
@ -69,6 +75,10 @@ public:
|
|||||||
|
|
||||||
byte& column_type(int c) { CHECKD(c >= 0 && c < MAX_COL, "Bad column ", c); return _type[c]; }
|
byte& column_type(int c) { CHECKD(c >= 0 && c < MAX_COL, "Bad column ", c); return _type[c]; }
|
||||||
|
|
||||||
|
void set_columns_order(TToken_string* order);
|
||||||
|
void save_columns_order(const TMask_field& f) const;
|
||||||
|
void load_columns_order(const TMask_field& f);
|
||||||
|
|
||||||
void update(long n = -1);
|
void update(long n = -1);
|
||||||
|
|
||||||
TSheet_control(WINDOW sheet, short cid,
|
TSheet_control(WINDOW sheet, short cid,
|
||||||
@ -87,7 +97,8 @@ TSheet_control::TSheet_control(
|
|||||||
short dy, // @parm Lunghezza (in caratteri) dello spreasheet
|
short dy, // @parm Lunghezza (in caratteri) dello spreasheet
|
||||||
const char* flags, // @parm Flags di abilitazione
|
const char* flags, // @parm Flags di abilitazione
|
||||||
const char* head) // @parm Titolo delle colonne
|
const char* head) // @parm Titolo delle colonne
|
||||||
: _sheet(NULL), _cur_rec(0), _check_enabled(FALSE)
|
: _sheet(NULL), _cur_rec(0), _check_enabled(FALSE),
|
||||||
|
_save_columns_order(FALSE)
|
||||||
|
|
||||||
{
|
{
|
||||||
const int NUMBER_WIDTH = 7;
|
const int NUMBER_WIDTH = 7;
|
||||||
@ -148,7 +159,6 @@ TSheet_control::TSheet_control(
|
|||||||
|
|
||||||
new_header.add(testa);
|
new_header.add(testa);
|
||||||
}
|
}
|
||||||
const int _columns = i;
|
|
||||||
|
|
||||||
// Calcola rettangolo massimo per lo sheet
|
// Calcola rettangolo massimo per lo sheet
|
||||||
XI_RCT rct; coord2rct(parent, x, y, dx, dy, rct);
|
XI_RCT rct; coord2rct(parent, x, y, dx, dy, rct);
|
||||||
@ -182,7 +192,7 @@ TSheet_control::TSheet_control(
|
|||||||
// Definizione della prima colonna (numero di riga)
|
// Definizione della prima colonna (numero di riga)
|
||||||
const long attr = XI_ATR_VISIBLE | XI_ATR_RJUST | XI_ATR_SELECTABLE;
|
const long attr = XI_ATR_VISIBLE | XI_ATR_RJUST | XI_ATR_SELECTABLE;
|
||||||
XI_OBJ_DEF* coldef = xi_add_column_def(listdef, FIRST_FIELD+1000-1, attr, 0,
|
XI_OBJ_DEF* coldef = xi_add_column_def(listdef, FIRST_FIELD+1000-1, attr, 0,
|
||||||
/* NUMBER_WIDTH*/ 2 * XI_FU_MULTIPLE, NUMBER_WIDTH , "");
|
2 * XI_FU_MULTIPLE, NUMBER_WIDTH , "");
|
||||||
|
|
||||||
coldef->app_data = (long)this;
|
coldef->app_data = (long)this;
|
||||||
coldef->v.column->heading_platform = TRUE;
|
coldef->v.column->heading_platform = TRUE;
|
||||||
@ -238,6 +248,14 @@ TSheet_control::TSheet_control(
|
|||||||
xvt_vobj_move(parent, &cli);
|
xvt_vobj_move(parent, &cli);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int num;
|
||||||
|
XI_OBJ** column = xi_get_member_list(_obj, &num);
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
RCT rct; xi_get_rect(column[i], &rct);
|
||||||
|
_default_width[i] = rct.right - rct.left;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TSheet_control::set_rect(const RCT& r)
|
void TSheet_control::set_rect(const RCT& r)
|
||||||
@ -378,21 +396,30 @@ XI_OBJ* TSheet_control::find_column(
|
|||||||
|
|
||||||
int num;
|
int num;
|
||||||
XI_OBJ** columns = xi_get_member_list(_obj, &num);
|
XI_OBJ** columns = xi_get_member_list(_obj, &num);
|
||||||
for (int c = num-1; c > 0; c--)
|
for (int c = num-1; c >= 0; c--)
|
||||||
{
|
{
|
||||||
if (columns[c]->cid == col)
|
if (columns[c]->cid == col)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return c >= 0 ? columns[c] : NULL;
|
||||||
if (c <= 0)
|
|
||||||
{
|
|
||||||
yesnofatal_box("Can't find column with id=%d", col);
|
|
||||||
c = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return columns[c];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XI_OBJ* TSheet_control::find_column(
|
||||||
|
const char* head) const // @parm testata colonna
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
XI_OBJ** column = xi_get_member_list(_obj, &num);
|
||||||
|
for (int c = num-1; c >= 0; c--)
|
||||||
|
{
|
||||||
|
char str[80];
|
||||||
|
xi_get_text(column[c], str, sizeof(str));
|
||||||
|
if (stricmp(str, head) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return c >= 0 ? column[c] : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void TSheet_control::enable_check(bool on)
|
void TSheet_control::enable_check(bool on)
|
||||||
{
|
{
|
||||||
@ -400,6 +427,7 @@ void TSheet_control::enable_check(bool on)
|
|||||||
if (_type[0] == 'C')
|
if (_type[0] == 'C')
|
||||||
{
|
{
|
||||||
XI_OBJ* column = find_column(1101);
|
XI_OBJ* column = find_column(1101);
|
||||||
|
CHECK(column, "Can't find checkable column");
|
||||||
dword attr = xi_get_attrib(column);
|
dword attr = xi_get_attrib(column);
|
||||||
if (_check_enabled) attr |= XI_ATR_ENABLED;
|
if (_check_enabled) attr |= XI_ATR_ENABLED;
|
||||||
else attr &= ~XI_ATR_ENABLED;
|
else attr &= ~XI_ATR_ENABLED;
|
||||||
@ -502,6 +530,113 @@ void TSheet_control::enable_row(
|
|||||||
update(n);
|
update(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Costruisce l'identificatore del paragrafo contenente la disposizione
|
||||||
|
// delle colonne del campo f
|
||||||
|
HIDDEN TFilename& field2parag(const TMask_field& f, TFilename& name)
|
||||||
|
{
|
||||||
|
const TMask& m = f.mask();
|
||||||
|
name = m.source_file();
|
||||||
|
name.ext(""); // Nome della maschera senza estensione
|
||||||
|
const int index = m.number();
|
||||||
|
CHECKD(index >= 0 && index <= 8, "Bad mask index:", index);
|
||||||
|
if (index > 0) // Aggiunge l'eventuale numero di sotto-maschera
|
||||||
|
name << '(' << index << ')';
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSheet_control::save_columns_order(const TMask_field& field) const
|
||||||
|
{
|
||||||
|
if (_save_columns_order)
|
||||||
|
{
|
||||||
|
TFilename parag; field2parag(field, parag);
|
||||||
|
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
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
XI_OBJ** column = xi_get_member_list(_obj, &num);
|
||||||
|
for (int i = 0; i < num; i++) // Scorre tutte le colonne
|
||||||
|
{
|
||||||
|
char head[80];
|
||||||
|
xi_get_text(column[i], head, sizeof(head));
|
||||||
|
order.add(head);
|
||||||
|
RCT rct; xi_get_rect(column[i], &rct);
|
||||||
|
order << ',' << rct.right - rct.left;
|
||||||
|
}
|
||||||
|
config.set("Browse", order, NULL, TRUE, field.dlg());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
config.remove("Browse", field.dlg());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSheet_control::load_columns_order(const TMask_field& field)
|
||||||
|
{
|
||||||
|
TFilename parag; field2parag(field, parag);
|
||||||
|
TConfig config(CONFIG_USER, parag);
|
||||||
|
const int index = field.dlg();
|
||||||
|
TToken_string order = config.get("Browse", NULL, index);
|
||||||
|
if (order.empty_items())
|
||||||
|
config.remove("Browse", index);
|
||||||
|
else
|
||||||
|
set_columns_order(&order);
|
||||||
|
|
||||||
|
_save_columns_order = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSheet_control::set_columns_order(TToken_string* order)
|
||||||
|
{
|
||||||
|
XI_OBJ* itf = get_interface();
|
||||||
|
XI_OBJ* focus = xi_get_focus(itf);
|
||||||
|
xi_set_focus(itf);
|
||||||
|
|
||||||
|
int num_cols;
|
||||||
|
XI_OBJ** column = xi_get_member_list(_obj, &num_cols);
|
||||||
|
|
||||||
|
// Costante da sottrarre nella xi_column_set_pixel_width altrimenti la somma due volte!
|
||||||
|
const int offset = 2 * (int)xi_get_pref(XI_PREF_COLUMN_OFFSET);
|
||||||
|
|
||||||
|
if (order == NULL)
|
||||||
|
{
|
||||||
|
for (int index = 0; index < num_cols; index++)
|
||||||
|
{
|
||||||
|
const short cid = FIRST_FIELD + 1000 + index - 1;
|
||||||
|
XI_OBJ* col = find_column(cid);
|
||||||
|
if (col)
|
||||||
|
{
|
||||||
|
xi_move_column(col, index);
|
||||||
|
RCT rct; xi_get_rect(col, &rct);
|
||||||
|
if (_default_width[index] != rct.right - rct.left)
|
||||||
|
xi_column_set_pixel_width(col, _default_width[index]-offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_save_columns_order = 0x3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TString head(23);
|
||||||
|
TToken_string col(8, ',');
|
||||||
|
int pos = 0;
|
||||||
|
for (col = order->get(0); !col.blank(); col = order->get(), pos++)
|
||||||
|
{
|
||||||
|
head = col.get(0);
|
||||||
|
const int width = col.get_int();
|
||||||
|
XI_OBJ* column = find_column(head);
|
||||||
|
if (column) // Controlla che esista ancora
|
||||||
|
{
|
||||||
|
if (pos > 0 && pos < num_cols)
|
||||||
|
xi_move_column(column, pos); // Sposta la colonna se possibile
|
||||||
|
if (width > XI_FU_MULTIPLE) // Se ha una larghezza valida
|
||||||
|
xi_column_set_pixel_width(column, width - offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (focus)
|
||||||
|
xi_set_focus(focus);
|
||||||
|
}
|
||||||
|
|
||||||
HIDDEN long _rec_to_select = -1;
|
HIDDEN long _rec_to_select = -1;
|
||||||
// Certified 75%
|
// Certified 75%
|
||||||
bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
||||||
@ -663,6 +798,16 @@ bool TSheet_control::event_handler(XI_OBJ* itf, XI_EVENT *xiev)
|
|||||||
}
|
}
|
||||||
refused = TRUE;
|
refused = TRUE;
|
||||||
break;
|
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;
|
||||||
|
else
|
||||||
|
_save_columns_order = TRUE;
|
||||||
|
break;
|
||||||
|
case XIE_COL_SIZE:
|
||||||
|
_save_columns_order = TRUE;
|
||||||
|
break;
|
||||||
case XIE_BUTTON:
|
case XIE_BUTTON:
|
||||||
if (xiev->v.xi_obj->type == XIT_LIST)
|
if (xiev->v.xi_obj->type == XIT_LIST)
|
||||||
_sheet->on_key(K_CTRL+'N');
|
_sheet->on_key(K_CTRL+'N');
|
||||||
@ -1182,15 +1327,64 @@ void TBrowse_sheet::handler(
|
|||||||
{
|
{
|
||||||
if (ep->type == E_MOUSE_DOWN)
|
if (ep->type == E_MOUSE_DOWN)
|
||||||
{
|
{
|
||||||
TMask_field & f = fld(0);
|
TSheet_control& sht = sheet();
|
||||||
RCT r; f.get_rect(r);
|
switch (ep->v.mouse.button )
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
#if (XVT_PTK_VERSION_MAJOR > 4) || (XVT_PTK_VERSION_MAJOR == 4 && XVT_PTK_VERSION_MINOR >= 50)
|
||||||
|
MENU_ITEM* menu = xvt_res_get_menu(BROWSE_BAR);
|
||||||
|
if (menu)
|
||||||
|
{
|
||||||
|
const PNT& p = ep->v.mouse.where;
|
||||||
|
RCT cr; xvt_vobj_get_client_rect(win, &cr);
|
||||||
|
XVT_POPUP_ALIGNMENT pa = XVT_POPUP_CENTER;
|
||||||
|
if (p.h < cr.right / 3)
|
||||||
|
pa = XVT_POPUP_LEFT_ALIGN;
|
||||||
|
else
|
||||||
|
if (p.h > 2 * cr.right / 3)
|
||||||
|
pa = XVT_POPUP_RIGHT_ALIGN;
|
||||||
|
|
||||||
|
xvt_menu_popup(menu, win, p, pa, NULL);
|
||||||
|
xvt_res_free_menu_tree(menu);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
ASK_RESPONSE r = xvt_dm_post_ask("Annulla", "Ripristina", "Salva",
|
||||||
|
"Disposizione delle colonne:");
|
||||||
|
if (r == RESP_2)
|
||||||
|
sht.set_columns_order(NULL);
|
||||||
|
if (r == RESP_2 || r == RESP_3)
|
||||||
|
sht.save_columns_order(field());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RCT r; sht.get_rect(r);
|
||||||
if (xvt_rect_has_point(&r, ep->v.mouse.where) && _rec_to_select >= 0)
|
if (xvt_rect_has_point(&r, ep->v.mouse.where) && _rec_to_select >= 0)
|
||||||
{
|
{
|
||||||
post_select(_rec_to_select);
|
post_select(_rec_to_select);
|
||||||
_rec_to_select = -1;
|
_rec_to_select = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (ep->type == E_COMMAND)
|
||||||
|
{
|
||||||
|
switch (ep->v.cmd.tag)
|
||||||
|
{
|
||||||
|
case M_EDIT_UNDO:
|
||||||
|
sheet().set_columns_order(NULL);
|
||||||
|
case M_EDIT_COPY:
|
||||||
|
sheet().save_columns_order(field());
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TCursor_sheet::handler(win, ep);
|
TCursor_sheet::handler(win, ep);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1291,6 +1485,8 @@ TBrowse_sheet::TBrowse_sheet(TCursor* cursor, const char* fields,
|
|||||||
|
|
||||||
if (e != NULL)
|
if (e != NULL)
|
||||||
e->set_handler(last_browse_field_handler);
|
e->set_handler(last_browse_field_handler);
|
||||||
|
|
||||||
|
sheet().load_columns_order(field());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TBrowse_sheet::on_key(KEY k)
|
bool TBrowse_sheet::on_key(KEY k)
|
||||||
@ -1313,3 +1509,4 @@ KEY TBrowse_sheet::run()
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,16 +1,41 @@
|
|||||||
#include <stdtypes.h>
|
|
||||||
#include <tabutil.h>
|
|
||||||
#include <execp.h>
|
#include <execp.h>
|
||||||
#include <utility.h>
|
|
||||||
#include <tabapp.h>
|
#include <tabapp.h>
|
||||||
|
#include <tabutil.h>
|
||||||
|
#include <utility.h>
|
||||||
|
|
||||||
|
// @cmember Costruttore
|
||||||
|
Tab_application::Tab_application()
|
||||||
|
: _msk(NULL), _rel(NULL)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
// @cmember Distruttore
|
||||||
|
Tab_application::~Tab_application()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
// @cmember Indica se la futura <mf Tab_application::get_mask> ritornera' una maschera diversa
|
||||||
|
// dalla corrente.
|
||||||
|
bool Tab_application::changing_mask(int mode)
|
||||||
|
{ return FALSE; }
|
||||||
|
|
||||||
|
// @cmember Richiede la maschera da usare
|
||||||
|
TMask* Tab_application::get_mask(int mode)
|
||||||
|
{
|
||||||
|
CHECK(_msk, "Null mask");
|
||||||
|
return _msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @cmember Ritorna la relazione da modificare
|
||||||
|
TRelation* Tab_application::get_relation() const
|
||||||
|
{
|
||||||
|
CHECK(_rel, "Null relation");
|
||||||
|
return _rel;
|
||||||
|
}
|
||||||
|
|
||||||
void Tab_application::print()
|
void Tab_application::print()
|
||||||
{
|
{
|
||||||
#if XVT_OS == XVT_OS_WIN
|
TString16 cmd;
|
||||||
TExternal_app stampa(format("ba3a -1 %s", (const char *) _tabname));
|
cmd << "ba3 -1 " << get_tabname();
|
||||||
#else
|
TExternal_app stampa(cmd);
|
||||||
TExternal_app stampa(format("ba3 -1 %s", (const char *) _tabname));
|
|
||||||
#endif
|
|
||||||
stampa.run();
|
stampa.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24,7 +49,6 @@ void Tab_application::init_modify_mode(TMask& m)
|
|||||||
{
|
{
|
||||||
m.disable(-GR_MODIFY_PROTECTED);
|
m.disable(-GR_MODIFY_PROTECTED);
|
||||||
const bool enable = !(_rel->curr().get_bool(FPC));
|
const bool enable = !(_rel->curr().get_bool(FPC));
|
||||||
|
|
||||||
m.enable(-GR_RECORD_PROTECTED,enable);
|
m.enable(-GR_RECORD_PROTECTED,enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,30 +63,31 @@ bool Tab_application::user_create()
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
_tabname = argv(2);
|
_tabname = argv(2);
|
||||||
|
|
||||||
if (_tabname.empty())
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
_tabname.upper();
|
_tabname.upper();
|
||||||
TString16 m, t(_tabname);
|
_rel = new TRelation(_tabname);
|
||||||
|
|
||||||
|
TString16 t(_tabname);
|
||||||
if (t[0] == '%') t.ltrim(1);
|
if (t[0] == '%') t.ltrim(1);
|
||||||
|
TString16 m; m << "BATB" << t;
|
||||||
m << "BATB" << t;
|
|
||||||
_msk = new TMask(m) ;
|
_msk = new TMask(m) ;
|
||||||
|
|
||||||
for (int i = 0; i < _msk->fields(); i++)
|
const int campi = _msk->fields();
|
||||||
if (_msk->fld(i).in_group(GR_SEARCH))
|
for (int i = 0; i < campi; i++)
|
||||||
{
|
{
|
||||||
set_search_field(_msk->fld(i).dlg());
|
const TMask_field& f = _msk->fld(i);
|
||||||
|
if (f.in_group(GR_SEARCH))
|
||||||
|
{
|
||||||
|
set_search_field(f.dlg());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
_rel = new TRelation(_tabname);
|
|
||||||
set_title(_msk->get_caption());
|
|
||||||
|
|
||||||
TFilename rpt("batb"); rpt << t << ".rpt";
|
TFilename rpt("batb"); rpt << t << ".rpt";
|
||||||
if (fexist(rpt)) enable_menu_item(M_FILE_PRINT);
|
if (fexist(rpt))
|
||||||
|
enable_menu_item(M_FILE_PRINT);
|
||||||
|
|
||||||
|
const char* title = _msk->get_caption();
|
||||||
|
set_title(title);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -71,6 +96,7 @@ bool Tab_application::user_destroy()
|
|||||||
{
|
{
|
||||||
if (_msk) delete _msk;
|
if (_msk) delete _msk;
|
||||||
if (_rel) delete _rel;
|
if (_rel) delete _rel;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,15 +34,12 @@ protected:
|
|||||||
// @cmember Richiede se il record corrente e' protetto (non cancellabile)
|
// @cmember Richiede se il record corrente e' protetto (non cancellabile)
|
||||||
virtual bool protected_record(TRectype& rec);
|
virtual bool protected_record(TRectype& rec);
|
||||||
// @cmember Richiede la maschera da usare
|
// @cmember Richiede la maschera da usare
|
||||||
virtual TMask* get_mask(int mode = NO_MODE)
|
virtual TMask* get_mask(int mode = MODE_QUERY);
|
||||||
{ return _msk;}
|
|
||||||
// @cmember Indica se la futura <mf Tab_application::get_mask> ritornera' una maschera diversa
|
// @cmember Indica se la futura <mf Tab_application::get_mask> ritornera' una maschera diversa
|
||||||
// dalla corrente.
|
// dalla corrente.
|
||||||
virtual bool changing_mask(int mode)
|
virtual bool changing_mask(int mode);
|
||||||
{ return FALSE;}
|
|
||||||
// @cmember Ritorna la relazione da modificare
|
// @cmember Ritorna la relazione da modificare
|
||||||
virtual TRelation* get_relation() const
|
virtual TRelation* get_relation() const;
|
||||||
{ return _rel;}
|
|
||||||
// @cmember Inizializza la maschera per il modo ricerca
|
// @cmember Inizializza la maschera per il modo ricerca
|
||||||
virtual void init_query_mode(TMask& m);
|
virtual void init_query_mode(TMask& m);
|
||||||
// @cmember Inizializza la maschera per il modo modifica
|
// @cmember Inizializza la maschera per il modo modifica
|
||||||
@ -57,11 +54,9 @@ protected:
|
|||||||
// @access Public Member
|
// @access Public Member
|
||||||
public:
|
public:
|
||||||
// @cmember Costruttore
|
// @cmember Costruttore
|
||||||
Tab_application() : _msk(NULL), _rel(NULL)
|
Tab_application();
|
||||||
{}
|
|
||||||
// @cmember Distruttore
|
// @cmember Distruttore
|
||||||
virtual ~Tab_application()
|
virtual ~Tab_application();
|
||||||
{}
|
|
||||||
// @cmember Ritorna il nome della tabella
|
// @cmember Ritorna il nome della tabella
|
||||||
const TString& get_tabname() const
|
const TString& get_tabname() const
|
||||||
{ return _tabname; }
|
{ return _tabname; }
|
||||||
|
@ -42,8 +42,6 @@ class TVariable_mask : public TMask
|
|||||||
virtual TMask_field* parse_field(TScanner& scanner);
|
virtual TMask_field* parse_field(TScanner& scanner);
|
||||||
// @cmember Distruttore
|
// @cmember Distruttore
|
||||||
virtual ~TVariable_mask() {}
|
virtual ~TVariable_mask() {}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// @doc EXTERNAL
|
// @doc EXTERNAL
|
||||||
|
@ -1,21 +1,12 @@
|
|||||||
#include <applicat.h>
|
#include <applicat.h>
|
||||||
#include <colors.h>
|
#include <colors.h>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <date.h>
|
#include <controls.h>
|
||||||
|
#include <mask.h>
|
||||||
#include <urldefid.h>
|
#include <urldefid.h>
|
||||||
#include <utility.h>
|
#include <utility.h>
|
||||||
#include <mask.h>
|
|
||||||
|
|
||||||
#if XVT_OS == XVT_OS_WIN
|
#include <statbar.h>
|
||||||
#include <windows.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#pragma hdrstop
|
|
||||||
#include "prochook.h"
|
|
||||||
#define MAX_PATH 260 // This really should be in WINDOWS.H, but is
|
|
||||||
// inexplicably hard-coded into the data structures
|
|
||||||
int MungeModuleHeader( HINSTANCE hInstance, BOOL fMunge );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if XVT_OS == XVT_OS_SCOUNIX
|
#if XVT_OS == XVT_OS_SCOUNIX
|
||||||
extern "C" { long nap(long period); }
|
extern "C" { long nap(long period); }
|
||||||
@ -36,15 +27,20 @@ BOOLEAN error_hook(XVT_ERRMSG err, DATA_PTR)
|
|||||||
|
|
||||||
#if XVT_OS == XVT_OS_WIN
|
#if XVT_OS == XVT_OS_WIN
|
||||||
|
|
||||||
#define STRICT
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ctl3d.h>
|
|
||||||
|
|
||||||
extern "C" {
|
#ifndef ATTR_WIN_USE_CTL3D
|
||||||
WINDOW xvtwi_hwnd_to_window(HWND);
|
#include <ctl3d.h>
|
||||||
#include <statbar.h>
|
#endif
|
||||||
}
|
|
||||||
#include <controls.h>
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#pragma hdrstop
|
||||||
|
#include "prochook.h"
|
||||||
|
#define MAX_PATH 260 // This really should be in WINDOWS.H, but is
|
||||||
|
// inexplicably hard-coded into the data structures
|
||||||
|
|
||||||
|
extern "C" { WINDOW xvtwi_hwnd_to_window(HWND); }
|
||||||
|
|
||||||
short CHARX = 8;
|
short CHARX = 8;
|
||||||
short ROWY = GetSystemMetrics(SM_CYSCREEN) / 25;
|
short ROWY = GetSystemMetrics(SM_CYSCREEN) / 25;
|
||||||
@ -215,9 +211,11 @@ static BOOLEAN event_hook(HWND hwnd,
|
|||||||
{
|
{
|
||||||
switch(msg)
|
switch(msg)
|
||||||
{
|
{
|
||||||
|
#ifndef ATTR_WIN_USE_CTL3D
|
||||||
case WM_SYSCOLORCHANGE:
|
case WM_SYSCOLORCHANGE:
|
||||||
Ctl3dColorChange();
|
Ctl3dColorChange();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case WM_MENUCHAR:
|
case WM_MENUCHAR:
|
||||||
if (wparam > ' ' && wparam <= 'z')
|
if (wparam > ' ' && wparam <= 'z')
|
||||||
{
|
{
|
||||||
@ -601,10 +599,13 @@ void customize_controls(
|
|||||||
xvt_vobj_set_attr(NULL_WIN,ATTR_EVENT_HOOK, (long)event_hook);
|
xvt_vobj_set_attr(NULL_WIN,ATTR_EVENT_HOOK, (long)event_hook);
|
||||||
|
|
||||||
xvt_vobj_set_attr(NULL_WIN,ATTR_ERRMSG_HANDLER, (long)error_hook);
|
xvt_vobj_set_attr(NULL_WIN,ATTR_ERRMSG_HANDLER, (long)error_hook);
|
||||||
HInstance = (HINSTANCE)xvt_vobj_get_attr(NULL_WIN, ATTR_WIN_INSTANCE);
|
|
||||||
|
|
||||||
|
#ifndef ATTR_WIN_USE_CTL3D
|
||||||
|
HInstance = (HINSTANCE)xvt_vobj_get_attr(NULL_WIN, ATTR_WIN_INSTANCE);
|
||||||
Ctl3dRegister(HInstance);
|
Ctl3dRegister(HInstance);
|
||||||
Ctl3dAutoSubclass(HInstance);
|
Ctl3dAutoSubclass(HInstance);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
customize_colors();
|
customize_colors();
|
||||||
init_controls();
|
init_controls();
|
||||||
@ -612,8 +613,9 @@ void customize_controls(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if XVT_OS == XVT_OS_WIN
|
#if XVT_OS == XVT_OS_WIN
|
||||||
// HINSTANCE _hInstance = (HINSTANCE)xvt_vobj_get_attr(NULL_WIN, ATTR_WIN_INSTANCE);
|
#ifndef ATTR_WIN_USE_CTL3D
|
||||||
Ctl3dUnregister(HInstance);
|
Ctl3dUnregister(HInstance);
|
||||||
|
#endif
|
||||||
deny_another_instance();
|
deny_another_instance();
|
||||||
#endif
|
#endif
|
||||||
free_controls();
|
free_controls();
|
||||||
@ -910,7 +912,7 @@ WINDOW xvt_create_statbar()
|
|||||||
|
|
||||||
// @xref <f xvt_statbar_set> <f xvt_statbar_refresh>
|
// @xref <f xvt_statbar_set> <f xvt_statbar_refresh>
|
||||||
{
|
{
|
||||||
CHECK(_statbar == NULL_WIN, "Onli uan stabar, plis");
|
CHECK(_statbar == NULL_WIN, "Onli uan statbar, plis");
|
||||||
|
|
||||||
#if XVT_OS == XVT_OS_WIN
|
#if XVT_OS == XVT_OS_WIN
|
||||||
const int prop_count = 4;
|
const int prop_count = 4;
|
||||||
@ -945,14 +947,14 @@ void xvt_statbar_set(
|
|||||||
//
|
//
|
||||||
// @xref <f xvt_create_statbar> <f xvt_statbar_refresh>
|
// @xref <f xvt_create_statbar> <f xvt_statbar_refresh>
|
||||||
{
|
{
|
||||||
#if XVT_OS == XVT_OS_WIN
|
CHECK(_statbar, "NULL statbar");
|
||||||
|
|
||||||
const TDate oggi(TODAY);
|
const TDate oggi(TODAY);
|
||||||
TString256 t(text);
|
TString t(31);
|
||||||
t << '\t' << oggi.string() << " - " << main_app().title();
|
t << text << '\t' << oggi.string() << " - " << main_app().title();
|
||||||
if (def)
|
if (def)
|
||||||
statbar_set_default_title(_statbar, (char*)(const char*)t);
|
statbar_set_default_title(_statbar, (char*)(const char*)t);
|
||||||
statbar_set_title(_statbar, (char*)(const char*)t);
|
statbar_set_title(_statbar, (char*)(const char*)t);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// @doc INTERNAL
|
// @doc INTERNAL
|
||||||
@ -962,9 +964,8 @@ void xvt_statbar_refresh()
|
|||||||
|
|
||||||
// @xref <f xvt_create_statbar> <f xvt_statbar_set>
|
// @xref <f xvt_create_statbar> <f xvt_statbar_set>
|
||||||
{
|
{
|
||||||
#if XVT_OS == XVT_OS_WIN
|
CHECK(_statbar, "NULL statbar");
|
||||||
statbar_set_title(_statbar, NULL);
|
statbar_set_title(_statbar, NULL);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
Loading…
x
Reference in New Issue
Block a user