Browse Source

Added pdf generation to the fltk module.

mingodad 13 years ago
parent
commit
9b01207919
8 changed files with 411 additions and 18 deletions
  1. 3 0
      editor/editor.cbp
  2. 329 8
      ext/sq_fltk.cpp
  3. 4 0
      include/squirrel.h
  4. 3 3
      ourbiz/base-report-A4.nut
  5. 2 2
      ourbiz/fl-bar-chart.nut
  6. 67 3
      ourbiz/ourbiz-fltk.nut
  7. 0 2
      ourbiz/pdf-order.nut
  8. 3 0
      squilu.cbp

+ 3 - 0
editor/editor.cbp

@@ -71,6 +71,7 @@
 			<Add directory="../../dadbiz++/third-party/sqlite3" />
 			<Add directory="../../dadbiz++/third-party/sqlite3" />
 			<Add directory="../../zeromq-3.2.2/include" />
 			<Add directory="../../zeromq-3.2.2/include" />
 			<Add directory="../../dadbiz++/third-party/flu" />
 			<Add directory="../../dadbiz++/third-party/flu" />
+			<Add directory="../../dadbiz++/third-party/libharu/include" />
 		</Compiler>
 		</Compiler>
 		<Linker>
 		<Linker>
 			<Add library="fltk_images" />
 			<Add library="fltk_images" />
@@ -89,11 +90,13 @@
 			<Add library="pthread" />
 			<Add library="pthread" />
 			<Add library="zmq3" />
 			<Add library="zmq3" />
 			<Add library="rt" />
 			<Add library="rt" />
+			<Add library="hpdfs" />
 			<Add directory="../../dadbiz++/third-party/fltk/lib" />
 			<Add directory="../../dadbiz++/third-party/fltk/lib" />
 			<Add directory="../ext/mpdecimal" />
 			<Add directory="../ext/mpdecimal" />
 			<Add directory="../ext/myaxtls" />
 			<Add directory="../ext/myaxtls" />
 			<Add directory="../../zeromq-3.2.2" />
 			<Add directory="../../zeromq-3.2.2" />
 			<Add directory="../../dadbiz++/third-party/flu" />
 			<Add directory="../../dadbiz++/third-party/flu" />
+			<Add directory="../../dadbiz++/third-party/libharu/src" />
 		</Linker>
 		</Linker>
 		<Unit filename="editor.cxx" />
 		<Unit filename="editor.cxx" />
 		<Unit filename="../ext/fpdf.cpp" />
 		<Unit filename="../ext/fpdf.cpp" />

+ 329 - 8
ext/sq_fltk.cpp

@@ -37,6 +37,9 @@
 #include <FL/Fl_PNG_Image.H>
 #include <FL/Fl_PNG_Image.H>
 #include <FL/Fl_JPEG_Image.H>
 #include <FL/Fl_JPEG_Image.H>
 
 
+#include <FL/Fl_Pdf.H>
+#include <FL/Fl_PostScript.H>
+
 #include <FL/Fl_File_Chooser.H>
 #include <FL/Fl_File_Chooser.H>
 #include <FL/Fl_Native_File_Chooser.H>
 #include <FL/Fl_Native_File_Chooser.H>
 
 
@@ -95,6 +98,12 @@ CREATE_TAG(Fl_Image);
 CREATE_TAG(Fl_PNG_Image);
 CREATE_TAG(Fl_PNG_Image);
 CREATE_TAG(Fl_JPEG_Image);
 CREATE_TAG(Fl_JPEG_Image);
 
 
+CREATE_TAG(Fl_Device);
+CREATE_TAG(Fl_Surface_Device);
+CREATE_TAG(Fl_Paged_Device);
+CREATE_TAG(Fl_Pdf_File_Device);
+CREATE_TAG(Fl_PostScript_File_Device);
+
 CREATE_TAG(Fl_File_Chooser);
 CREATE_TAG(Fl_File_Chooser);
 CREATE_TAG(Fl_Native_File_Chooser);
 CREATE_TAG(Fl_Native_File_Chooser);
 CREATE_TAG(Fl_Text_Buffer);
 CREATE_TAG(Fl_Text_Buffer);
@@ -340,7 +349,16 @@ static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
 {\
 {\
     getSelf(v);\
     getSelf(v);\
     SQInteger iparam; sq_getinteger(v, 2, &iparam);\
     SQInteger iparam; sq_getinteger(v, 2, &iparam);\
-    self->funcNAME(iparam));\
+    self->funcNAME(iparam);\
+	return 0;\
+}
+
+#define FUNC_SET_STR(prefix, getSelf, funcNAME) \
+static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
+{\
+    getSelf(v);\
+    const SQChar *str; sq_getstring(v, 2, &str);\
+    self->funcNAME(str);\
 	return 0;\
 	return 0;\
 }
 }
 
 
@@ -375,6 +393,7 @@ static SQInteger prefix##funcNAME(HSQUIRRELVM v) \
 	return 1;\
 	return 1;\
 }
 }
 
 
