Aggiunti 'bookmarks' a printapp, printer e viswin, con generazione

automatica del menu Indice


git-svn-id: svn://10.65.10.50/trunk@1245 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
villa 1995-04-13 07:45:30 +00:00
parent 5bb4ea1e2d
commit 1f0d3a4fb7
6 changed files with 335 additions and 144 deletions

View File

@ -1,4 +1,4 @@
// $Id: printapp.cpp,v 1.20 1995-04-12 15:44:43 alex Exp $
// $Id: printapp.cpp,v 1.21 1995-04-13 07:45:10 villa Exp $
#include <ctype.h>
#include <stdarg.h>
@ -176,9 +176,14 @@ link_item *TPrint_application::_look_print_node (link_item * head, int logicnum)
return NULL;
}
int TPrint_application::set_bookmark(const char* txt, int father)
{
return printer().set_bookmark(txt, father);
}
void TPrint_application::add_file (const char *tab, int from)
{
add_file (TTable ::name2log (tab), from);
add_file(TTable::name2log (tab), from);
}
void TPrint_application::add_file (int file, int from)
@ -414,7 +419,7 @@ void TPrint_application::reset_print ()
_print_defined = FALSE;
}
void TPrint_application::set_header (int r, const char *fmt,...)
void TPrint_application::set_header (int r, const char *fmt, ...)
{
CHECK (r >= 1, "Header rows start at 1");
va_list vl;
@ -422,12 +427,12 @@ void TPrint_application::set_header (int r, const char *fmt,...)
vsprintf (__tmp_string, fmt, vl);
va_end (vl);
TPrintrow *pp = (TPrintrow *) _header.objptr (r - 1);
TPrintrow *pp = (TPrintrow *)_header.objptr(r - 1);
if (!pp)
{
pp = new TPrintrow;
_header.add (pp, r - 1);
}
{
pp = new TPrintrow;
_header.add (pp, r - 1);
}
pp->put (__tmp_string);
}
@ -440,10 +445,10 @@ void TPrint_application::set_footer (int r, const char *fmt,...)
va_end (vl);
TPrintrow *pp = (TPrintrow *) _footer.objptr (r - 1);
if (pp == NULL)
{
pp = new TPrintrow;
_footer.add (pp, r - 1);
}
{
pp = new TPrintrow;
_footer.add (pp, r - 1);
}
pp->put (__tmp_string);
}
@ -463,10 +468,10 @@ void TPrint_application::fill_page (int from)
{
from--;
for (int i = (from == -1 ? _maxrow : from); i <= printer().formlen (); i++)
{
reset_row (i);
set_row (i, "");
}
{
reset_row (i);
set_row (i, "");
}
}
void TPrint_application::merge_export_file(const char* file, bool header, bool direct)
@ -511,27 +516,27 @@ void TPrint_application::set_row (int r, const char *frmt,...)
// parse format string
while ((ch = *fmt++) != '\0')
{
if (ch == '@')
{
if (ch == '@')
{
// check for pending string
if (strind)
{
strbuf[strind] = '\0';
_rows.add (new _PrintfTok (_currow, strbuf));
strind = 0;
}
{
strbuf[strind] = '\0';
_rows.add (new _PrintfTok (_currow, strbuf));
strind = 0;
}
ch = *fmt++;
if (isdigit (ch))
{
int i = 0;
digbuf[i++] = ch;
while (isdigit (ch = *fmt++))
digbuf[i++] = ch;
digbuf[i] = '\0';
size = atoi (digbuf);
flags |= PAD_FLAG;
if (ch == '.')
{
int i = 0;
digbuf[i++] = ch;
while (isdigit (ch = *fmt++))
digbuf[i++] = ch;
digbuf[i] = '\0';
size = atoi (digbuf);
flags |= PAD_FLAG;
if (ch == '.')
{
// decimal size follows
i = 0;
@ -543,7 +548,7 @@ void TPrint_application::set_row (int r, const char *frmt,...)
flags |= DEC_FLAG;
// ch = *fmt++;
}
else if (ch == ',')
else if (ch == ',')
{
// aligment spec follows
align = (ch = *fmt++);
@ -552,95 +557,95 @@ void TPrint_application::set_row (int r, const char *frmt,...)
flags |= ALIGN_FLAG;
ch = *fmt++;
}
}
}
switch (ch)
{
// modifiers
case 'l':
case 'L':
flags |= LONG_FLAG;
ch = *fmt++;
break;
case 'p':
case 'P':
flags |= PICTURE_FLAG;
ch = *fmt++;
break;
}
{
// modifiers
case 'l':
case 'L':
flags |= LONG_FLAG;
ch = *fmt++;
break;
case 'p':
case 'P':
flags |= PICTURE_FLAG;
ch = *fmt++;
break;
}
switch (ch)
{
// codes
case '@':
_rows.add (new _PrintfTok (_currow, "@"));
break;
case 'b':
case 'i':
case 'u':
case 'r':
{
char *xxxx = new char[2];
{
// codes
case '@':
_rows.add (new _PrintfTok (_currow, "@"));
break;
case 'b':
case 'i':
case 'u':
case 'r':
{
char *xxxx = new char[2];
xxxx[0] = ch;
xxxx[1] = '\0';
_rows.add (new _FieldTok (_currow, xxxx, FONT_FLAG));
}
break;
case 'g':
case 'j':
{
}
break;
case 'g':
case 'j':
{
const char *xxx = format ("%c %d", ch, size);
char *xxxx = new char[strlen (xxx) + 1];
strcpy (xxxx, xxx);
_rows.add (new _FieldTok (_currow, xxxx, JUMP_FLAG));
}
break;
case 'T':
flags |= IGNORE_FILL;
case 't':
flags |= TRANS_FLAG;
break;
case 'D':
flags |= IGNORE_FILL;
case 'd':
flags |= DATE_FLAG;
break;
case 'F':
flags |= IGNORE_FILL;
case 'f':
flags |= BOOLEAN_FLAG;
break;
case 'S':
flags |= IGNORE_FILL;
case 's':
flags |= STRING_FLAG;
break;
case 'C':
flags |= IGNORE_FILL;
case 'c':
flags |= RECNO_FLAG;
break;
case 'N':
flags |= IGNORE_FILL;
case 'n':
flags |= NUMBER_FLAG;
break;
default:
CHECK (0, "TPrint_application::set_row: invalid @ code");
break;
}
}
break;
case 'T':
flags |= IGNORE_FILL;
case 't':
flags |= TRANS_FLAG;
break;
case 'D':
flags |= IGNORE_FILL;
case 'd':
flags |= DATE_FLAG;
break;
case 'F':
flags |= IGNORE_FILL;
case 'f':
flags |= BOOLEAN_FLAG;
break;
case 'S':
flags |= IGNORE_FILL;
case 's':
flags |= STRING_FLAG;
break;
case 'C':
flags |= IGNORE_FILL;
case 'c':
flags |= RECNO_FLAG;
break;
case 'N':
flags |= IGNORE_FILL;
case 'n':
flags |= NUMBER_FLAG;
break;
default:
CHECK (0, "TPrint_application::set_row: invalid @ code");
break;
}
if (flags & NUMBER_FLAG ||
flags & DATE_FLAG ||
flags & TRANS_FLAG ||
flags & BOOLEAN_FLAG ||
flags & STRING_FLAG)
{
char *xxx = va_arg (params, char *);
_rows.add (new _FieldTok (_currow, xxx,
{
char *xxx = va_arg (params, char *);
_rows.add (new _FieldTok (_currow, xxx,
flags, align, size, dec));
}
}
flags = 0x0000;
align = 'l';
}
else
else
{
TString t;
switch (ch)
@ -729,7 +734,7 @@ void TPrint_application::set_row (int r, const char *frmt,...)
{
// no format specifications
// use default picture
q = rrr->string (_picture);
q = rrr->string(_picture);
}
else
{
@ -758,7 +763,6 @@ void TPrint_application::set_row (int r, const char *frmt,...)
}
break;
case '\n': // ignore
break;
default:
// add to string
@ -870,46 +874,46 @@ bool TPrint_application::print_tree (link_item * head)
{
bool go = TRUE;
while (head)
{
head->_cnt = 0;
if (_cur->is_first_match (head->_logicnum))
{
head->_cnt = 0;
if (_cur->is_first_match (head->_logicnum))
{
do
{
if (!preprocess_print (head->_logicnum, head->_cnt))
break;
do
{
if (!preprocess_print (head->_logicnum, head->_cnt))
break;
do
{
// set print rows according to current file
if (_force_setpage || _cur_file != head->_logicnum
|| !_print_defined)
{
reset_print ();
set_page(head->_logicnum, head->_cnt);
_cur_file = head->_logicnum;
}
{
reset_print ();
set_page(head->_logicnum, head->_cnt);
_cur_file = head->_logicnum;
}
int cnt2 = 0;
do
{
if (!preprocess_page (head->_logicnum, cnt2))
break;
go = print_one (head->_logicnum);
if (go && head->_son)
go = print_tree (head->_son);
}
{
if (!preprocess_page (head->_logicnum, cnt2))
break;
go = print_one (head->_logicnum);
if (go && head->_son)
go = print_tree (head->_son);
}
while (go && postprocess_page (head->_logicnum, cnt2++) ==
REPEAT_PAGE);
}
while (go && _cur->next_match (head->_logicnum));
}
while (go && _cur->next_match (head->_logicnum));
}
while (go && postprocess_print (head->_logicnum, head->_cnt++)
== REPEAT_PAGE);
}
if (!go)
break;
go = TRUE;
head = head->_brother;
}
if (!go)
break;
go = TRUE;
head = head->_brother;
}
return go;
}
@ -1226,7 +1230,7 @@ bool TPrint_application::print_one (int file)
for (i = 0; i <= /*_maxrow*/ last; i++)
{
TPrintrow *pr = (TPrintrow *) & rw[i];
if (!(printer().print (*pr)))
if (!(printer().print(*pr)))
break;
}
if (_auto_ff && _maxrow < printer().formlen ())
@ -1251,9 +1255,9 @@ bool TPrint_application::menu(MENU_TAG m)
return xvt_test_menu_tag (BAR_ITEM (2));
}
bool TPrint_application::create ()
bool TPrint_application::create()
{
TApplication ::create ();
TApplication::create();
printer().setfooterhandler (_pp_footer);
printer().setheaderhandler (_pp_header);
printer().setlinkhandler (_pp_link);

View File

@ -330,6 +330,16 @@ public:
void set_translation(int lognum, const char* field,
const char* from, const char* to);
// --------------------------------------------------------
// bookmarks for viswin
// --------------------------------------------------------
// Aggiungere 'bookmarks' causa la comparsa del menu
// 'Indice' nella viswin, con la lista dei bookmark inseriti;
// questi possono essere legati ad albero n-ario specificando
// il bookmark padre, in tal caso il menu sara' gerarchico a
// sua volta. Prossima release di XVT il menu indice sara'
// pop-up nella finestra
int set_bookmark(const char* txt, int father = -1);
// --------------------------------------------------------
// hypertext interface for viswin

View File

@ -967,7 +967,7 @@ bool TPrinter::printrow(TPrintrow* rowtoprint)
if (_printertype == screenvis)
{
if (!_vf->frozen ())
_vf->add_line (rw);
_vf->add_line(rw);
else
_frozen = TRUE;
return TRUE;
@ -1450,6 +1450,26 @@ void TPrinter::merge_export_file(const char* file, bool header)
}
}
int TPrinter::set_bookmark(const char* txt, int father)
{
if (_printertype == screenvis)
{
BkDef* bkd = new BkDef;
bkd->_row = (_currentrow + ((_currentpage - 1)*_formlen)) - 1;
bkd->_father_id = father;
bkd->_id = _bookmarks.items() + 1;
bkd->_txt = txt;
_bookmarks.add(bkd);
return _bookmarks.items();
}
return 0;
}
void TPrinter::close ()
{
const bool isfirstpage = (_currentpage == 1 && _frompage == 0) ||
@ -1472,7 +1492,8 @@ void TPrinter::close ()
const KEY key = _vf->run ();
if (_vf->is_open ()) _vf->close_modal ();
delete _vf;
freeze (FALSE);
freeze (FALSE);
_bookmarks.destroy();
_vf = NULL;
if (key == K_CTRL+'S')

View File

@ -99,6 +99,19 @@ public:
};
class BkDef : public TObject
{
public:
int _id;
int _father_id;
TString _txt;
long _row;
BkDef() {}
virtual ~BkDef() {}
};
class TPrinter;
typedef void (*PRINTSECTIONHANDLER)(TPrinter& printer);
@ -142,8 +155,10 @@ class TPrinter : public TObject
TDate _date; // printing date
TFilename _printerfile; // filename for printing on file
TArray _linksdescr;
TArray _bookmarks; // bookmarks
bool _multiple_link; //
TString_array _background;
TString_array _image_names;
@ -161,7 +176,7 @@ class TPrinter : public TObject
int _horz_offset;
int _dots_per_line;
void _get_windows_printer_names(TToken_string& t);
void _get_windows_printer_names(TToken_string& t);
bool _multiple_copies;
bool _export_header;
@ -227,8 +242,9 @@ public:
void resetheader();
void resetfooter();
void setbackground(const char* bg);
TString_array& image_names() { return _image_names; }
TString_array& getbgdesc() { return _background; }
TString_array& image_names() { return _image_names; }
TString_array& getbgdesc() { return _background; }
TArray& get_bookmarks() { return _bookmarks; }
bool frozen() { return _frozen; }
void freeze(bool b = TRUE) { _frozen = b; }
int n_copies() { return _ncopies; }
@ -287,6 +303,9 @@ public:
int get_dots_per_line() const { return _dots_per_line; }
bool isgraphics() const { return _isgraphics; }
int get_char_size() const { return _ch_size; }
// bookmarks
int set_bookmark(const char* txt, int father = -1);
};

View File

@ -55,6 +55,30 @@ const long E_ADDLINE = 488L;
HIDDEN bool in_update;
class _BkMenuItem : public TObject
{
public:
TString _txt;
TArray* _arr;
int _id; // per comodita'
_BkMenuItem(const char* t = "")
{ _txt = t; _arr = NULL; }
virtual ~_BkMenuItem()
{ if (_arr != NULL) delete _arr; }
};
class _BkMenuDesc : public TObject
{
public:
TString_array _menu;
int _father_id;
_BkMenuDesc() {}
virtual ~_BkMenuDesc() {}
};
int TViswin::tabx(int x) const
{
HIDDEN long w = 0L;
@ -84,6 +108,104 @@ void TViswin::enable_menu_item(MENU_TAG item, bool on)
xvt_menu_update(win());
}
HIDDEN _BkMenuItem* find_menu_node(TArray& tree, int id)
{
_BkMenuItem* fnd = NULL;
for (int m = 0; m < tree.items(); m++)
{
_BkMenuItem& bkit = (_BkMenuItem&) tree[m];
if (bkit._id == id)
return &bkit;
else if (bkit._arr != NULL)
{
if ((fnd = find_menu_node(*(bkit._arr), id)) != NULL)
break;
}
}
return fnd;
}
HIDDEN void build_menu_tree(TArray& flat, TArray& tree, int level)
{
// find ID in flat array
_BkMenuDesc* bds = NULL;
for (int i = 0; i < flat.items(); i++)
{
_BkMenuDesc& bdss = (_BkMenuDesc&)flat[i];
if (bdss._father_id == 1000 + level)
{
bds = &bdss;
break;
}
}
if (bds == NULL)
{
bds = new _BkMenuDesc;
bds->_father_id = 1000 + level;
flat.add(bds);
}
for (i = 0; i < tree.items(); i++)
{
_BkMenuItem& bki = (_BkMenuItem&)tree[i];
bds->_menu.add(bki._txt);
if (bki._arr != NULL)
build_menu_tree(flat, *(bki._arr), bki._id);
}
}
void TViswin::build_index_menu()
{
// builds bk_menu tree and index menu
TArray bk_tree;
TToken_string tt(128);
// build tree
for (int i = 0; i < _bookmarks->items(); i++)
{
BkDef& bkd = (BkDef&)(*_bookmarks)[i];
tt = format("%d", bkd._id + 1000);
tt.add(bkd._txt);
_BkMenuItem* bkit = new _BkMenuItem((const char*)tt);
bkit->_id = bkd._id;
int father_id = bkd._father_id == -1 ? 0 : bkd._father_id;
if (father_id == 0) // toplevel
bk_tree.add(bkit);
else
{
_BkMenuItem* father = find_menu_node(bk_tree, father_id);
if (father != NULL)
{
if (father->_arr == NULL)
father->_arr = new TArray(4);
father->_arr->add(bkit);
}
}
}
// build menu
if (bk_tree.items() > 0)
{
TString_array top(1); top.add("1000|Indice");
add_menu(top);
}
TArray flat(4);
build_menu_tree(flat, bk_tree, 0);
for (i = 0; i < flat.items(); i++)
{
_BkMenuDesc& bds = (_BkMenuDesc&)flat[i];
add_menu(bds._menu, bds._father_id);
}
}
void TViswin::exec_link()
{
@ -1021,8 +1143,15 @@ void TViswin::handler (WINDOW win, EVENT * ep)
_textcolumns = TEXTCOLUMNS;
autoscroll (TRUE);
break;
case E_COMMAND:
switch(ep->v.cmd.tag)
case E_COMMAND:
if (ep->v.cmd.tag > 1000 && ep->v.cmd.tag < 2000)
{
// bookmark
int index = ep->v.cmd.tag - 1001;
BkDef& bds = (BkDef&)(*_bookmarks)[index];
goto_pos(bds._row, 0l);
}
else switch(ep->v.cmd.tag)
{
case M_EDIT_CLIPBOARD: // interrompi
dispatch_e_char(win, K_ESC);
@ -1975,6 +2104,9 @@ void TViswin::close_print ()
enable_menu_item(M_EDIT_CLIPBOARD, FALSE);
xvt_enable_control(_print_button, TRUE);
enable_menu_item(M_EDIT_SEL_ALL, TRUE);
// build bookmark menu tree
if (_bookmarks->items() > 0)
build_index_menu();
}
force_update ();
}
@ -2233,7 +2365,9 @@ TViswin::TViswin(const char *fname,
_links = _toplevel ? &(main_app().printer().links()) : &(_brwfld->_links);
_multiple = _toplevel ? (main_app().printer ().ismultiplelink()) :
(_brwfld->is_multiple_link());
(_brwfld->is_multiple_link());
_bookmarks = &(main_app().printer().get_bookmarks());
_bg = _toplevel ? &(main_app().printer().getbgdesc()) : _brwfld->get_bg_desc();
_formlen = _toplevel ? main_app().printer().formlen() : maxalt;
_linkID = -1;
@ -2246,7 +2380,8 @@ TViswin::TViswin(const char *fname,
char b = *(t.get (2));
t.restart();
_txt.set_hotspots(f, b);
}
}
_hotspots = &(_txt.hotspots());
main_app().end_wait();

View File

@ -72,6 +72,7 @@ class TViswin : public TScroll_window
TArray* _links; // admitted links
TArray* _hotspots; // hotspots
TArray* _bookmarks; // bookmarks
bool need_paint_sel(bool smart = TRUE);
@ -130,6 +131,7 @@ protected:
void display_link(long, long, long, const char*);
void freeze() { _frozen = TRUE; }
void exec_link();
void build_index_menu();
protected:
void scroll_error(long x, long y);