eda; report system; add paper format option. add custom paper size option. use report...
authorRejean Loyer <redj@ecere.com>
Fri, 15 Nov 2013 21:43:35 +0000 (16:43 -0500)
committerRejean Loyer <redj@ecere.com>
Mon, 3 Feb 2014 18:21:23 +0000 (13:21 -0500)
ecere/src/gfx/drivers/Win32PrinterDisplayDriver.ec
eda/libeda/src/ers.ec

index 38f2f0e..c92c111 100644 (file)
@@ -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;
index 7486fd2..ab2ce39 100644 (file)
@@ -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<PreviewPage> 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<Grouping> 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();