+#define FL_WIDGET_SET_STR(funcNAME) FUNC_SET_STR(_Fl_Widget_, SETUP_FL_WIDGET, funcNAME)
 #define FL_WIDGET_GETSET_STR(funcNAME) FUNC_GETSET_STR(_Fl_Widget_, SETUP_FL_WIDGET, self->, funcNAME)
 #define FL_WIDGET_GETSET_STR(funcNAME) FUNC_GETSET_STR(_Fl_Widget_, SETUP_FL_WIDGET, self->, funcNAME)
 
 
 #define FL_WIDGET_GETSET_INT0(funcNAME, typeNAME) FUNC_GETSET_INT(_Fl_Widget_, SETUP_FL_WIDGET, self->, funcNAME, typeNAME)
 #define FL_WIDGET_GETSET_INT0(funcNAME, typeNAME) FUNC_GETSET_INT(_Fl_Widget_, SETUP_FL_WIDGET, self->, funcNAME, typeNAME)
@@ -562,6 +581,7 @@ FL_WIDGET_GETSET_INT(argument);
 FL_WIDGET_GETSET_INT_CAST(box, Fl_Boxtype);
 FL_WIDGET_GETSET_INT_CAST(box, Fl_Boxtype);
 FL_WIDGET_GETSET_INT(color);
 FL_WIDGET_GETSET_INT(color);
 FL_WIDGET_GETSET_INT(selection_color);
 FL_WIDGET_GETSET_INT(selection_color);
+FL_WIDGET_SET_STR(copy_label);
 FL_WIDGET_GETSET_STR(label);
 FL_WIDGET_GETSET_STR(label);
 FL_WIDGET_GETSET_INT(labelcolor);
 FL_WIDGET_GETSET_INT(labelcolor);
 FL_WIDGET_GETSET_INT(labelfont);
 FL_WIDGET_GETSET_INT(labelfont);
@@ -670,6 +690,7 @@ static SQRegFunction fl_widget_obj_funcs[]={
 	_DECL_FUNC(callback,-1,_SC("xc."), SQFalse),
 	_DECL_FUNC(callback,-1,_SC("xc."), SQFalse),
 	_DECL_FUNC(color,-1,_SC("xi"), SQFalse),
 	_DECL_FUNC(color,-1,_SC("xi"), SQFalse),
 	_DECL_FUNC(selection_color,-1,_SC("xi"), SQFalse),
 	_DECL_FUNC(selection_color,-1,_SC("xi"), SQFalse),
+	_DECL_FUNC(copy_label,2,_SC("xs"), SQFalse),
 	_DECL_FUNC(label,-1,_SC("x s|o"), SQFalse),
 	_DECL_FUNC(label,-1,_SC("x s|o"), SQFalse),
 	_DECL_FUNC(labelcolor,-1,_SC("xi"), SQFalse),
 	_DECL_FUNC(labelcolor,-1,_SC("xi"), SQFalse),
 	_DECL_FUNC(labelfont,-1,_SC("xi"), SQFalse),
 	_DECL_FUNC(labelfont,-1,_SC("xi"), SQFalse),
@@ -1930,12 +1951,26 @@ static SQInteger _Flv_Data_Table_draw_offset(HSQUIRRELVM v)
     return 1;
     return 1;
 }
 }
 
 
