hatch : create job settings from config hash, initial
authorBill Erickson <berick@esilibrary.com>
Tue, 22 Apr 2014 16:02:01 +0000 (12:02 -0400)
committerJeff Godin <jgodin@tadl.org>
Fri, 3 Jun 2016 20:38:47 +0000 (16:38 -0400)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
src/org/evergreen_ils/hatch/HatchWebSocketHandler.java
src/org/evergreen_ils/hatch/PrintManager.java

index 7e59b11..16ea901 100644 (file)
@@ -208,11 +208,8 @@ public class HatchWebSocketHandler {
         }
 
         if (action.equals("print-config")) {
-            // pass ourselves off to the print handler so it can reply
-            // for us after printing has completed.
-            String printer = (String) params.get("printer");
             reply(
-                new PrintManager().configurePrinter(printer),
+                new PrintManager().configurePrinter(params),
                 msgid
             );
             return;
index ded234a..ab1d2e4 100644 (file)
@@ -47,28 +47,135 @@ public class PrintManager {
 
     static final Logger logger = Log.getLogger("PrintManager");
 
-    public Attribute getAttribute(
-        PrintService service, Class attrClass, String name) {
+    public Map<String,Object> configurePrinter(Map<String,Object> params) {
+        Map<String,Object> config = (Map<String,Object>) params.get("config");
 
-        Attribute[] attrs = (Attribute[])
-            service.getSupportedAttributeValues(attrClass, null, null);
+        String name = (String) config.get("printer");
+        Printer printer = getPrinterByName(name);
 
-        for (Attribute a : attrs) {
-            if (a.toString().equals(name)) 
-                return a;
+        if (printer == null) {
+            logger.warn("No such printer: " + name);
+            return null;
         }
-        return null;
-    }
 
-    public Map<String,Object> configurePrinter(String name) {
-        Printer printer = getPrinterByName(name);
         PrinterJob job = PrinterJob.createPrinterJob(printer);
+
+        // apply any provided settings to the job
+        applySettingsToJob(config, job);
+
         job.showPrintDialog(null);
-        Map<String,Object> settings = printerSettingsToMap(job);
-        job.endJob();
+
+        // extract any modifications to the settings
+        Map<String,Object> settings = extractSettingsFromJob(job);
+
+        job.endJob(); // no printing needed
         return settings;
     }
 
+    // applies the settings in settings to the provided print job
+    protected void applySettingsToJob(
+            Map<String,Object> settings, PrinterJob job) {
+
+        JobSettings jobSettings = job.getJobSettings();
+
+        String collation = (String) settings.get("collation");
+        if (collation != null) 
+            jobSettings.setCollation(Collation.valueOf(collation));
+
+        if (settings.get("copies") != null) {
+            jobSettings.setCopies(
+                ((Long) settings.get("copies")).intValue()
+            );
+        }
+
+        // there does not appear to be any way to create a PaperSource
+        // directly from its name (via public method), so instead we
+        // manually find the matching paper source
+        if (settings.get("paperSource") != null) {
+            String sourceName = (String) settings.get("paperSource");
+
+            PrinterAttributes printerAttrs = 
+                job.getPrinter().getPrinterAttributes();
+
+            Set<PaperSource> paperSources = 
+                printerAttrs.getSupportedPaperSources();
+
+            // note: "Automatic" appears to be a virtual source,
+            // meaning no source.. meaning let the printer decide.
+            for (PaperSource source : paperSources) {
+                if (source.getName().equals(sourceName)) {
+                    logger.info("matched paper source for " + sourceName);
+                    jobSettings.setPaperSource(source);
+                    break;
+                }
+            }
+        }
+
+        /*
+        settings.put(
+            jobSettings.printColorProperty().getName(),
+            jobSettings.printColorProperty().getValue()
+        );
+        settings.put(
+            jobSettings.printQualityProperty().getName(),
+            jobSettings.printQualityProperty().getValue()
+        );
+        settings.put(
+            jobSettings.printSidesProperty().getName(),
+            jobSettings.printSidesProperty().getValue()
+        );
+
+        // nested properties...
+        
+        // page layout --------------
+        PageLayout layout = jobSettings.getPageLayout();
+        Map<String,Object> layoutMap = new HashMap<String,Object>();
+        layoutMap.put("bottomMargin", layout.getBottomMargin());
+        layoutMap.put("leftMargin", layout.getLeftMargin());
+        layoutMap.put("topMargin", layout.getTopMargin());
+        layoutMap.put("rightMargin", layout.getRightMargin());
+        layoutMap.put("pageOrientation", layout.getPageOrientation().toString());
+        layoutMap.put("printableHeight", layout.getPrintableHeight());
+        layoutMap.put("printableWidth", layout.getPrintableWidth());
+
+        Paper paper = layout.getPaper();
+        Map<String,Object> paperMap = new HashMap<String,Object>();
+        paperMap.put("height", paper.getHeight());
+        paperMap.put("width", paper.getWidth());
+        paperMap.put("name", paper.getName());
+        layoutMap.put("paper", paperMap);
+
+        settings.put("pageLayout", layoutMap);
+
+        // page ranges --------------
+        PageRange[] ranges = jobSettings.getPageRanges();
+        if (ranges != null) {
+            List<Map<String,Integer>> pageRanges = 
+                new LinkedList<Map<String,Integer>>();
+
+            for (PageRange range : ranges) {
+                Map<String,Integer> oneRange = new HashMap<String,Integer>();
+                oneRange.put("startPage", range.getStartPage());
+                oneRange.put("startPage", range.getEndPage());
+                pageRanges.add(oneRange);
+            }
+            settings.put("pageRanges", pageRanges);
+        }
+
+
+        // resolution --------------
+        PrintResolution resolution = jobSettings.getPrintResolution();
+        Map<String,Integer> resolutionMap = new HashMap<String,Integer>();
+        resolutionMap.put("feedResolution", resolution.getFeedResolution());
+        resolutionMap.put("crossFeedResolution", resolution.getCrossFeedResolution());
+        settings.put("printResolution", resolutionMap);
+
+        logger.info("compiled printer properties: " + settings.toString());
+        return settings;
+        */
+    };
+
+
     public void print(WebEngine engine, Map<String,Object>params) {
         
         //debugPrintService(null); // testing
@@ -114,7 +221,7 @@ public class PrintManager {
         job.getJobSettings().setPageLayout(firstLayout);
         if (!job.showPrintDialog(null)) return; // print canceled by user
 
-        Map<String,Object> settings = printerSettingsToMap(job);
+        Map<String,Object> settings = extractSettingsFromJob(job);
         engine.print(job);
         job.endJob();
 
@@ -124,7 +231,7 @@ public class PrintManager {
         socket.reply(settings, (String) params.get("msgid"));
     }
 
-    protected Map<String,Object> printerSettingsToMap(PrinterJob job) {
+    protected Map<String,Object> extractSettingsFromJob(PrinterJob job) {
         Map<String,Object> settings = new HashMap<String,Object>();
         JobSettings jobSettings = job.getJobSettings();
 
@@ -137,8 +244,8 @@ public class PrintManager {
             jobSettings.copiesProperty().getValue()
         );
         settings.put(
-            jobSettings.paperSourceProperty().getName(),
-            jobSettings.paperSourceProperty().getValue()
+            "paperSource", 
+            jobSettings.getPaperSource().getName()
         );
         settings.put(
             jobSettings.printColorProperty().getName(),