Patch level : 4.0
Files correlati : stampe analitiche in genere Ricompilazione Demo : [ ] Commento : Aggiunto supporto per la suddivisione in piu' fogli delle pagine di stampa piu' larghe di una pagina fisica git-svn-id: svn://10.65.10.50/trunk@14341 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
e41346408f
commit
4deedda029
@ -8,6 +8,7 @@
|
|||||||
#include <reprint.h>
|
#include <reprint.h>
|
||||||
#include <statbar.h>
|
#include <statbar.h>
|
||||||
#include <urldefid.h>
|
#include <urldefid.h>
|
||||||
|
#include <utility.h>
|
||||||
|
|
||||||
#include <bagn003.h>
|
#include <bagn003.h>
|
||||||
#include <bagn009.h>
|
#include <bagn009.h>
|
||||||
@ -900,8 +901,11 @@ TPoint TBook::page_res() const
|
|||||||
|
|
||||||
bool TBook::open_page()
|
bool TBook::open_page()
|
||||||
{
|
{
|
||||||
if (_out == NULL)
|
if (_out == NULL) // Sto per scrivere la prima pagina
|
||||||
|
{
|
||||||
_out = new ofstream(_file);
|
_out = new ofstream(_file);
|
||||||
|
_max_frame = 0; // Azzero la dimensione del massimo frame
|
||||||
|
}
|
||||||
|
|
||||||
_page++;
|
_page++;
|
||||||
_index.add_long(_out->tellp(), page()); // Scrive alla posizione 1 l'inizio di pagina 1
|
_index.add_long(_out->tellp(), page()); // Scrive alla posizione 1 l'inizio di pagina 1
|
||||||
@ -954,6 +958,8 @@ void TBook::define_frame(const TRectangle& rect)
|
|||||||
<< " x=" << _rect.x << " y=" << _rect.y
|
<< " x=" << _rect.x << " y=" << _rect.y
|
||||||
<< " dx=" << _rect.width() << " dy=" << _rect.height()
|
<< " dx=" << _rect.width() << " dy=" << _rect.height()
|
||||||
<< " />" << endl;
|
<< " />" << endl;
|
||||||
|
if (_rect.right() > _max_frame)
|
||||||
|
_max_frame = _rect.right();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -972,7 +978,7 @@ void TBook::set_clip(long top, long bottom)
|
|||||||
void TBook::draw_text(const TRectangle& r, const char* txt)
|
void TBook::draw_text(const TRectangle& r, const char* txt)
|
||||||
{
|
{
|
||||||
const TFixed_string str(txt);
|
const TFixed_string str(txt);
|
||||||
if (!str.blank())
|
if (str.full())
|
||||||
{
|
{
|
||||||
define_frame(r);
|
define_frame(r);
|
||||||
*_out << "<text>" << endl << str << endl << "</text>" << endl;
|
*_out << "<text>" << endl << str << endl << "</text>" << endl;
|
||||||
@ -1146,16 +1152,16 @@ void TBook::print_doc(TWindow& win, const TFilename& name)
|
|||||||
RCT page; win.log2dev(rect, page);
|
RCT page; win.log2dev(rect, page);
|
||||||
advanced_draw_text_line(win, name, page, 'C', 'T');
|
advanced_draw_text_line(win, name, page, 'C', 'T');
|
||||||
|
|
||||||
const TPoint pr = page_res();
|
TString8 ext = name.ext(); ext.lower();
|
||||||
rect.deflate(pr.x/2, pr.y/2);
|
if (ext == "bmp" || ext == "gif" || ext == "jpg" || ext == "jpeg")
|
||||||
win.log2dev(rect, page);
|
|
||||||
|
|
||||||
TString4 ext = name.right(3); ext.lower();
|
|
||||||
if (ext == "bmp" || ext == "gif" || ext == "jpg" || ext == "peg")
|
|
||||||
{
|
{
|
||||||
const TImage* img = _images.image(name);
|
const TImage* img = _images.image(name);
|
||||||
if (img != NULL)
|
if (img != NULL)
|
||||||
{
|
{
|
||||||
|
const TPoint pr = page_res();
|
||||||
|
rect.deflate(pr.x/2, pr.y/2);
|
||||||
|
win.log2dev(rect, page);
|
||||||
|
|
||||||
const double sx = double(page.right) / double(img->width());
|
const double sx = double(page.right) / double(img->width());
|
||||||
const double sy = double(page.bottom) / double(img->height());
|
const double sy = double(page.bottom) / double(img->height());
|
||||||
const double s = sx < sy ? sx : sy;
|
const double s = sx < sy ? sx : sy;
|
||||||
@ -1611,23 +1617,94 @@ bool TBook::init()
|
|||||||
_pw = _pw * BOOKDPI / _phr;
|
_pw = _pw * BOOKDPI / _phr;
|
||||||
_pvr = _phr = BOOKDPI;
|
_pvr = _phr = BOOKDPI;
|
||||||
|
|
||||||
bool ok = true;
|
if (_printwin != NULL)
|
||||||
|
delete _printwin;
|
||||||
|
_printwin = new TWindow_printer(_rcd, _pdf_file);
|
||||||
|
|
||||||
if (_pvr < 96 || _phr < 96) // Risoluzione minima di Acrobat Writer
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TBook::close_output()
|
||||||
|
{
|
||||||
|
if (_out != NULL)
|
||||||
{
|
{
|
||||||
ok = yesno_box(FR("Stampante obsoleta o non adeguatamente configurata:\n"
|
_out->close();
|
||||||
"Risoluzione %ldx%ld. Continuare ugualmente?"), _phr, _pvr);
|
delete _out;
|
||||||
|
}
|
||||||
|
_out = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TBook::split_file_if_needed()
|
||||||
|
{
|
||||||
|
const int mf = (_max_frame * _phr) / (100 * cpi()); // log2dev dei poveri
|
||||||
|
const int colonne = (mf+_pw-1) / _pw;
|
||||||
|
if (colonne < 2)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
TString str(1024);
|
||||||
|
str.format(FR("Spezzatura delle pagine su %d fogli"), colonne);
|
||||||
|
|
||||||
|
if (!yesno_box(str))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
TProgind pi(pages(), str, true, true);
|
||||||
|
|
||||||
|
TFilename temp; temp.temp();
|
||||||
|
ofstream out(temp);
|
||||||
|
TPointer_array index;
|
||||||
|
|
||||||
|
close_output(); // Chiudo file di stampa eventualmente aperto
|
||||||
|
ifstream ifs(_file); // Apro file di stampa da splittare
|
||||||
|
|
||||||
|
char* buffer = str.get_buffer();
|
||||||
|
for (unsigned int page = 1; page <= pages(); page++)
|
||||||
|
{
|
||||||
|
if (!pi.setstatus(page))
|
||||||
|
break;
|
||||||
|
const streampos pos = _index.get_long(page);
|
||||||
|
for (int c = 0; c < colonne; c++)
|
||||||
|
{
|
||||||
|
const TRectangle rct_page(c*_pw, 0, _pw, _ph);
|
||||||
|
|
||||||
|
ifs.seekg(pos);
|
||||||
|
while (!ifs.eof())
|
||||||
|
{
|
||||||
|
ifs.getline(buffer, str.size());
|
||||||
|
|
||||||
|
if (str.starts_with("<page "))
|
||||||
|
{
|
||||||
|
const int p = (page-1)*colonne+1+c;
|
||||||
|
index.add_long(out.tellp(), p);
|
||||||
|
str.format("<page number=%d>", p);
|
||||||
|
} else
|
||||||
|
if (str.starts_with("<frame "))
|
||||||
|
{
|
||||||
|
long x, y, dx, dy;
|
||||||
|
sscanf(str, "<frame x=%ld y=%ld dx=%ld dy=%ld />", &x, &y, &dx, &dy);
|
||||||
|
str.format("<frame x=%ld y=%ld dx=%ld dy=%ld />", x-rct_page.x, y, dx, dy);
|
||||||
|
} else
|
||||||
|
if (str.starts_with("</page "))
|
||||||
|
{
|
||||||
|
str.format("</page number=%d>", index.last());
|
||||||
|
}
|
||||||
|
|
||||||
|
out << str << endl;
|
||||||
|
if (str.starts_with("</page "))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ok)
|
out.close();
|
||||||
{
|
|
||||||
if (_printwin != NULL)
|
|
||||||
delete _printwin;
|
|
||||||
_printwin = new TWindow_printer(_rcd, _pdf_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ok;
|
// Sostituisce il file di stampa con quello splittato ed aggiorna l'indice delle pagine
|
||||||
|
fcopy(temp, _file);
|
||||||
|
xvt_fsys_removefile(temp);
|
||||||
|
_index = index;
|
||||||
|
_pages = _index.last();
|
||||||
|
_max_frame = 0; // Impedisce ulteriore splitting
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TBook::main_loop()
|
bool TBook::main_loop()
|
||||||
@ -1708,6 +1785,8 @@ bool TBook::print_to_pdf(size_t pagefrom, size_t pageto, size_t copies)
|
|||||||
if (pages() <= 0)
|
if (pages() <= 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
split_file_if_needed();
|
||||||
|
|
||||||
if (pagefrom == 0)
|
if (pagefrom == 0)
|
||||||
{
|
{
|
||||||
TPrinter& p = printer();
|
TPrinter& p = printer();
|
||||||
@ -1735,7 +1814,8 @@ bool TBook::print_to_pdf(size_t pagefrom, size_t pageto, size_t copies)
|
|||||||
_pagefrom = pagefrom;
|
_pagefrom = pagefrom;
|
||||||
_pageto = pageto;
|
_pageto = pageto;
|
||||||
_copies = copies;
|
_copies = copies;
|
||||||
_pdf_file = "campo.pdf";
|
_pdf_file.tempdir();
|
||||||
|
_pdf_file.add("campo.pdf");
|
||||||
}
|
}
|
||||||
|
|
||||||
xvt_print_start_thread(main_loop_callback, (long)this);
|
xvt_print_start_thread(main_loop_callback, (long)this);
|
||||||
@ -1744,6 +1824,8 @@ bool TBook::print_to_pdf(size_t pagefrom, size_t pageto, size_t copies)
|
|||||||
|
|
||||||
bool TBook::preview()
|
bool TBook::preview()
|
||||||
{
|
{
|
||||||
|
split_file_if_needed();
|
||||||
|
|
||||||
TPreview_mask msk(this);
|
TPreview_mask msk(this);
|
||||||
const KEY k = msk.run();
|
const KEY k = msk.run();
|
||||||
switch (k)
|
switch (k)
|
||||||
@ -1795,13 +1877,10 @@ TBook::TBook(const char* name)
|
|||||||
|
|
||||||
TBook::~TBook()
|
TBook::~TBook()
|
||||||
{
|
{
|
||||||
if (_out != NULL)
|
close_output();
|
||||||
{
|
if (_is_temporary)
|
||||||
_out->close();
|
xvt_fsys_removefile(_file);
|
||||||
delete _out;
|
|
||||||
if (_is_temporary)
|
|
||||||
xvt_fsys_removefile(_file);
|
|
||||||
}
|
|
||||||
if (_printwin != NULL)
|
if (_printwin != NULL)
|
||||||
delete _printwin;
|
delete _printwin;
|
||||||
}
|
}
|
||||||
@ -1982,7 +2061,7 @@ long TReport_book::print_section(TReport_section& rs)
|
|||||||
rs.init_dynamic_heights(*this);
|
rs.init_dynamic_heights(*this);
|
||||||
|
|
||||||
// Non sono sicuro se vada prima di load_fields o dopo execute_prescript
|
// Non sono sicuro se vada prima di load_fields o dopo execute_prescript
|
||||||
if (!rs.condition().blank())
|
if (rs.condition().full())
|
||||||
{
|
{
|
||||||
TVariant var;
|
TVariant var;
|
||||||
_report->evaluate(rs.condition(), var, _alfafld);
|
_report->evaluate(rs.condition(), var, _alfafld);
|
||||||
@ -2173,15 +2252,16 @@ bool TReport_book::add(TReport& rep, bool progind)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
rex->requery();
|
rex->requery();
|
||||||
if (rex->items() <= 0)
|
const TRecnotype rex_items = rex->items();
|
||||||
|
if (rex_items <= 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
TString msg = TR("Elaborazione report");
|
TString msg = TR("Elaborazione report");
|
||||||
msg << ' ' << _report->filename();
|
msg << ' ' << _report->filename();
|
||||||
|
|
||||||
TProgind* pi = NULL;
|
TProgind* pi = NULL;
|
||||||
if (progind)
|
if (progind && rex_items > 1)
|
||||||
pi = new TPrintind(rex->items(), msg);
|
pi = new TPrintind(rex_items, msg);
|
||||||
|
|
||||||
TString_array oldgroup, newgroup;
|
TString_array oldgroup, newgroup;
|
||||||
const int max_group = _report->find_max_level('H');
|
const int max_group = _report->find_max_level('H');
|
||||||
@ -2276,8 +2356,7 @@ bool TReport_book::add(TReport& rep, bool progind)
|
|||||||
|
|
||||||
if (pi != NULL)
|
if (pi != NULL)
|
||||||
{
|
{
|
||||||
pi->addstatus(1);
|
if (!pi->addstatus(1))
|
||||||
if (pi->iscancelled())
|
|
||||||
_print_aborted = true;
|
_print_aborted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2362,6 +2441,7 @@ bool TReport_book::print(size_t pagefrom, size_t pageto, size_t copies)
|
|||||||
{
|
{
|
||||||
if (pages() <= 0)
|
if (pages() <= 0)
|
||||||
return false;
|
return false;
|
||||||
|
split_file_if_needed();
|
||||||
|
|
||||||
if (pagefrom <= 0)
|
if (pagefrom <= 0)
|
||||||
{
|
{
|
||||||
|
@ -11,11 +11,12 @@ class TBook : public TObject
|
|||||||
{
|
{
|
||||||
size_t _page, _pages;
|
size_t _page, _pages;
|
||||||
|
|
||||||
TPointer_array _index;
|
TFilename _file, _pdf_file; // Nomi dei file di output
|
||||||
TFilename _file;
|
|
||||||
TFilename _pdf_file;
|
ofstream* _out; // File di output
|
||||||
ofstream* _out;
|
TPointer_array _index; // Indice delle pagine
|
||||||
bool _is_temporary;
|
bool _is_temporary; // Flag di file di output temporaneo
|
||||||
|
int _max_frame; // Massimo rettangolo scritto sul file di output
|
||||||
|
|
||||||
DRAW_CTOOLS _tools;
|
DRAW_CTOOLS _tools;
|
||||||
TReport_font _font;
|
TReport_font _font;
|
||||||
@ -36,6 +37,8 @@ protected:
|
|||||||
TPoint log2dev(const TPoint& ptlog) const;
|
TPoint log2dev(const TPoint& ptlog) const;
|
||||||
PNT log2pix(const TPoint& ptlog) const;
|
PNT log2pix(const TPoint& ptlog) const;
|
||||||
bool is_pdf() const { return _pdf_file.full(); }
|
bool is_pdf() const { return _pdf_file.full(); }
|
||||||
|
void close_output();
|
||||||
|
bool split_file_if_needed();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual bool open_page();
|
virtual bool open_page();
|
||||||
|
@ -1235,7 +1235,7 @@ bool TFilename::ok() const
|
|||||||
const TFilename& TFilename::tempdir()
|
const TFilename& TFilename::tempdir()
|
||||||
{
|
{
|
||||||
static TFilename _tempdir;
|
static TFilename _tempdir;
|
||||||
const bool create = _tempdir.empty() || user().compare(_tempdir.right(user().len()), -1, true);
|
const bool create = _tempdir.empty() || !_tempdir.ends_with(user(), true);
|
||||||
|
|
||||||
if (create)
|
if (create)
|
||||||
{
|
{
|
||||||
@ -1259,8 +1259,7 @@ const TFilename& TFilename::tempdir()
|
|||||||
|
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
TString16 theuser(user());
|
TString theuser(user());
|
||||||
|
|
||||||
if (theuser.empty())
|
if (theuser.empty())
|
||||||
theuser = ::dongle().administrator();
|
theuser = ::dongle().administrator();
|
||||||
theuser.lower();
|
theuser.lower();
|
||||||
@ -1277,7 +1276,7 @@ const TFilename& TFilename::tempdir()
|
|||||||
|
|
||||||
TString tmp = _tempdir;
|
TString tmp = _tempdir;
|
||||||
tmp.insert("TMP=", 0);
|
tmp.insert("TMP=", 0);
|
||||||
putenv((char *)(const char *) tmp);
|
putenv(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
set(_tempdir);
|
set(_tempdir);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user