+static SQInteger _Flv_Data_Table_for_print(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS(v);
+    SETUP_FLV_DATA_TABLE(v);
+    if(_top_ > 1){
+        SQ_GET_BOOL(v, 2, bval);
+        ((Flv_Data_Table*)self)->_forPrint = bval;
+        return 0;
+    }
+    sq_pushbool(v, ((Flv_Data_Table*)self)->_forPrint);
+    return 1;
+}
+
 FLTK_CONSTRUCTOR(Flv_Data_Table);
 FLTK_CONSTRUCTOR(Flv_Data_Table);
 
 
 #define _DECL_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_Flv_Data_Table_##name,nparams,pmask,isStatic}
 #define _DECL_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_Flv_Data_Table_##name,nparams,pmask,isStatic}
 static SQRegFunction flv_data_table_obj_funcs[]={
 static SQRegFunction flv_data_table_obj_funcs[]={
 	_DECL_FUNC(constructor,-5,FLTK_constructor_Mask, SQFalse),
 	_DECL_FUNC(constructor,-5,FLTK_constructor_Mask, SQFalse),
 	_DECL_FUNC(handle,2,_SC("xi"),SQFalse),
 	_DECL_FUNC(handle,2,_SC("xi"),SQFalse),
+	_DECL_FUNC(for_print,-1,_SC("xb"),SQFalse),
 	_DECL_FUNC(resize,5,_SC("xnnnn"),SQFalse),
 	_DECL_FUNC(resize,5,_SC("xnnnn"),SQFalse),
 	_DECL_FUNC(draw_offset, -1,_SC("xn"),SQFalse),
 	_DECL_FUNC(draw_offset, -1,_SC("xn"),SQFalse),
 	{0,0}
 	{0,0}
@@ -2422,8 +2457,202 @@ static SQRegFunction fl_double_window_obj_funcs[]={
 	_DECL_FUNC(constructor,-3,_SC("xii"),SQFalse),
 	_DECL_FUNC(constructor,-3,_SC("xii"),SQFalse),
 	{0,0}
 	{0,0}
 };
 };
+#undef _DECL_FUNC
+
+#define SETUP_FL_DEVICE(v) SETUP_FL_KLASS(v, Fl_Device)
+static SQRESULT _Fl_Device_class_name(HSQUIRRELVM v)
+{
+    SETUP_FL_DEVICE(v);
+    sq_pushstring(v, self->class_name(), -1);
+	return 1;
+}
+
+#define _DECL_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_Fl_Device_##name,nparams,pmask,isStatic}
+static SQRegFunction fl_device_obj_funcs[]={
+	_DECL_FUNC(class_name,1,_SC("x"),SQFalse),
+	{0,0}
+};
+#undef _DECL_FUNC
+
+#define SETUP_FL_SURFACE_DEVICE(v) SETUP_FL_KLASS(v, Fl_Surface_Device)
+static SQRESULT _Fl_Surface_Device_set_current(HSQUIRRELVM v)
+{
+    SETUP_FL_SURFACE_DEVICE(v);
+    self->set_current();
+	return 0;
+}
+
+#define _DECL_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_Fl_Surface_Device_##name,nparams,pmask,isStatic}
+static SQRegFunction fl_surface_device_obj_funcs[]={
+	_DECL_FUNC(set_current,1,_SC("x"),SQFalse),
+	{0,0}
+};
+#undef _DECL_FUNC
+
+#define SETUP_FL_PAGED_DEVICE(v) SETUP_FL_KLASS(v, Fl_Paged_Device)
+//int start_job(int pagecount, int *frompage = NULL, int *topage = NULL);
+static SQRESULT _Fl_Paged_Device_start_job(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS(v);
+    SETUP_FL_PAGED_DEVICE(v);
+    SQ_GET_INTEGER(v, 2, pagecount);
+    if(_top_ > 1) SQ_CHECK_TABLE(v, 3);
+    int frompage, topage;
+    sq_pushinteger(v, self->start_job(pagecount, &frompage, &topage));
+    if(_top_ > 1){
+        sq_pushstring(v, _SC("frompage"), -1);
+        sq_pushinteger(v, frompage);
+        sq_rawset(v, 3);
+        sq_pushstring(v, _SC("topage"), -1);
+        sq_pushinteger(v, topage);
+        sq_rawset(v, 3);
+    }
+    return 1;
+}
+
+static SQRESULT _Fl_Paged_Device_end_job(HSQUIRRELVM v)
+{
+    SETUP_FL_PAGED_DEVICE(v);
+    self->end_job();
+	return 0;
+}
+
+static SQRESULT _Fl_Paged_Device_start_page(HSQUIRRELVM v)
+{
+    SETUP_FL_PAGED_DEVICE(v);
+    sq_pushinteger(v, self->start_page());
+	return 1;
+}
+
+static SQRESULT _Fl_Paged_Device_end_page(HSQUIRRELVM v)
+{
+    SETUP_FL_PAGED_DEVICE(v);
+    sq_pushinteger(v, self->end_page());
+	return 1;
+}
+
+static SQRESULT _Fl_Paged_Device_origin(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    SETUP_FL_PAGED_DEVICE(v);
+    SQ_GET_INTEGER(v, 2, x);
+    SQ_GET_INTEGER(v, 3, y);
+    self->origin(x, y);
+	return 0;
+}
+
+static SQRESULT _Fl_Paged_Device_print_widget(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS(v);
+    SETUP_FL_PAGED_DEVICE(v);
+    SETUP_FL_WIDGET_AT(v, 2, wdg);
+    SQ_OPT_INTEGER(v, 3, delta_x, 0);
+    SQ_OPT_INTEGER(v, 4, delta_y, 0);
+    self->print_widget(wdg, delta_x, delta_y);
+	return 0;
+}
+
+#define _DECL_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_Fl_Paged_Device_##name,nparams,pmask,isStatic}
+static SQRegFunction fl_paged_device_obj_funcs[]={
+	_DECL_FUNC(start_job,-2,_SC("xt"),SQFalse),
+	_DECL_FUNC(end_job,1,_SC("x"),SQFalse),
+	_DECL_FUNC(start_page,1,_SC("x"),SQFalse),
+	_DECL_FUNC(end_page,1,_SC("x"),SQFalse),
+	_DECL_FUNC(origin,3,_SC("xii"),SQFalse),
+	_DECL_FUNC(print_widget,-2,_SC("xxii"),SQFalse),
+	{0,0}
+};
 #undef _DECL_FUNC
 #undef _DECL_FUNC
 
 
+#define SETUP_FL_PDF_FILE_DEVICE(v) SETUP_FL_KLASS(v, Fl_Pdf_File_Device)
+
+static SQInteger _Fl_Pdf_File_Device_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
+{
+	Fl_Pdf_File_Device *self = ((Fl_Pdf_File_Device *)p);
+	delete self;
+	return 0;
+}
+
+static SQInteger _Fl_Pdf_File_Device_constructor(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    SETUP_FL_PDF_FILE_DEVICE(v);
+	self = new Fl_Pdf_File_Device();
+    sq_setinstanceup(v, 1, self);
+    sq_setreleasehook(v,1, _Fl_Pdf_File_Device_releasehook);
+	return 1;
+}
+
+static SQRESULT _Fl_Pdf_File_Device_compress(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    SETUP_FL_PDF_FILE_DEVICE(v);
+    SQ_GET_BOOL(v, 2, bval);
+    self->compress(bval);
+    return 0;
+}
+
+//int start_job(const char *pdf_filename, int pagecount,
+//        enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4,
+//		enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT);
+static SQRESULT _Fl_Pdf_File_Device_start_job(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS(v);
+    SETUP_FL_PDF_FILE_DEVICE(v);
+    if(sq_gettype(v, 2) == OT_STRING){
+        SQ_GET_STRING(v, 2, pdf_filename);
+        SQ_GET_INTEGER(v, 3, pagecount);
+        SQ_OPT_INTEGER(v, 4, format, Fl_Paged_Device::A4);
+        SQ_OPT_INTEGER(v, 5, layout, Fl_Paged_Device::PORTRAIT);
+        sq_pushinteger(v, self->start_job(pdf_filename, pagecount,
+                                          (Fl_Paged_Device::Page_Format)format,
+                                          (Fl_Paged_Device::Page_Layout)layout));
+    }
+    else
+    {
+        SQ_GET_INTEGER(v, 2, pagecount);
+        SQ_OPT_INTEGER(v, 3, format, Fl_Paged_Device::A4);
+        SQ_OPT_INTEGER(v, 4, layout, Fl_Paged_Device::PORTRAIT);
+        sq_pushinteger(v, self->start_job(pagecount,
+                                          (Fl_Paged_Device::Page_Format)format,
+                                          (Fl_Paged_Device::Page_Layout)layout));
+    }
+    return 1;
+}
+
+
+#define _DECL_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_Fl_Pdf_File_Device_##name,nparams,pmask,isStatic}
+static SQRegFunction fl_pdf_file_device_obj_funcs[]={
+	_DECL_FUNC(constructor,1,_SC("x"),SQFalse),
+	_DECL_FUNC(compress,2,_SC("xb"),SQFalse),
+	_DECL_FUNC(start_job,-2,_SC("x s|i iii"),SQFalse),
+	{0,0}
+};
+#undef _DECL_FUNC
+
+#define SETUP_FL_POSTSCRIPT_FILE_DEVICE(v) SETUP_FL_KLASS(v, Fl_PostScript_File_Device)
+static SQRESULT _Fl_PostScript_File_Device_file_chooser_title(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS(v);
+    if(_top_ > 1){
+        SQ_GET_STRING(v, 2, str);
+        Fl_PostScript_File_Device::file_chooser_title = str; //memory leak here !!!!!
+        return 0;
+    }
+    if(Fl_PostScript_File_Device::file_chooser_title)
+        sq_pushstring(v, Fl_PostScript_File_Device::file_chooser_title, -1);
+    else sq_pushnull(v);
+    return 1;
+}
+
+#define _DECL_FUNC(name,nparams,pmask,isStatic) {_SC(#name),_Fl_PostScript_File_Device_##name,nparams,pmask,isStatic}
+static SQRegFunction fl_postscript_file_device_obj_funcs[]={
+	_DECL_FUNC(file_chooser_title,-1,_SC("ys"),SQTrue),
+	{0,0}
+};
+#undef _DECL_FUNC
+
+
 static SQChar Fl_File_Chooser_TAG[] = _SC("Fl_File_Chooser");
 static SQChar Fl_File_Chooser_TAG[] = _SC("Fl_File_Chooser");
 
 
 static SQInteger _Fl_File_Chooser_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
 static SQInteger _Fl_File_Chooser_releasehook(SQUserPointer p, SQInteger size, HSQUIRRELVM v)
@@ -2939,10 +3168,6 @@ static SQInteger _fl_globals_fl_loop(HSQUIRRELVM v)
     return 0;
     return 0;
 }
 }
 
 
