Patch level : 10.0
Files correlati : ba8300a.msk ba8300b.msk ba8300c.msk ba8.exe Ricompilazione Demo : [ ] Commento : Riassunto 0001600: Dopo la stampa di un report in orizz ritorna in visual con il foglio in vert. Faccio l'anteprima di un report creato con orientamento foglio orrizzontale fisso, dopo aver stampato ritorna in visualizzazione con l'orientamento del foglio impostato sulla stampante (normalmente in verticale) git-svn-id: svn://10.65.10.50/trunk@20332 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
3e25e35ae6
commit
309d8b23fd
@ -327,7 +327,7 @@ protected:
|
||||
|
||||
public:
|
||||
void edit_query();
|
||||
void save_as(TRecordsetExportFormat fmt);
|
||||
void save_as(TRecordsetExportFormat fmt, const char* ext = NULL);
|
||||
|
||||
bool load_query();
|
||||
bool save_query();
|
||||
@ -893,7 +893,7 @@ void TQuery_mask::edit_query()
|
||||
}
|
||||
}
|
||||
|
||||
void TQuery_mask::save_as(TRecordsetExportFormat fmt)
|
||||
void TQuery_mask::save_as(TRecordsetExportFormat fmt, const char* ext)
|
||||
{
|
||||
TRecordset* rex = new_recordset();
|
||||
if (rex == NULL)
|
||||
@ -918,23 +918,22 @@ void TQuery_mask::save_as(TRecordsetExportFormat fmt)
|
||||
xvt_fsys_save_dir();
|
||||
TFilename path; path.tempdir();
|
||||
|
||||
const char* ext = "txt";
|
||||
switch (fmt)
|
||||
if (ext == NULL || *ext == '\0')
|
||||
{
|
||||
case fmt_html: ext = "html"; break;
|
||||
default: break;
|
||||
switch (fmt)
|
||||
{
|
||||
case fmt_html: ext = "html"; break;
|
||||
default : ext = "txt"; break;
|
||||
}
|
||||
}
|
||||
|
||||
FILE_SPEC fs;
|
||||
/* xvt_fsys_convert_str_to_dir(path, &fs.dir);
|
||||
strcpy(fs.name, get(F_CODICE));
|
||||
strcpy(fs.type, ext);
|
||||
strcpy(fs.creator, "AGA"); */
|
||||
if (field(F_CODICE).empty())
|
||||
path.add("query");
|
||||
else
|
||||
path.add(get(F_CODICE));
|
||||
path.ext(ext);
|
||||
|
||||
FILE_SPEC fs;
|
||||
xvt_fsys_convert_str_to_fspec(path, &fs);
|
||||
|
||||
xvt_fsys_save_dir();
|
||||
@ -1314,7 +1313,7 @@ bool TQuery_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
break;
|
||||
case F_EXPORT_EXCEL:
|
||||
if (e == fe_button)
|
||||
save_as(fmt_html);
|
||||
save_as(fmt_html, "xls");
|
||||
break;
|
||||
case F_EXPORT_TXT:
|
||||
if (e == fe_button)
|
||||
@ -1477,7 +1476,7 @@ bool TSQL_recordset_app::create()
|
||||
_msk->save_as(fmt_text);
|
||||
break;
|
||||
case 'X':
|
||||
_msk->save_as(fmt_html);
|
||||
_msk->save_as(fmt_html, "xls");
|
||||
break;
|
||||
case 'C':
|
||||
_msk->save_as(fmt_campo);
|
||||
|
135
ba/ba8300.cpp
135
ba/ba8300.cpp
@ -17,116 +17,6 @@
|
||||
#include "ba8301.h"
|
||||
#include <bagn003.h>
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TPrinter_font_mask
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TPrinter_font_mask : public TAutomask
|
||||
{
|
||||
XVT_FNTID _font;
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
|
||||
public:
|
||||
TPrinter_font_mask(XVT_FNTID font);
|
||||
};
|
||||
|
||||
bool TReport_base_mask::choose_printer_font(XVT_FNTID font)
|
||||
{
|
||||
TPrinter_font_mask m(font);
|
||||
const bool ok = m.run() == K_ENTER;
|
||||
if (ok)
|
||||
{
|
||||
xvt_font_set_family(font, m.get(102));
|
||||
xvt_font_set_size(font, m.get_int(103));
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TPrinter_font_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
PRINT_RCD* rcd = printer().get_printrcd();
|
||||
if (rcd == NULL)
|
||||
return false;
|
||||
|
||||
switch (o.dlg())
|
||||
{
|
||||
case 101:
|
||||
if (e == fe_init)
|
||||
{
|
||||
o.set(printer().printername());
|
||||
}
|
||||
break;
|
||||
case 102:
|
||||
if (e == fe_init)
|
||||
{
|
||||
const int MAX_FAMILIES = 256;
|
||||
char* family[MAX_FAMILIES];
|
||||
const int num_families = (int)xvt_fmap_get_families(rcd, family, MAX_FAMILIES);
|
||||
|
||||
TToken_string fn(num_families * 16);
|
||||
for (int i = 0; i < num_families; i++)
|
||||
{
|
||||
fn.add(family[i]);
|
||||
xvt_mem_free(family[i]);
|
||||
}
|
||||
|
||||
TList_field& fonts = (TList_field&)o;
|
||||
fonts.replace_items(fn, fn);
|
||||
|
||||
TString80 buf;
|
||||
xvt_font_get_family(_font, buf.get_buffer(), buf.size());
|
||||
fonts.set(buf);
|
||||
}
|
||||
if (e == fe_init || e == fe_modify)
|
||||
{
|
||||
TList_field& lst = (TList_field&)field(103);
|
||||
TString4 old_size = lst.get();
|
||||
if (old_size.empty())
|
||||
old_size << xvt_font_get_size(_font);
|
||||
|
||||
const int MAXSIZES = 8;
|
||||
long sizes[MAXSIZES];
|
||||
BOOLEAN scalable = FALSE;
|
||||
TString80 str = o.get();
|
||||
const int num_sizes = (int)xvt_fmap_get_family_sizes(rcd, str.get_buffer(), sizes, &scalable, MAXSIZES);
|
||||
TToken_string pn1;
|
||||
if (scalable)
|
||||
{
|
||||
for (int i = 4; i < 96; i++)
|
||||
pn1.add(i);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (num_sizes > 0)
|
||||
{
|
||||
for (int i = 0; i < num_sizes; i++)
|
||||
pn1.add(sizes[i]);
|
||||
}
|
||||
else
|
||||
pn1.add(printer().get_char_size()); // semper better than nothing
|
||||
}
|
||||
lst.replace_items(pn1, pn1);
|
||||
lst.set(old_size);
|
||||
lst.enable(pn1.items() > 1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
TPrinter_font_mask::TPrinter_font_mask(XVT_FNTID font)
|
||||
: TAutomask(TR("Selezione Font nativo"), 1, 68, 5), _font(font)
|
||||
{
|
||||
add_string(101, 0, PR("Stampante "), 1, 1, 256, "LG", 50);
|
||||
add_list(102, 0, PR("Nome "), 1, 2, 50, "", "", "");
|
||||
add_list(103, 0, PR("Dimensioni "), 1, 3, 2, "", "", "");
|
||||
add_button(DLG_OK, 0, "", -12, -1, 10, 2);
|
||||
add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
|
||||
set_handlers();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport_sheet
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -221,7 +111,6 @@ TReport_sheet::TReport_sheet(TReport_section& sec)
|
||||
class TSection_properties_mask : public TReport_base_mask
|
||||
{
|
||||
protected:
|
||||
virtual void update();
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
void set_num(short id, long num);
|
||||
short get_num(short id) const;
|
||||
@ -234,25 +123,6 @@ public:
|
||||
TSection_properties_mask(TReport_section& rs);
|
||||
};
|
||||
|
||||
void TSection_properties_mask::update()
|
||||
{
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
TMask_field& fld = field(i == 0 ? F_FGCOLOR : F_BGCOLOR);
|
||||
if (fld.active() && fld.parent() == curr_win())
|
||||
{
|
||||
RCT rctfld; fld.get_rect(rctfld);
|
||||
const int x = rctfld.right / CHARX + 1;
|
||||
const int y = rctfld.top / ROWY + 1;
|
||||
RCT& rct = resize_rect(x, y, -3, 1, W_PLAIN, fld.parent());
|
||||
rct.top = rctfld.top; rct.bottom = rctfld.bottom;
|
||||
xi_draw_3d_rect((XinWindow)fld.parent(), (XinRect*)&rct, TRUE, 2, MASK_LIGHT_COLOR,
|
||||
i == 0 ? _fgcolor : _bgcolor, MASK_DARK_COLOR);
|
||||
}
|
||||
}
|
||||
TReport_base_mask::update();
|
||||
}
|
||||
|
||||
void TSection_properties_mask::set_num(short id, long num)
|
||||
{
|
||||
set(id, num2str(num));
|
||||
@ -351,6 +221,8 @@ void TSection_properties_mask::set_section(const TReport_section& rs)
|
||||
set_num(F_RADIUS, rs.radius());
|
||||
_fgcolor = rs.fore_color();
|
||||
_bgcolor = rs.back_color();
|
||||
_shcolor = rs.shade_color();
|
||||
set(F_SHADE_ANGLE, rs.shade_angle());
|
||||
set_font_info(rs.font());
|
||||
|
||||
set(F_PRESCRIPT, rs.prescript());
|
||||
@ -385,6 +257,8 @@ void TSection_properties_mask::get_section(TReport_section& rs) const
|
||||
rs.set_radius(get_num(F_RADIUS));
|
||||
rs.set_fore_color(_fgcolor);
|
||||
rs.set_back_color(_bgcolor);
|
||||
rs.set_shade_color(_shcolor);
|
||||
rs.set_shade_angle(get_int(F_SHADE_ANGLE));
|
||||
|
||||
TReport_font f;
|
||||
if (get_font_info(f))
|
||||
@ -457,7 +331,6 @@ void TReport_properties_mask::get_report(TReport& r) const
|
||||
r.set_save_last_printer(get_bool(F_SAVE_PRINTER));
|
||||
r.set_class(get(F_CLASS));
|
||||
r.set_command_line(get(F_COMMAND));
|
||||
|
||||
|
||||
const TString& oldlib = r.get_libraries();
|
||||
if (oldlib != get(F_INCLUDE))
|
||||
|
@ -42,6 +42,9 @@
|
||||
#define F_RADIUS 148
|
||||
#define F_PATTERN 149
|
||||
#define F_SHADE_OFFSET 150
|
||||
#define F_SHADE_ANGLE 151
|
||||
#define F_SHCOLOR 152
|
||||
#define F_TXCOLOR 153
|
||||
#define F_PRFONT_SELECT 159
|
||||
|
||||
#define F_LEVEL 160
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "ba8300.h"
|
||||
|
||||
TOOLBAR "" 0 -1 0 1
|
||||
TOOLBAR "bottombar" 0 -1 0 1
|
||||
|
||||
STRING F_CODICE 256 24
|
||||
BEGIN
|
||||
@ -17,7 +17,7 @@ END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
TOOLBAR "" 0 0 0 2
|
||||
TOOLBAR "topbar" 0 0 0 2
|
||||
|
||||
BUTTON DLG_NEWREC 10 2
|
||||
BEGIN
|
||||
|
@ -126,14 +126,24 @@ BEGIN
|
||||
ITEM "B|Basso"
|
||||
END
|
||||
|
||||
BUTTON F_FGCOLOR 14 1
|
||||
BUTTON F_TXCOLOR 14 1
|
||||
BEGIN
|
||||
PROMPT 2 4 "Colore ~Testo"
|
||||
PROMPT 2 3 "Colore ~Testo"
|
||||
END
|
||||
|
||||
BUTTON F_BGCOLOR 14 1
|
||||
BEGIN
|
||||
PROMPT 2 5 "Colore ~Sfondo"
|
||||
PROMPT 2 4 "Colore ~Sfondo"
|
||||
END
|
||||
|
||||
BUTTON F_FGCOLOR 14 1
|
||||
BEGIN
|
||||
PROMPT 2 5 "Colore ~Bordo"
|
||||
END
|
||||
|
||||
BUTTON F_SHCOLOR 14 1
|
||||
BEGIN
|
||||
PROMPT 2 6 "Colore ~Sfumato"
|
||||
END
|
||||
|
||||
LIST F_BORDER 2 15
|
||||
@ -156,33 +166,44 @@ BEGIN
|
||||
WARNING "Il raggio deve essere positivo"
|
||||
END
|
||||
|
||||
LIST F_PATTERN 1 18
|
||||
LIST F_PATTERN 2 18
|
||||
BEGIN
|
||||
PROMPT 2 8 "Stile "
|
||||
ITEM "2|Pieno"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE|SHOW,F_SHADE_OFFSET
|
||||
ITEM "1|Trasparente"
|
||||
MESSAGE HIDE,F_BGCOLOR
|
||||
MESSAGE HIDE,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE|HIDE,F_SHADE_OFFSET
|
||||
ITEM "3|Linee orizzontali"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE|HIDE,F_SHADE_OFFSET
|
||||
ITEM "4|Linee verticali"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE|HIDE,F_SHADE_OFFSET
|
||||
ITEM "5|Diagonali \"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE|HIDE,F_SHADE_OFFSET
|
||||
ITEM "6|Diagonali /"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE|HIDE,F_SHADE_OFFSET
|
||||
ITEM "7|Griglia"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE|HIDE,F_SHADE_OFFSET
|
||||
ITEM "8|Griglia diagonale"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE|HIDE,F_SHADE_OFFSET
|
||||
ITEM "10|Sfumato"
|
||||
MESSAGE SHOW,F_BGCOLOR|SHOW,F_SHCOLOR|SHOW,F_SHADE_ANGLE|SHOW,F_SHADE_OFFSET
|
||||
END
|
||||
|
||||
STRING F_SHADE_OFFSET 4
|
||||
BEGIN
|
||||
PROMPT 32 8 "Ombreggiatura "
|
||||
PROMPT 32 8 "Ombreggiatura "
|
||||
FLAGS "UR"
|
||||
END
|
||||
|
||||
LIST F_SHADE_ANGLE 3 20
|
||||
BEGIN
|
||||
PROMPT 2 9 "Sfumatura "
|
||||
ITEM "0|Lineare a destra"
|
||||
ITEM "90|Lineare in alto"
|
||||
ITEM "180|Lineare a sinistra"
|
||||
ITEM "270|Lineare in basso"
|
||||
END
|
||||
|
||||
BUTTON F_FONT_SELECT 14 2
|
||||
BEGIN
|
||||
PROMPT 2 10 "~Font"
|
||||
|
@ -141,25 +141,27 @@ BEGIN
|
||||
PROMPT 2 2 "Colore ~Bordo"
|
||||
END
|
||||
|
||||
LIST F_PATTERN 1 18
|
||||
LIST F_PATTERN 2 18
|
||||
BEGIN
|
||||
PROMPT 2 4 "Sfondo "
|
||||
ITEM "1|Trasparente"
|
||||
MESSAGE HIDE,F_BGCOLOR
|
||||
MESSAGE HIDE,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE
|
||||
ITEM "2|Pieno"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE
|
||||
ITEM "3|Linee orizzontali"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE
|
||||
ITEM "4|Linee verticali"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE
|
||||
ITEM "5|Diagonali \"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE
|
||||
ITEM "6|Diagonali /"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE
|
||||
ITEM "7|Griglia"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE
|
||||
ITEM "8|Griglia diagonale"
|
||||
MESSAGE SHOW,F_BGCOLOR
|
||||
MESSAGE SHOW,F_BGCOLOR|HIDE,F_SHCOLOR|HIDE,F_SHADE_ANGLE
|
||||
ITEM "10|Sfumato"
|
||||
MESSAGE SHOW,F_BGCOLOR|SHOW,F_SHCOLOR|SHOW,F_SHADE_ANGLE
|
||||
END
|
||||
|
||||
BUTTON F_BGCOLOR 14 1
|
||||
@ -167,6 +169,20 @@ BEGIN
|
||||
PROMPT 2 5 "Colore ~Sfondo"
|
||||
END
|
||||
|
||||
LIST F_SHADE_ANGLE 3 20
|
||||
BEGIN
|
||||
PROMPT 2 7 "Sfumatura "
|
||||
ITEM "0|Lineare a destra"
|
||||
ITEM "90|Lineare in alto"
|
||||
ITEM "180|Lineare a sinistra"
|
||||
ITEM "270|Lineare in basso"
|
||||
END
|
||||
|
||||
BUTTON F_SHCOLOR 14 1
|
||||
BEGIN
|
||||
PROMPT 2 8 "~Riempimento"
|
||||
END
|
||||
|
||||
BUTTON F_FONT_SELECT 14 2
|
||||
BEGIN
|
||||
PROMPT 2 10 "~Font"
|
||||
|
316
ba/ba8301.cpp
316
ba/ba8301.cpp
@ -2,9 +2,11 @@
|
||||
#include "ba8301.h"
|
||||
|
||||
#include <colors.h>
|
||||
#include <diction.h>
|
||||
#include <reprint.h>
|
||||
#include <defmask.h>
|
||||
#include <diction.h>
|
||||
#include <printer.h>
|
||||
#include <reprint.h>
|
||||
#include <utility.h>
|
||||
|
||||
#include <xinclude.h>
|
||||
#include <statbar.h>
|
||||
@ -390,10 +392,141 @@ int TReport_tree::image_height() const
|
||||
return img != NULL ? img->height() : 0;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TPrinter_font_mask
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TPrinter_font_mask : public TAutomask
|
||||
{
|
||||
XVT_FNTID _font;
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
|
||||
public:
|
||||
TPrinter_font_mask(XVT_FNTID font);
|
||||
};
|
||||
|
||||
bool TPrinter_font_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
PRINT_RCD* rcd = printer().get_printrcd();
|
||||
if (rcd == NULL)
|
||||
return false;
|
||||
|
||||
switch (o.dlg())
|
||||
{
|
||||
case 101:
|
||||
if (e == fe_init)
|
||||
{
|
||||
o.set(printer().printername());
|
||||
}
|
||||
break;
|
||||
case 102:
|
||||
if (e == fe_init)
|
||||
{
|
||||
const int MAX_FAMILIES = 256;
|
||||
char* family[MAX_FAMILIES];
|
||||
const int num_families = (int)xvt_fmap_get_families(rcd, family, MAX_FAMILIES);
|
||||
|
||||
TToken_string fn(num_families * 16);
|
||||
for (int i = 0; i < num_families; i++)
|
||||
{
|
||||
fn.add(family[i]);
|
||||
xvt_mem_free(family[i]);
|
||||
}
|
||||
|
||||
TList_field& fonts = (TList_field&)o;
|
||||
fonts.replace_items(fn, fn);
|
||||
|
||||
TString80 buf;
|
||||
xvt_font_get_family(_font, buf.get_buffer(), buf.size());
|
||||
fonts.set(buf);
|
||||
}
|
||||
if (e == fe_init || e == fe_modify)
|
||||
{
|
||||
TList_field& lst = (TList_field&)field(103);
|
||||
TString4 old_size = lst.get();
|
||||
if (old_size.empty())
|
||||
old_size << xvt_font_get_size(_font);
|
||||
|
||||
const int MAXSIZES = 8;
|
||||
long sizes[MAXSIZES];
|
||||
BOOLEAN scalable = FALSE;
|
||||
TString80 str = o.get();
|
||||
const int num_sizes = (int)xvt_fmap_get_family_sizes(rcd, str.get_buffer(), sizes, &scalable, MAXSIZES);
|
||||
TToken_string pn1;
|
||||
if (scalable)
|
||||
{
|
||||
for (int i = 4; i < 96; i++)
|
||||
pn1.add(i);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (num_sizes > 0)
|
||||
{
|
||||
for (int i = 0; i < num_sizes; i++)
|
||||
pn1.add(sizes[i]);
|
||||
}
|
||||
else
|
||||
pn1.add(printer().get_char_size()); // semper better than nothing
|
||||
}
|
||||
lst.replace_items(pn1, pn1);
|
||||
lst.set(old_size);
|
||||
lst.enable(pn1.items() > 1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
TPrinter_font_mask::TPrinter_font_mask(XVT_FNTID font)
|
||||
: TAutomask(TR("Selezione Font nativo"), 1, 68, 5), _font(font)
|
||||
{
|
||||
add_string(101, 0, PR("Stampante "), 1, 1, 256, "LG", 50);
|
||||
add_list(102, 0, PR("Nome "), 1, 2, 50, "", "", "");
|
||||
add_list(103, 0, PR("Dimensioni "), 1, 3, 2, "", "", "");
|
||||
add_button(DLG_OK, 0, "", -12, -1, 10, 2);
|
||||
add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
|
||||
set_handlers();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport_base_mask
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
bool TReport_base_mask::draw_3d_rect(short id, COLOR rgb) const
|
||||
{
|
||||
const int pos = id2pos(id);
|
||||
const bool ok = pos >= 0;
|
||||
if (ok)
|
||||
{
|
||||
TMask_field& f = fld(pos);
|
||||
if (f.active() && f.parent() == curr_win())
|
||||
{
|
||||
RCT rctfld; f.get_rect(rctfld);
|
||||
const int x = rctfld.right / CHARX + 1;
|
||||
const int y = rctfld.top / ROWY + 1;
|
||||
RCT rct = resize_rect(x, y, -3, 1, W_PLAIN, f.parent());
|
||||
rct.top = rctfld.top; rct.bottom = rctfld.bottom;
|
||||
xi_draw_3d_rect((XinWindow)f.parent(), (XI_RCT*)&rct, TRUE, 2, BTN_LIGHT_COLOR, rgb, BTN_DARK_COLOR);
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool TReport_base_mask::choose_printer_font(XVT_FNTID font)
|
||||
{
|
||||
TPrinter_font_mask m(font);
|
||||
const bool ok = m.run() == K_ENTER;
|
||||
if (ok)
|
||||
{
|
||||
xvt_font_set_family(font, m.get(102));
|
||||
xvt_font_set_size(font, m.get_int(103));
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
void TReport_base_mask::update()
|
||||
{
|
||||
const TMask_field& fld = field(F_FONT_SELECT);
|
||||
@ -419,6 +552,11 @@ void TReport_base_mask::update()
|
||||
advanced_draw_text_line(fld.parent(), _font.name(), rct, _halign, _valign);
|
||||
xvt_font_destroy(fontid);
|
||||
}
|
||||
|
||||
const short cid[3] = { F_FGCOLOR, F_BGCOLOR, F_SHCOLOR };
|
||||
const COLOR col[3] = { _fgcolor, _bgcolor, _shcolor };
|
||||
for (int i = 0; i < 3; i++)
|
||||
draw_3d_rect(cid[i], col[i]);
|
||||
}
|
||||
|
||||
bool TReport_base_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
@ -429,14 +567,21 @@ bool TReport_base_mask::on_field_event(TOperable_field& o, TField_event e, long
|
||||
if (e == fe_button)
|
||||
{
|
||||
_fgcolor = choose_color(_fgcolor, o.parent());
|
||||
force_update();
|
||||
draw_3d_rect(F_FGCOLOR, _fgcolor);
|
||||
}
|
||||
break;
|
||||
case F_BGCOLOR:
|
||||
if (e == fe_button)
|
||||
{
|
||||
_bgcolor = choose_color(_bgcolor, o.parent());
|
||||
force_update();
|
||||
draw_3d_rect(F_BGCOLOR, _bgcolor);
|
||||
}
|
||||
break;
|
||||
case F_SHCOLOR:
|
||||
if (e == fe_button)
|
||||
{
|
||||
_shcolor = choose_color(_shcolor, o.parent());
|
||||
draw_3d_rect(F_SHCOLOR, _shcolor);
|
||||
}
|
||||
break;
|
||||
case F_PATTERN:
|
||||
@ -522,12 +667,30 @@ bool TReport_base_mask::get_font_info(TReport_font& font) const
|
||||
return ok;
|
||||
}
|
||||
|
||||
void TReport_base_mask::kill_special_pattern()
|
||||
{
|
||||
if (id2pos(F_PATTERN) > 0)
|
||||
{
|
||||
TList_field& p = lfield(F_PATTERN);
|
||||
TToken_string cod = p.get_codes();
|
||||
if (cod.get_pos("10") > 0)
|
||||
{
|
||||
cod.cut(cod.rfind(cod.separator()));
|
||||
TToken_string val = p.get_values();
|
||||
val.cut(val.rfind(val.separator()));
|
||||
p.replace_items(cod, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TReport_base_mask::TReport_base_mask(const char* name, TReport& rep)
|
||||
: TAutomask(name), _report(rep),
|
||||
_font_changed(false),
|
||||
_halign('C'), _valign('C'),
|
||||
: TAutomask(name), _report(rep), _font_changed(false), _halign('C'), _valign('C'),
|
||||
_fgcolor(COLOR_BLACK), _bgcolor(COLOR_WHITE)
|
||||
{ }
|
||||
{
|
||||
// Toglie le sfumature ai mortali
|
||||
if (!is_power_reseller(true))
|
||||
kill_special_pattern();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport_field_mask
|
||||
@ -545,20 +708,7 @@ long TReport_field_mask::get_num(short id) const
|
||||
|
||||
void TReport_field_mask::update()
|
||||
{
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
TMask_field& fld = field(i == 0 ? F_FGCOLOR : F_BGCOLOR);
|
||||
if (fld.active() && fld.parent() == curr_win())
|
||||
{
|
||||
RCT rctfld; fld.get_rect(rctfld);
|
||||
const int x = rctfld.right / CHARX + 1;
|
||||
const int y = rctfld.top / ROWY + 1;
|
||||
RCT& rct = resize_rect(x, y, -3, 1, W_PLAIN, fld.parent());
|
||||
rct.top = rctfld.top; rct.bottom = rctfld.bottom;
|
||||
xi_draw_3d_rect((XinWindow)fld.parent(), (XinRect*)&rct, TRUE, 2, MASK_LIGHT_COLOR,
|
||||
i == 0 ? _fgcolor : _bgcolor, MASK_DARK_COLOR);
|
||||
}
|
||||
}
|
||||
draw_3d_rect(F_TXCOLOR, _txcolor);
|
||||
TReport_base_mask::update();
|
||||
}
|
||||
|
||||
@ -608,6 +758,13 @@ bool TReport_field_mask::on_field_event(TOperable_field& o, TField_event e, long
|
||||
{
|
||||
switch(o.dlg())
|
||||
{
|
||||
case F_TXCOLOR:
|
||||
if (e == fe_button)
|
||||
{
|
||||
_txcolor = choose_color(_txcolor, o.parent());
|
||||
force_update();
|
||||
}
|
||||
break;
|
||||
case F_TYPE:
|
||||
if (e == fe_init || e == fe_modify)
|
||||
{
|
||||
@ -704,6 +861,9 @@ void TReport_field_mask::set_field(const TReport_field& rf)
|
||||
char str[2] = { rf.type(), '\0' };
|
||||
set(F_TYPE, str, true);
|
||||
|
||||
if (strchr("ELR", rf.type()))
|
||||
kill_special_pattern();
|
||||
|
||||
const TReport_rct& r = rf.get_rect();
|
||||
set(F_ID, rf.id());
|
||||
set_num(F_X, r.left());
|
||||
@ -726,9 +886,11 @@ void TReport_field_mask::set_field(const TReport_field& rf)
|
||||
set(F_BORDER, rf.border());
|
||||
set(F_PATTERN, rf.pattern());
|
||||
set_num(F_RADIUS, rf.radius());
|
||||
set_num(F_SHADE_OFFSET, rf.shade_offset());
|
||||
set_num(F_SHADE_OFFSET, rf.shadow_offset());
|
||||
_txcolor = rf.text_color();
|
||||
_fgcolor = rf.fore_color();
|
||||
_bgcolor = rf.back_color();
|
||||
_shcolor = rf.shade_color();
|
||||
set(F_TEXT, rf.picture());
|
||||
set(F_SOURCE, rf.field());
|
||||
set(F_SOURCE2, rf.alternate_field());
|
||||
@ -762,9 +924,12 @@ void TReport_field_mask::get_field(TReport_field& rf) const
|
||||
rf.set_pattern((PAT_STYLE)get_int(F_PATTERN));
|
||||
rf.set_border(get_int(F_BORDER));
|
||||
rf.set_radius(get_num(F_RADIUS));
|
||||
rf.set_shade_offset(get_num(F_SHADE_OFFSET));
|
||||
rf.set_shadow_offset(get_num(F_SHADE_OFFSET));
|
||||
rf.set_text_color(_txcolor);
|
||||
rf.set_fore_color(_fgcolor);
|
||||
rf.set_back_color(_bgcolor);
|
||||
rf.set_shade_color(_shcolor);
|
||||
rf.set_shade_angle(get_int(F_SHADE_ANGLE));
|
||||
if (strchr("VP", rf.type()) != NULL)
|
||||
rf.set_picture(get_bool(F_HIDE_DOTS) ? "#########,@@" : "###.###.###,@@");
|
||||
else
|
||||
@ -779,7 +944,7 @@ void TReport_field_mask::get_field(TReport_field& rf) const
|
||||
rf.set_postscript(get(F_POSTSCRIPT));
|
||||
if (rf.type() == 'A')
|
||||
{
|
||||
TSheet_field& list = sfield(F_LIST);
|
||||
const TSheet_field& list = sfield(F_LIST);
|
||||
rf.set_list(list.rows_array());
|
||||
}
|
||||
}
|
||||
@ -839,7 +1004,6 @@ class TReport_window : public TField_window
|
||||
RCT _rct_drag;
|
||||
|
||||
TReport_image_cache _images;
|
||||
//int _default_row_height;
|
||||
|
||||
static TArray _clipboard;
|
||||
|
||||
@ -871,7 +1035,8 @@ protected:
|
||||
int lpi() const;
|
||||
|
||||
bool advanced_set_draw_tools(PAT_STYLE pat, int border, COLOR fore, COLOR back);
|
||||
void advanced_draw_rect(const RCT& r, PAT_STYLE pat, int border, COLOR fore, COLOR back, int radius, int shade);
|
||||
void advanced_draw_rect(const RCT& r, PAT_STYLE pat, int border,
|
||||
COLOR fore, COLOR back, COLOR shade, int radius, int shadow, int angle);
|
||||
void offset_selection(TReport_section& rs, const TReport_size& p); // low level offset
|
||||
|
||||
public:
|
||||
@ -1158,9 +1323,8 @@ void TReport_window::popup_menu()
|
||||
menu[12].tag = POPUP_SELALL; menu[12].text = (char*)TR("Seleziona tutto"); menu[12].enabled = ful;
|
||||
menu[13].tag = POPUP_UNSELALL; menu[13].text = (char*)TR("Deseleziona tutto"); menu[13].enabled = ful;
|
||||
menu[14].tag = -1; menu[14].separator = true;
|
||||
menu[15].tag = POPUP_PROPERTIES; menu[15].text = "Proprieta'"; menu[15].enabled = true;
|
||||
menu[16].tag = POPUP_NEWFIELD; menu[16].text = "Nuovo"; menu[16].enabled = true;
|
||||
|
||||
menu[15].tag = POPUP_PROPERTIES; menu[15].text = (char*)TR("Proprieta'"); menu[15].enabled = true;
|
||||
menu[16].tag = POPUP_NEWFIELD; menu[16].text = (char*)TR("Nuovo"); menu[16].enabled = true;
|
||||
|
||||
_pt_drag_start = dev2rep(_pt_click);
|
||||
xvt_menu_popup(menu, win(), _pt_click, XVT_POPUP_CENTER, 0);
|
||||
@ -1612,8 +1776,8 @@ void TReport_window::rep2dev(const TReport_rct& rr, RCT& dr) const
|
||||
|
||||
bool TReport_window::advanced_set_draw_tools(PAT_STYLE pat, int border, COLOR fore, COLOR back)
|
||||
{
|
||||
const bool has_pen = border > 0;
|
||||
const bool has_brush = pat > PAT_HOLLOW;
|
||||
const bool has_pen = border > 0 && fore != COLOR_INVALID;
|
||||
const bool has_brush = pat > PAT_HOLLOW && back != COLOR_INVALID;
|
||||
const bool visible = has_pen || has_brush;
|
||||
if (visible)
|
||||
{
|
||||
@ -1635,27 +1799,39 @@ bool TReport_window::advanced_set_draw_tools(PAT_STYLE pat, int border, COLOR fo
|
||||
return visible;
|
||||
}
|
||||
|
||||
void TReport_window::advanced_draw_rect(const RCT& r, PAT_STYLE pat, int border, COLOR fore, COLOR back, int radius, int shade)
|
||||
void TReport_window::advanced_draw_rect(const RCT& r, PAT_STYLE pat, int border,
|
||||
COLOR fore, COLOR back, COLOR shade,
|
||||
int radius, int shadow, int angle)
|
||||
{
|
||||
if (shade != 0 && pat == PAT_SOLID)
|
||||
WINDOW w = win();
|
||||
if (shadow != 0 && (pat == PAT_SOLID || pat == PAT_SPECIAL)) // Disegna eventuale ombra
|
||||
{
|
||||
if (advanced_set_draw_tools(pat, 0, COLOR_GRAY, COLOR_GRAY))
|
||||
{
|
||||
RCT rct = r;
|
||||
xvt_rect_offset(&rct, shade, shade);
|
||||
xvt_rect_offset(&rct, shadow, shadow);
|
||||
if (radius > 0)
|
||||
xvt_dwin_draw_roundrect(win(), &rct, radius, radius);
|
||||
xvt_dwin_draw_roundrect(w, &rct, radius, radius);
|
||||
else
|
||||
xvt_dwin_draw_rect(win(), (RCT*)&rct);
|
||||
xvt_dwin_draw_rect(w, &rct);
|
||||
}
|
||||
}
|
||||
|
||||
if (advanced_set_draw_tools(pat, border, fore, back))
|
||||
if (pat == PAT_SPECIAL && shade != COLOR_INVALID)
|
||||
{
|
||||
if (radius > 0)
|
||||
xvt_dwin_draw_roundrect(win(), &r, radius, radius);
|
||||
else
|
||||
xvt_dwin_draw_rect(win(), (RCT*)&r);
|
||||
xvt_dwin_draw_gradient_linear(w, &r, back, shade, angle);
|
||||
if (advanced_set_draw_tools(PAT_HOLLOW, border, fore, COLOR_INVALID)) // ha un bordo
|
||||
xvt_dwin_draw_rect(w, (RCT*)&r);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (advanced_set_draw_tools(pat, border, fore, back))
|
||||
{
|
||||
if (radius > 0)
|
||||
xvt_dwin_draw_roundrect(w, &r, radius, radius);
|
||||
else
|
||||
xvt_dwin_draw_rect(w, (RCT*)&r);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1684,20 +1860,18 @@ void TReport_window::draw_grid()
|
||||
x = y = 196*k;
|
||||
|
||||
// Disegna l'eventuale sfondo di sezione
|
||||
const bool draw_back = y > 0 && (rs.border() > 0
|
||||
const bool draw_back = y > 0 && (rs.border() > 0 || rs.pattern() == PAT_SPECIAL
|
||||
|| (rs.pattern() >= PAT_SOLID && rs.back_color() != COLOR_WHITE));
|
||||
if (draw_back)
|
||||
{
|
||||
const PNT p = rep2dev(TReport_pnt(x, y));
|
||||
RCT rct; xvt_rect_set(&rct, 0, 0, p.h, p.v);
|
||||
int rad = 0;
|
||||
if (rs.radius() > 0)
|
||||
{
|
||||
const PNT p0 = rep2dev(TReport_pnt(0,0));
|
||||
const PNT pr = rep2dev(TReport_pnt(rs.radius(),rs.radius()));
|
||||
rad = min(pr.h-p0.h, pr.v-p0.v);
|
||||
}
|
||||
advanced_draw_rect(rct, rs.pattern(), rs.border(), rs.fore_color(), rs.back_color(), rad, 0);
|
||||
const PNT p0 = rep2dev(TReport_pnt(0, 0));
|
||||
const PNT pr = rep2dev(TReport_pnt(rs.radius(), rs.radius()));
|
||||
const int radius = min(pr.h-p0.h, pr.v-p0.v);
|
||||
advanced_draw_rect(rct, rs.pattern(), rs.border(),
|
||||
rs.fore_color(), rs.back_color(), rs.shade_color(),
|
||||
radius, 0, rs.shade_angle());
|
||||
}
|
||||
|
||||
for (int i = x/k; i > 0; i--)
|
||||
@ -1758,20 +1932,20 @@ void TReport_window::draw_field(const TReport_field& rf)
|
||||
}
|
||||
|
||||
int off = 0;
|
||||
if (rf.shade_offset() > 0)
|
||||
if (rf.shadow_offset() > 0)
|
||||
{
|
||||
const int width = r.right - r.left;
|
||||
off = rf.shade_offset() * width / rf.get_rect().width();
|
||||
off = rf.shadow_offset() * width / rf.get_rect().width();
|
||||
}
|
||||
|
||||
PAT_STYLE back_pattern = PAT_HOLLOW;
|
||||
const int k = (rf.hidden() ? 1 : 0) + (rf.deactivated() ? 2 : 0);
|
||||
switch (k)
|
||||
{
|
||||
case 1: back_pattern = PAT_FDIAG; break;
|
||||
case 2: back_pattern = PAT_BDIAG; break;
|
||||
case 1: back_pattern = PAT_FDIAG; break;
|
||||
case 2: back_pattern = PAT_BDIAG; break;
|
||||
case 3: back_pattern = PAT_DIAGCROSS; break;
|
||||
default: back_pattern = PAT_HOLLOW; break;
|
||||
default: back_pattern = PAT_HOLLOW; break;
|
||||
}
|
||||
|
||||
switch (rf.type())
|
||||
@ -1789,11 +1963,11 @@ void TReport_window::draw_field(const TReport_field& rf)
|
||||
const TImage* img = _images.image(name);
|
||||
if (img != NULL && img->ok())
|
||||
img->draw(win(), r);
|
||||
advanced_draw_rect(r, PAT_HOLLOW, rf.border(), rf.fore_color(), COLOR_WHITE, 0, off);
|
||||
advanced_draw_rect(r, PAT_HOLLOW, rf.border(), rf.fore_color(), COLOR_INVALID, COLOR_INVALID, 0, off, 0);
|
||||
}
|
||||
break;
|
||||
case 'L':
|
||||
if (advanced_set_draw_tools(PAT_SOLID, rf.border(), rf.fore_color(), COLOR_WHITE))
|
||||
if (advanced_set_draw_tools(PAT_SOLID, rf.border(), rf.fore_color(), COLOR_INVALID))
|
||||
{
|
||||
const PNT f = { r.top, r.left };
|
||||
xvt_dwin_draw_set_pos(win(), f);
|
||||
@ -1803,11 +1977,11 @@ void TReport_window::draw_field(const TReport_field& rf)
|
||||
back_pattern = PAT_HOLLOW;
|
||||
break;
|
||||
case 'R':
|
||||
advanced_draw_rect(r, rf.pattern(), rf.border(), rf.fore_color(), rf.back_color(), rad, off);
|
||||
advanced_draw_rect(r, rf.pattern(), rf.border(), rf.fore_color(), rf.back_color(), rf.shade_color(), rad, off, rf.shade_angle());
|
||||
break;
|
||||
case 'T':
|
||||
{
|
||||
advanced_draw_rect(r, rf.pattern(), rf.border(), rf.fore_color(), rf.back_color(), rad, off);
|
||||
advanced_draw_rect(r, rf.pattern(), rf.border(), rf.fore_color(), rf.back_color(), rf.shade_color(), rad, off, rf.shade_angle());
|
||||
|
||||
const TString& str = rf.picture();
|
||||
if (str.full())
|
||||
@ -1838,10 +2012,9 @@ void TReport_window::draw_field(const TReport_field& rf)
|
||||
draw_broken_paper(rf);
|
||||
else
|
||||
{
|
||||
if (rf.border() <= 0) // Rendi piu' visibile il bordo dei campi che non ce l'hanno
|
||||
advanced_draw_rect(r, PAT_HOLLOW, 1, COLOR_LTGRAY, COLOR_WHITE, 0, 0);
|
||||
else
|
||||
advanced_draw_rect(r, rf.pattern(), rf.border(), rf.fore_color(), rf.back_color(), rad, off);
|
||||
advanced_draw_rect(r, rf.pattern(), rf.border(), rf.fore_color(), rf.back_color(), rf.shade_color(), rad, off, rf.shade_angle());
|
||||
if (rf.border() <= 0) // Rendi comunque visibile il bordo dei campi che non ce l'hanno
|
||||
advanced_draw_rect(r, PAT_HOLLOW, 1, COLOR_LTGRAY, COLOR_INVALID, COLOR_INVALID, 0, 0, 0);
|
||||
}
|
||||
|
||||
if (rf.link().not_empty())
|
||||
@ -1856,7 +2029,7 @@ void TReport_window::draw_field(const TReport_field& rf)
|
||||
else
|
||||
{
|
||||
xvt_dwin_set_font(win(), rf.font().get_xvt_font(*this));
|
||||
set_color(rf.fore_color(), rf.back_color());
|
||||
set_color(rf.text_color(), rf.back_color());
|
||||
}
|
||||
|
||||
TString str;
|
||||
@ -1926,19 +2099,14 @@ void TReport_window::draw_bg()
|
||||
|
||||
void TReport_window::update()
|
||||
{
|
||||
clear(COLOR_WHITE);
|
||||
draw_bg();
|
||||
draw_grid(); // Disegna griglia
|
||||
|
||||
//const TReport_rct rect_riga(0,0,1000,100);
|
||||
//RCT rct_riga; rep2dev(rect_riga, rct_riga);
|
||||
//_default_row_height = rct_riga.bottom - rct_riga.top;
|
||||
|
||||
clear(COLOR_WHITE); // Cancella pagina
|
||||
draw_bg(); // Disegna sfondo
|
||||
draw_grid(); // Disegna griglia
|
||||
const TReport_section& rs = curr_section();
|
||||
for (int i = 0; i < rs.items(); i++)
|
||||
{
|
||||
const TReport_field& rf = rs.field(i);
|
||||
draw_field(rf);
|
||||
draw_field(rf); // Disegna campo
|
||||
}
|
||||
}
|
||||
|
||||
|
11
ba/ba8301.h
11
ba/ba8301.h
@ -68,10 +68,6 @@ public:
|
||||
TReport_drawer(TMask* m) : TWindowed_field(m) { }
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport_field_mask
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TReport_base_mask
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -86,10 +82,12 @@ class TReport_base_mask : public TAutomask
|
||||
protected:
|
||||
TReport& _report;
|
||||
char _halign, _valign;
|
||||
COLOR _fgcolor, _bgcolor;
|
||||
COLOR _fgcolor, _bgcolor, _shcolor;
|
||||
|
||||
bool draw_3d_rect(short id, COLOR rgb) const;
|
||||
virtual void update();
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
void kill_special_pattern();
|
||||
|
||||
public:
|
||||
void set_font_info(const TReport_font& font);
|
||||
@ -101,12 +99,15 @@ public:
|
||||
class TReport_field_mask : public TReport_base_mask
|
||||
{
|
||||
TReport_field& _rf;
|
||||
COLOR _txcolor;
|
||||
|
||||
protected:
|
||||
void vedo_non_vedo();
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
virtual void update();
|
||||
|
||||
|
||||
|
||||
public:
|
||||
void set_num(short id, long n);
|
||||
long get_num(short id) const;
|
||||
|
Loading…
x
Reference in New Issue
Block a user