From f853c7875504f3cc1617ced98f3a50c97f1e981f Mon Sep 17 00:00:00 2001 From: Rejean Loyer Date: Fri, 15 Nov 2013 16:43:35 -0500 Subject: [PATCH] eda; report system; add paper format option. add custom paper size option. use report margins. --- ecere/src/gfx/drivers/Win32PrinterDisplayDriver.ec | 18 ++++ eda/libeda/src/ers.ec | 119 ++++++++++++++++----- 2 files changed, 110 insertions(+), 27 deletions(-) diff --git a/ecere/src/gfx/drivers/Win32PrinterDisplayDriver.ec b/ecere/src/gfx/drivers/Win32PrinterDisplayDriver.ec index 38f2f0e..c92c111 100644 --- a/ecere/src/gfx/drivers/Win32PrinterDisplayDriver.ec +++ b/ecere/src/gfx/drivers/Win32PrinterDisplayDriver.ec @@ -92,6 +92,8 @@ static PixelFormat GetColorFormat(int depth) return pixelFormat888; } +static define dpi = 100; +static define inchToMillimeter = 0.039370; class Win32PrinterDisplayDriver : DisplayDriver { class_property(name) = "Win32Printer"; @@ -256,7 +258,23 @@ class Win32PrinterDisplayDriver : DisplayDriver size = DocumentProperties(null, hPrinter, szDevice, null, null, 0); devMode = (DEVMODE *)new0 byte[size]; DocumentProperties(null, hPrinter, szDevice, devMode, null, DM_OUT_BUFFER); + devMode->dmFields |= DM_ORIENTATION | DM_PAPERSIZE; devMode->dmOrientation = (width > height) ? DMORIENT_LANDSCAPE : DMORIENT_PORTRAIT; + if(height == (int)(8.5*dpi) && width == 11*dpi) + devMode->dmPaperSize = DMPAPER_LETTER; + else if(height == (int)(8.5*dpi) && width == 14*dpi) + devMode->dmPaperSize = DMPAPER_LEGAL; + else if(height == 11*dpi && width == 17*dpi) + devMode->dmPaperSize = DMPAPER_11X17; + else + { + short w = (short)((double)width * 10 / dpi / inchToMillimeter); + short h = (short)((double)height * 10 / dpi / inchToMillimeter); + devMode->dmPaperSize = DMPAPER_USER; + devMode->dmFields |= DM_PAPERWIDTH | DM_PAPERLENGTH; + devMode->dmPaperLength = w > h ? w : h; + devMode->dmPaperWidth = w < h ? w : h; + } DocumentProperties(null, hPrinter, szDevice, devMode, devMode, DM_IN_BUFFER|DM_OUT_BUFFER); gdiSystem.hdc = CreateDC(szDriver, szDevice, szOutput, devMode); delete devMode; diff --git a/eda/libeda/src/ers.ec b/eda/libeda/src/ers.ec index 7486fd2..ab2ce39 100644 --- a/eda/libeda/src/ers.ec +++ b/eda/libeda/src/ers.ec @@ -5,6 +5,8 @@ define margin = 36; public enum Orientation { portrait, landscape }; +public enum PageFormat { custom, letter, legal, ledger }; + public enum RenderAction { addPage, closePage, levelStart, levelFinish, groupStart, groupFinish, actualRows }; static class PleaseWait : Window @@ -30,24 +32,48 @@ public class ReportTitle : Window Label { this, foreground = black, anchor = { top = 4 }, labeledWindow = this }; } +static define dpi = 100; class PreviewPage : Window { background = dimGray; - //size = { 850 + shadowS + pgs * 2, 1100 + shadowS + pgs * 2 }; - public property Orientation orientation + public property Page page { set { - if(value == portrait) - size = { 850 + shadowS + pgs * 2, 1100 + shadowS + pgs * 2 }; - else if(value == landscape) - size = { 1100 + shadowS + pgs * 2, 850 + shadowS + pgs * 2 }; - orientation = value; + page = value; + if(page && page.report) + { + switch(page.report.pageFormat) + { + case letter: + if(page.report.orientation == landscape) + size = { 11*dpi + shadowS + pgs * 2, 8.5*dpi + shadowS + pgs * 2 }; + else + size = { 8.5*dpi + shadowS + pgs * 2, 11*dpi + shadowS + pgs * 2 }; + break; + case legal: + if(page.report.orientation == landscape) + size = { 14*dpi + shadowS + pgs * 2, 8.5*dpi + shadowS + pgs * 2 }; + else + size = { 8.5*dpi + shadowS + pgs * 2, 14*dpi + shadowS + pgs * 2 }; + break; + case ledger: + if(page.report.orientation == landscape) + size = { 17*dpi + shadowS + pgs * 2, 11*dpi + shadowS + pgs * 2 }; + else + size = { 11*dpi + shadowS + pgs * 2, 17*dpi + shadowS + pgs * 2 }; + break; + case custom: + if(page.report.orientation == landscape && page.report.pageSize.w > page.report.pageSize.h) + size = { page.report.pageSize.w + shadowS + pgs * 2, page.report.pageSize.h + shadowS + pgs * 2 }; + else + size = { page.report.pageSize.h + shadowS + pgs * 2, page.report.pageSize.w + shadowS + pgs * 2 }; + break; + } + } } } - Orientation orientation; - Page page; void OnRedraw(Surface surface) @@ -71,22 +97,18 @@ public class Page : Window background = white; public: - property Orientation orientation + property Report report { set { - if(value == portrait) - { - size = { 850, 1100 }; - inside.size = { 850, 1100 }; - } - else if(value == landscape) + report = value; + if(report) { - size = { 1100, 850 }; - inside.size = { 1100, 850 }; + size = report.pageSize; + inside.size = report.pageSize; } - orientation = value; } + get { return report; } } Window inside { this }; @@ -94,7 +116,7 @@ public: int headerHeight; private: - Orientation orientation; + Report report; } public class ReportRender @@ -156,13 +178,14 @@ public: ((GuiApplication)__thisModule.application).ProcessInput(true); pleaseWait.UpdateDisplay(); } - for(pageNumber = 1; true; pageNumber++) + for(pageNumber = 1; ; pageNumber++) { Detail lastDetail = null; - page = Page { orientation = report.orientation }; + page = Page { report = report }; destination.AddPage(page); inside = page.inside; - inside.anchor = report.insideMarginAnchor; + inside.anchor = Anchor { left = report.insideMarginAnchor.left.distance, top = report.insideMarginAnchor.top.distance, + right = report.insideMarginAnchor.right.distance, bottom = report.insideMarginAnchor.bottom.distance }; insideSize = inside.size.h; pageTop = 0; @@ -472,7 +495,7 @@ private: public class ReportDestination : Window { public: - Report report; + public property Report report { watchable set { report = value; } get { return report; } } virtual void EndPage(Page page) { @@ -483,6 +506,7 @@ public: virtual void AddPage(Page page); virtual Report GetReport() { return null; } private: + Report report; int pageCount; List pages { }; @@ -502,6 +526,11 @@ public class PrintedReport : ReportDestination return ReportDestination::OnCreate(); } + watch(report) + { + size = report.pageSize; + } + void AddPage(Page page) { if(pageCount && display) @@ -537,8 +566,7 @@ public class ReportPreviewArea : ReportDestination void AddPage(Page page) { - PreviewPage previewPage { this, this, page = page, orientation = page.orientation, - anchor = { top = pageCount * ((int)page.size.h + shadowS + pgs) } }; + PreviewPage previewPage { this, this, page = page, anchor = { top = pageCount * ((int)page.size.h + shadowS + pgs) } }; previewPage.Create(); page.anchor = { left = pgs, top = pgs, right = shadowS + pgs, bottom = shadowS + pgs}; page.master = previewPage; @@ -826,7 +854,10 @@ public: public class Report { public: - Orientation orientation; + public property Orientation orientation { set { orientation = value; UpdateSize(); } get { return orientation; } } + public property PageFormat pageFormat { set { pageFormat = value; UpdateSize(); } get { return pageFormat; } } + + Size pageSize; Anchor insideMarginAnchor; Array groupings { }; @@ -875,6 +906,40 @@ public: } } +private: + Orientation orientation; + PageFormat pageFormat; + + void UpdateSize() + { + switch(pageFormat) + { + case letter: + if(orientation == landscape) + pageSize = { 11*dpi, 8.5*dpi }; + else + pageSize = { 8.5*dpi, 11*dpi }; + break; + case legal: + if(orientation == landscape) + pageSize = { 14*dpi, 8.5*dpi }; + else + pageSize = { 8.5*dpi, 14*dpi }; + break; + case ledger: + if(orientation == landscape) + pageSize = { 17*dpi, 11*dpi }; + else + pageSize = { 11*dpi, 17*dpi }; + break; + } + } + + Report() + { + property::pageFormat = letter; + } + ~Report() { groupings.Free(); -- 1.8.3.1