-#define SQ_CHECK_TYPE(v, idx, tp) if(sq_gettype(v, idx) != OT_##tp) return sq_throwerror(v, _SC( #tp " expected for parameter (%d)"), idx-1);
-#define SQ_CHECK_ARRAY(v, idx) SQ_CHECK_TYPE(v, idx, ARRAY)
-#define SQ_CHECK_TABLE(v, idx) SQ_CHECK_TYPE(v, idx, TABLE)
-
 //void fl_measure(const char* str, int& x, int& y, int draw_symbols = 1);
 //void fl_measure(const char* str, int& x, int& y, int draw_symbols = 1);
 static SQInteger _fl_globals_fl_measure(HSQUIRRELVM v)
 static SQInteger _fl_globals_fl_measure(HSQUIRRELVM v)
 {
 {
@@ -2961,6 +3186,15 @@ static SQInteger _fl_globals_fl_measure(HSQUIRRELVM v)
     return 0;
     return 0;
 }
 }
 
 
+static SQInteger _fl_globals_fl_point(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    SQ_GET_INTEGER(v, 2, x);
+    SQ_GET_INTEGER(v, 3, y);
+    fl_point(x, y);
+    return 0;
+}
+
 //void fl_polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3)
 //void fl_polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3)
 static SQInteger _fl_globals_fl_polygon(HSQUIRRELVM v)
 static SQInteger _fl_globals_fl_polygon(HSQUIRRELVM v)
 {
 {
@@ -2978,7 +3212,43 @@ static SQInteger _fl_globals_fl_polygon(HSQUIRRELVM v)
     }
     }
     else fl_polygon(x, y, x1, y1, x2, y2);
     else fl_polygon(x, y, x1, y1, x2, y2);
     return 0;
     return 0;
