/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package op.system; import op.tools.SYSTools; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; /** * @author tloehr */ public class PrinterForm { private String name, label; private String form, encoding; //private HashMap attributes; private HashMap<String, ArrayList> elemAttributes; private final int LINECOUNTER = 0; private final int CHARCOUNTER = 1; private final int LEFT = 1; private final int CENTER = 2; private final int RIGHT = 3; public PrinterForm(String name, String label, HashMap elemAttributes, String encoding) { this.name = name; this.label = label; this.elemAttributes = elemAttributes; this.encoding = encoding; } public String getLabel() { return label; } public String getName() { return name; } public void setFormtext(String form) { this.form = form; } public String getFormtext(HashMap attributes) { String myForm = form; // this.attributes = attributes; Iterator it = attributes.keySet().iterator(); // Diese Map behält die Übersicht, welche Elemente sich zur Zeit in welcher Zeile und bei welchem Zeichen befinden. //HashMap<String, Integer[]> multilines = new HashMap<String, Integer[]>(); while (it.hasNext()) { String providedAttribKey = it.next().toString(); if (elemAttributes.containsKey(providedAttribKey)) { int currentCharForThisElement = 0; // Für jede Zeile einer Multiline. Wenn keine Multiline, dann eben nur einmal. for (int line = 0; line < elemAttributes.get(providedAttribKey).size(); line++) { if (attributes.get(providedAttribKey) != null) { // Wert für den Einsatz im Formular. String replacement = attributes.get(providedAttribKey).toString(); // Parameter für das aktuelle Element HashMap<String, String> attribs = (HashMap) elemAttributes.get(providedAttribKey).get(line); // Defaults für die Parameter int fixedlength = 0; int maxlength = 0; boolean multiline = false; String fillchar = " "; boolean toUpper = false; boolean toLower = false; int pad = RIGHT; String dateformat = "dd.MM.yy"; if (attribs.containsKey("fixedlength")) { fixedlength = Integer.parseInt(attribs.get("fixedlength")); } if (attribs.containsKey("maxlength")) { maxlength = Integer.parseInt(attribs.get("maxlength")); } if (attribs.containsKey("multiline")) { multiline = attribs.get("multiline").equalsIgnoreCase("true"); } if (attribs.containsKey("fillchar")) { fillchar = attribs.get("fillchar"); } if (attribs.containsKey("toupper")) { toUpper = attribs.get("toupper").equalsIgnoreCase("true"); } if (attribs.containsKey("tolower")) { toLower = attribs.get("tolower").equalsIgnoreCase("true"); } if (attribs.containsKey("pad")) { if (attribs.get("pad").equalsIgnoreCase("left")) { pad = LEFT; } else if (attribs.get("pad").equalsIgnoreCase("center")) { pad = CENTER; } else { pad = RIGHT; } } if (attribs.containsKey("dateformat")) { dateformat = attribs.get("dateformat"); } if (attributes.get(providedAttribKey) instanceof Date) { SimpleDateFormat sdf = new SimpleDateFormat(dateformat); replacement = sdf.format((Date) attributes.get(providedAttribKey)); } if (maxlength > 0) { replacement = substring(replacement, currentCharForThisElement, currentCharForThisElement + maxlength); currentCharForThisElement += maxlength; } else { replacement = substring(replacement, currentCharForThisElement, replacement.length()); currentCharForThisElement += replacement.length(); } // Egal was vorher gerechnet wurde. Nur bei Multiline ist das interessant. if (!multiline) { currentCharForThisElement = 0; } if (fixedlength > 0) { if (pad == LEFT) { replacement = SYSTools.padL(replacement, fixedlength, fillchar); } else if (pad == CENTER) { replacement = SYSTools.padC(replacement, fixedlength, fillchar); } else { replacement = SYSTools.padR(replacement, fixedlength, fillchar); } } if (toUpper) { replacement = replacement.toUpperCase(); } if (toLower) { replacement = replacement.toLowerCase(); } // Hier wird ein Teil des Formulars ausgefüllt. Jeweils für ein Element und (wenn nötig) für eine weitere Zeile // So werden Stück für Stück alle Platzhalter gegen die Werte erstetzt. myForm = SYSTools.replace(myForm, "$" + providedAttribKey + (line + 1) + "$", replacement, false); } else { myForm = SYSTools.replace(myForm, "$" + providedAttribKey + (line + 1) + "$", "", false); } } } } return myForm; } /** * Bloss nicht vergessen zu dokumentieren. * * @param providedAttribKey * @return */ private String getBaseFormAttrib(String providedAttribKey) { String newAttrib = providedAttribKey; // Das hier findet auch Schlüssel, die bei Multilines gebraucht werden. // Dann stehen von den Namen jeweils die Zeilennummern davor. // z.B. 1:produkt.bezeichnung if (providedAttribKey.matches("[0-9]+:{1}.*")) { int divider = providedAttribKey.indexOf(":"); newAttrib = providedAttribKey.substring(divider); } return newAttrib; } /** * Mein eigener <i>substring</i>. Diese Version reagiert nicht mit einer Exception, wenn man * versucht substrings zu erhalten, die ganz oder teilweise außerhalb der Quell Strings liegen. * In diesem Fall wird einfach weniger oder gar nichts zurück gegeben. * * @param str Eingangs-String * @param begin Stelle, ab der Substring beginnen soll. * @param end Stelle, ab der Substring enden soll. * @return substring. ggf. gekürzt oder ganz leer. */ private String substring(String str, int begin, int end) { int stop = Math.min(end, str.length()); // Bereinigung bei Ende, das außerhalb des Strings liegt. String result = ""; if (begin < str.length()) { // Start liegt vor dem Ende des Strings. result = str.substring(begin, stop); } return result; } }