-}
+}
+
+//void fl_push_clip(int x, int y, int w, int h)
+static SQInteger _fl_globals_fl_push_clip(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    SQ_GET_INTEGER(v, 2, x);
+    SQ_GET_INTEGER(v, 3, y);
+    SQ_GET_INTEGER(v, 4, w);
+    SQ_GET_INTEGER(v, 5, h);
+    fl_push_clip(x, y, w, h);
+    return 0;
+}
+
+static SQInteger _fl_globals_fl_push_no_clip(HSQUIRRELVM v)
+{
+    fl_push_no_clip();
+    return 0;
+}
+
+static SQInteger _fl_globals_fl_pop_clip(HSQUIRRELVM v)
+{
+    fl_pop_clip();
+    return 0;
+}
+
+//int fl_not_clipped(int x, int y, int w, int h)
+static SQInteger _fl_globals_fl_not_clipped(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    SQ_GET_INTEGER(v, 2, x);
+    SQ_GET_INTEGER(v, 3, y);
+    SQ_GET_INTEGER(v, 4, w);
+    SQ_GET_INTEGER(v, 5, h);
+    sq_pushbool(v, fl_not_clipped(x, y, w, h));
+    return 1;
+}
 
 
 static SQInteger _fl_globals_fl_preferences(HSQUIRRELVM v)
 static SQInteger _fl_globals_fl_preferences(HSQUIRRELVM v)
 {
 {
@@ -3005,9 +3275,14 @@ static SQRegFunction fl_globals_funcs[]={
 	_DECL_FUNC(fl_line_style,-2,_SC(".ii s|o"),SQTrue),
 	_DECL_FUNC(fl_line_style,-2,_SC(".ii s|o"),SQTrue),
 	_DECL_FUNC(fl_loop,-7,_SC(".nnnnnnnn"),SQTrue),
 	_DECL_FUNC(fl_loop,-7,_SC(".nnnnnnnn"),SQTrue),
 	_DECL_FUNC(fl_measure,-3,_SC(".stb"),SQTrue),
 	_DECL_FUNC(fl_measure,-3,_SC(".stb"),SQTrue),
+	_DECL_FUNC(fl_not_clipped,5,_SC(".nnnn"),SQTrue),
+	_DECL_FUNC(fl_point,3,_SC(".nn"),SQTrue),
 	_DECL_FUNC(fl_polygon,-7,_SC(".nnnnnnnn"),SQTrue),
 	_DECL_FUNC(fl_polygon,-7,_SC(".nnnnnnnn"),SQTrue),
-	_DECL_FUNC(fl_rect,-5,_SC(".nnnn"),SQTrue),
-	_DECL_FUNC(fl_rectf,-5,_SC(".nnnn"),SQTrue),
+	_DECL_FUNC(fl_pop_clip,1,_SC("."),SQTrue),
+	_DECL_FUNC(fl_push_clip,5,_SC(".nnnn"),SQTrue),
+	_DECL_FUNC(fl_push_no_clip,1,_SC("."),SQTrue),
+	_DECL_FUNC(fl_rect,-5,_SC(".nnnni"),SQTrue),
+	_DECL_FUNC(fl_rectf,-5,_SC(".nnnni"),SQTrue),
 	_DECL_FUNC(fl_preferences,4,_SC(".iss"),SQTrue),
 	_DECL_FUNC(fl_preferences,4,_SC(".iss"),SQTrue),
 
 
 	{0,0}
 	{0,0}
@@ -3292,6 +3567,46 @@ static const struct {
     INT_CONST(FL_DND_RELEASE)
     INT_CONST(FL_DND_RELEASE)
     INT_CONST(FL_SCREEN_CONFIGURATION_CHANGED)
     INT_CONST(FL_SCREEN_CONFIGURATION_CHANGED)
     INT_CONST(FL_FULLSCREEN)
     INT_CONST(FL_FULLSCREEN)
+
+#define INT_PAGE_FORMAT_CONST(nm) { "PAGE_FORMAT_" #nm, Fl_Paged_Device::nm },
+    INT_PAGE_FORMAT_CONST(A0)
+    INT_PAGE_FORMAT_CONST(A1)
+    INT_PAGE_FORMAT_CONST(A2)
+    INT_PAGE_FORMAT_CONST(A3)
+    INT_PAGE_FORMAT_CONST(A4)
+    INT_PAGE_FORMAT_CONST(A5)
+    INT_PAGE_FORMAT_CONST(A6)
+    INT_PAGE_FORMAT_CONST(A7)
+    INT_PAGE_FORMAT_CONST(A8)
+    INT_PAGE_FORMAT_CONST(A9)
+    INT_PAGE_FORMAT_CONST(B0)
+    INT_PAGE_FORMAT_CONST(B1)
+    INT_PAGE_FORMAT_CONST(B2)
+    INT_PAGE_FORMAT_CONST(B3)
+    INT_PAGE_FORMAT_CONST(B4)
+    INT_PAGE_FORMAT_CONST(B5)
+    INT_PAGE_FORMAT_CONST(B6)
+    INT_PAGE_FORMAT_CONST(B7)
+    INT_PAGE_FORMAT_CONST(B8)
+    INT_PAGE_FORMAT_CONST(B9)
+    INT_PAGE_FORMAT_CONST(B10)
+    INT_PAGE_FORMAT_CONST(C5E)
+    INT_PAGE_FORMAT_CONST(DLE)
+    INT_PAGE_FORMAT_CONST(EXECUTIVE)
+    INT_PAGE_FORMAT_CONST(FOLIO)
+    INT_PAGE_FORMAT_CONST(LEDGER)
+    INT_PAGE_FORMAT_CONST(LEGAL)
+    INT_PAGE_FORMAT_CONST(LETTER)
+    INT_PAGE_FORMAT_CONST(TABLOID)
+    INT_PAGE_FORMAT_CONST(ENVELOPE)
+    INT_PAGE_FORMAT_CONST(MEDIA)
+
+#define INT_PAGE_LAYOUT_CONST(nm) { "PAGE_LAYOUT_" #nm, Fl_Paged_Device::nm },
+    INT_PAGE_LAYOUT_CONST(PORTRAIT)
+    INT_PAGE_LAYOUT_CONST(LANDSCAPE)
+    INT_PAGE_LAYOUT_CONST(REVERSED)
+    INT_PAGE_LAYOUT_CONST(ORIENTATION)
+
     /* terminator */
     /* terminator */
     { NULL, 0 }
     { NULL, 0 }
 };
 };
@@ -3411,6 +3726,12 @@ SQRESULT sqext_register_fltklib(HSQUIRRELVM v)
     sq_pushnewclass(v, Fl_JPEG_Image_TAG, Fl_RGB_Image_TAG, (void*)Fl_JPEG_Image_TAG, fl_jpeg_image_obj_funcs, SQFalse);
     sq_pushnewclass(v, Fl_JPEG_Image_TAG, Fl_RGB_Image_TAG, (void*)Fl_JPEG_Image_TAG, fl_jpeg_image_obj_funcs, SQFalse);
     sq_pushnewclass(v, Fl_PNG_Image_TAG, Fl_RGB_Image_TAG, (void*)Fl_PNG_Image_TAG, fl_png_image_obj_funcs, SQFalse);
     sq_pushnewclass(v, Fl_PNG_Image_TAG, Fl_RGB_Image_TAG, (void*)Fl_PNG_Image_TAG, fl_png_image_obj_funcs, SQFalse);
 
 
+    sq_pushnewclass(v, FLTK_TAG(Fl_Device), NULL, (void*)FLTK_TAG(Fl_Device), fl_device_obj_funcs, SQFalse);
+    sq_pushnewclass(v, FLTK_TAG(Fl_Surface_Device), FLTK_TAG(Fl_Device), (void*)FLTK_TAG(Fl_Surface_Device), fl_surface_device_obj_funcs, SQFalse);
+    sq_pushnewclass(v, FLTK_TAG(Fl_Paged_Device), FLTK_TAG(Fl_Surface_Device), (void*)FLTK_TAG(Fl_Paged_Device), fl_paged_device_obj_funcs, SQFalse);
+    sq_pushnewclass(v, FLTK_TAG(Fl_Pdf_File_Device), FLTK_TAG(Fl_Paged_Device), (void*)FLTK_TAG(Fl_Pdf_File_Device), fl_pdf_file_device_obj_funcs, SQFalse);
+    sq_pushnewclass(v, FLTK_TAG(Fl_PostScript_File_Device), FLTK_TAG(Fl_Paged_Device), (void*)FLTK_TAG(Fl_PostScript_File_Device), fl_postscript_file_device_obj_funcs, SQFalse);
+
     sq_pushconsttable(v);
     sq_pushconsttable(v);
     INT_CONST_PREFIX_VALUE(, FL_SHADOW_LABEL, FL_SHADOW_LABEL);
     INT_CONST_PREFIX_VALUE(, FL_SHADOW_LABEL, FL_SHADOW_LABEL);
     /* add constants to global table */
     /* add constants to global table */

+ 4 - 0
include/squirrel.h

@@ -609,6 +609,10 @@ SQUIRREL_API void sq_getlaststackinfo(HSQUIRRELVM v);
     SQUserPointer var;\
     SQUserPointer var;\
     if((_rc_ = sq_getuserpointer(v,idx, &var)) < 0) return _rc_;
     if((_rc_ = sq_getuserpointer(v,idx, &var)) < 0) return _rc_;
 
 
+#define SQ_CHECK_TYPE(v, idx, tp) if(sq_gettype(v, idx) != OT_##tp) return sq_throwerror(v, _SC( #tp " expected for parameter (%d)"), idx-1);
+#define SQ_CHECK_ARRAY(v, idx) SQ_CHECK_TYPE(v, idx, ARRAY)
+#define SQ_CHECK_TABLE(v, idx) SQ_CHECK_TYPE(v, idx, TABLE)
+
 #define SIZEOF_SQCHAR_STRING(str) ((sizeof(str)/sizeof(SQChar))-(1*sizeof(SQChar)))
 #define SIZEOF_SQCHAR_STRING(str) ((sizeof(str)/sizeof(SQChar))-(1*sizeof(SQChar)))
 
 
 
 

+ 3 - 3
ourbiz/base-report-A4.nut

@@ -7,8 +7,8 @@ class BaseReportA4 extends Fl_Window {
 	rpt_SubFooter=null;
 	rpt_SubFooter=null;
 	rpt_Footer=null;
 	rpt_Footer=null;
 	
 	
-constructor() {
-	base.constructor(10, 50, 420, 594, _tr("BaseReportA4"));
+constructor(px=10, py=50, pw=420, ph=594, lbl="BaseReportA4") {
+	base.constructor(px, py, pw, ph, _tr(lbl));
 begin();
 begin();
 { rpt_Logo = new Fl_Box(10, 5, 105, 35, _tr("Ourbiz"));
 { rpt_Logo = new Fl_Box(10, 5, 105, 35, _tr("Ourbiz"));
   rpt_Logo->labeltype(FL_SHADOW_LABEL);
   rpt_Logo->labeltype(FL_SHADOW_LABEL);
@@ -43,7 +43,7 @@ begin();
   Fl_Group.current()->resizable(rpt_Body);
   Fl_Group.current()->resizable(rpt_Body);
   o->has_scrollbar(FLVS_NONE);
   o->has_scrollbar(FLVS_NONE);
   o->feature_remove(FLVF_ROW_SELECT | FLVF_PERSIST_SELECT);
   o->feature_remove(FLVF_ROW_SELECT | FLVF_PERSIST_SELECT);
-  o->_forPrint = true;
+  o->for_print(true);
 } // Fl_Data_Table* rpt_Body
 } // Fl_Data_Table* rpt_Body
 { local o = new Fl_Box(10, 545, 405, 1, _tr("Line"));
 { local o = new Fl_Box(10, 545, 405, 1, _tr("Line"));
   o->box(FL_FLAT_BOX);
   o->box(FL_FLAT_BOX);

+ 2 - 2
ourbiz/fl-bar-chart.nut

@@ -313,7 +313,7 @@ class Fl_Bar_Chart extends Fl_Box {
 	}
 	}
 };
 };
 
 
-
+/*
 math.number_format_set_thousand_sep(".");
 math.number_format_set_thousand_sep(".");
 math.number_format_set_dec_point(",");
 math.number_format_set_dec_point(",");
 
 
@@ -361,4 +361,4 @@ mychart->bar_add("Dicember", rand_value());
 win->resizable(mychart);
 win->resizable(mychart);
 win->show_main();
 win->show_main();
 Fl.run();
 Fl.run();
-
+*/

+ 67 - 3
ourbiz/ourbiz-fltk.nut

@@ -301,14 +301,12 @@ class EditWindow extends MyBaseWindow {
 enum Fl_Data_Table_Events {e_none, e_event, e_select, e_insert, e_update, e_delete};
 enum Fl_Data_Table_Events {e_none, e_event, e_select, e_insert, e_update, e_delete};
 
 
 class Fl_Data_Table extends Flv_Data_Table {
 class Fl_Data_Table extends Flv_Data_Table {
-	_forPrint = null;
 	_cols_info = null;
 	_cols_info = null;
 	_data = null;
 	_data = null;
 	_call_this = null;
 	_call_this = null;
 
 
 	constructor(px, py, pw, ph, pl=null){
 	constructor(px, py, pw, ph, pl=null){
 		base.constructor(px, py, pw, ph, pl);
 		base.constructor(px, py, pw, ph, pl);
-		_forPrint=false;
 		_cols_info = [];
 		_cols_info = [];
 		_data = [];
 		_data = [];
 	}
 	}
@@ -637,6 +635,69 @@ class OurSalesTax extends SalesTaxRatesEditWindow {
 	}
 	}
 }
 }
 
 
+function print_entities_list_contact_report()
+{
+	//SafeCursorWait cursor_wait;
+	fl_cursor(FL_CURSOR_WAIT);
+	local mydata = [];
+	appServer.entities_toprint_get_list(mydata);
+
+	local report = new BaseReportA4(0,0,420,594);
+	//report.resize(0,0, 546, 772);
+	report.resize(0,0, 546, 790);
+	//report.rpt_Body->_forPrint = true;
+	local lines_per_page = 56;
+
+	local _cols_info = [
+		"id|ID|6|R",
+		"name|Name|-1",
+		"contact|Contact|12",
+		"phone|Phone|12",
+	    ];
+	report.rpt_Body->set_cols(_cols_info);
+
+	local nrows = mydata.size();
+	local npages = nrows/lines_per_page;
+	if(nrows%lines_per_page) npages++; //check integer division truncation
+
+	local printer = Fl_Pdf_File_Device();
+	printer.compress(true);
+	local result = printer.start_job("entities-contact-list.pdf", 1);
+	local date = os.date("*t");
+	local bufSubTitle, bufSubFooter;
+
+	local rptData = report.rpt_Body->_data;
+	local iter1, iter2, iter0 = 0;
+	
+	local function array_assign(dest, src, start, end){
+		dest.clear();
+		dest.extend(src.slice(start, end));
+	}
+
+	for(local i=0; i< npages; ++i)
+	{
+	    local line_start = i*lines_per_page;
+	    local line_end = line_start + lines_per_page;
+	    iter1 = iter0 + line_start;
+	    iter2 = iter0 + (line_end > nrows ? nrows : line_end);
+	    array_assign(rptData, mydata, iter1, iter2);
+	    report.rpt_Body->recalc_data();
+
+	    report.rpt_Title->label(_tr("Entities List"));
+	    bufSubTitle = format("%s %.2d/%.2d/%d", _tr("Date"), date.day, date.month, date.year);
+	    report.rpt_SubTitle->label(bufSubTitle);
+
+	    bufSubFooter = format("%s %d / %d", _tr("Page"), i+1, npages);
+	    report.rpt_SubFooter->label(bufSubFooter);
+	    printer.start_page();
+	    printer.origin(30,25);
+	    printer.print_widget(report);
+	    printer.end_page();
+	}
+	printer.end_job();
+	fl_cursor(FL_CURSOR_DEFAULT);
+}
+
 class MyEditEntityWindow extends EditEntityWindow {
 class MyEditEntityWindow extends EditEntityWindow {
 	constructor(){
 	constructor(){
 		base.constructor();
 		base.constructor();
@@ -694,7 +755,10 @@ class EntitiesListSearch extends MyListSearchWindow {
 	function cb_btnInsert(sender, udata){
 	function cb_btnInsert(sender, udata){
 		local pr = sender.parent_root();
 		local pr = sender.parent_root();
 		local win = pr.showChildWindow("Entity Edit", EditEntitiesWindow);
 		local win = pr.showChildWindow("Entity Edit", EditEntitiesWindow);
-	}	
+	}
+	function cb_btnUpdate(sender, udata){
+		print_entities_list_contact_report();
+	}
 }
 }
 
 
 class MyEditProductWindow extends EditProductWindow {
 class MyEditProductWindow extends EditProductWindow {

+ 0 - 2
ourbiz/pdf-order.nut

@@ -36,8 +36,6 @@ class PDF_Order extends Sq_Fpdf
 		//SetCompression(false);
 		//SetCompression(false);
 	}
 	}
 
 
-	function _tr(str) {return str;}
-
 	function do_init()
 	function do_init()
 	{
 	{
 		secondColX = 107;
 		secondColX = 107;

+ 3 - 0
squilu.cbp

@@ -103,6 +103,7 @@
 					<Add directory="../zeromq-3.2.2/include" />
 					<Add directory="../zeromq-3.2.2/include" />
 					<Add directory="../dadbiz++/third-party/fltk" />
 					<Add directory="../dadbiz++/third-party/fltk" />
 					<Add directory="../dadbiz++/third-party/flu" />
 					<Add directory="../dadbiz++/third-party/flu" />
+					<Add directory="../dadbiz++/third-party/libharu/include" />
 				</Compiler>
 				</Compiler>
 				<Linker>
 				<Linker>
 					<Add option="-s" />
 					<Add option="-s" />
@@ -121,9 +122,11 @@
 					<Add library="Xft" />
 					<Add library="Xft" />
 					<Add library="Xinerama" />
 					<Add library="Xinerama" />
 					<Add library="mpdecimal" />
 					<Add library="mpdecimal" />
+					<Add library="hpdfs" />
 					<Add directory="../zeromq-3.2.2" />
 					<Add directory="../zeromq-3.2.2" />
 					<Add directory="../dadbiz++/third-party/fltk/lib" />
 					<Add directory="../dadbiz++/third-party/fltk/lib" />
 					<Add directory="../dadbiz++/third-party/flu" />
 					<Add directory="../dadbiz++/third-party/flu" />
+					<Add directory="../dadbiz++/third-party/libharu/src" />
 				</Linker>
 				</Linker>
 			</Target>
 			</Target>
 			<Target title="Debug FLTK">
 			<Target title="Debug FLTK">