/* * OffenePflege * Copyright (C) 2006-2012 Torsten Löhr * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License V2 as published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; if not, write to * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA * www.offene-pflege.de * ------------------------ * Auf deutsch (freie Übersetzung. Rechtlich gilt die englische Version) * Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, * wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, gemäß Version 2 der Lizenz. * * Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird, aber * OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN * BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. * * Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht, * schreiben Sie an die Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA. * */ package op.tools; import com.jidesoft.swing.JideSplitPane; import com.sun.istack.internal.Nullable; import entity.files.SYSFilesTools; import entity.system.Users; import op.OPDE; import op.system.AppInfo; import op.threads.DisplayMessage; import org.jdesktop.core.animation.timing.Animator; import org.jdesktop.core.animation.timing.TimingSource; import org.jdesktop.core.animation.timing.TimingTargetAdapter; import org.jdesktop.core.animation.timing.interpolators.AccelerationInterpolator; import org.jdesktop.swing.animation.timing.sources.SwingTimerTimingSource; import org.joda.time.DateTime; import javax.swing.*; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import javax.swing.text.JTextComponent; import javax.swing.tree.DefaultMutableTreeNode; import java.awt.*; import java.awt.event.FocusEvent; import java.io.*; import java.lang.reflect.Array; import java.lang.reflect.Method; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.ParseException; import java.util.*; import java.util.List; import java.util.concurrent.TimeUnit; public class SYSTools { public static final int INDEX_LASTNAME = 0; public static final int INDEX_FIRSTNAME_FEMALE = 1; public static final int INDEX_FIRSTNAME_MALE = 2; public static final boolean LEFT_UPPER_SIDE = false; public static final boolean RIGHT_LOWER_SIDE = true; public static final boolean MUST_BE_POSITIVE = true; public static final int SPEED_NORMAL = 500; public static final int SPEED_SLOW = 700; // private static final Logger logger = Logger.getLogger(this.getClass()); public static ListCellRenderer getDefaultRenderer() { return (jList, o, i, isSelected, cellHasFocus) -> { String text; if (o == null) { text = SYSTools.xx("misc.commands.>>noselection<<"); } else { text = o.toString(); } return new DefaultListCellRenderer().getListCellRendererComponent(jList, text, i, isSelected, cellHasFocus); }; } public static String[] translate(String[] list) { String[] translated = new String[list.length]; int i = 0; for (String element : list) { translated[i] = xx(element); i++; } return translated; } public static void clear(Collection coll) { if (coll != null) { coll.clear(); } } public static void clear(Map map) { if (map != null) { map.clear(); } } public static Properties load(String text) { Properties props = new Properties(); try { StringReader reader = new StringReader(text); props.load(reader); reader.close(); } catch (IOException ex) { OPDE.fatal(ex); } return props; } public static void center(java.awt.Window w) { Dimension us = w.getSize(); Dimension them = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); int newX = (them.width - us.width) / 2; int newY = (them.height - us.height) / 2; w.setLocation(newX, newY); } // center public static void showTimeDifference(long begin) { if (!OPDE.isDebug()) return; final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); OPDE.debug(ste[2].toString() + ": " + (System.currentTimeMillis() - begin) + " ms"); } public static void handleIntegerFocusLost(FocusEvent evt, int min, int max, int def) { int myInt; try { myInt = Integer.parseInt(((JTextField) evt.getSource()).getText()); } catch (NumberFormatException ex) { OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("misc.msg.wrongentry"))); myInt = def; } if (myInt < min) { myInt = min; OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("misc.msg.entryTooSmall"))); } if (myInt > max) { myInt = max; OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("misc.msg.entryTooBig"))); } ((JTextField) evt.getSource()).setText(Integer.toString(myInt)); } public static void handleBigDecimalFocusLost(FocusEvent evt, BigDecimal min, BigDecimal max, BigDecimal def) { BigDecimal myBD; // try { // myBD = NumberUtils.createBigDecimal(((JTextField) evt.getSource()).getText()); // myBD = new BigDecimal(); //BigDecimal.valueOf(Double.parseDouble(((JTextField) evt.getSource()).getText())); myBD = parseDecimal(((JTextField) evt.getSource()).getText()); if (myBD == null) myBD = def; // } catch (ParseException ex) { // OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("misc.msg.wrongentry"))); // myBD = def; // } if (myBD.compareTo(min) < 0) { myBD = min; OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("misc.msg.entryTooSmall"))); } if (myBD.compareTo(max) > 0) { myBD = max; OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("misc.msg.entryTooBig"))); } ((JTextField) evt.getSource()).setText(formatBigDecimal(myBD.setScale(2, RoundingMode.HALF_UP))); } // // public static BigDecimal parseBigDecimal(String in) throws ParseException { // DecimalFormat fmt = new DecimalFormat(); // fmt.setParseBigDecimal(true); // return (BigDecimal) fmt.parse(in); // } public static void centerOnParent(Component parent, Component child) { Dimension dimParent = parent.getSize(); Dimension dimChild = child.getSize(); //Dimension them = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); int newX = (dimParent.width - dimChild.width) / 2; int newY = (dimParent.height - dimChild.height) / 2; newX += parent.getX(); newY += parent.getY(); child.setLocation(newX, newY); } // public static void centerOnParent(Component comp) { // centerOnParent(comp.getParent(), comp); // } // // public static double roundScale2(double d) { // return Math.rint(d * 100) / 100.; // } // // public static String roundScale2(BigDecimal bd) { // return bd.setScale(2, BigDecimal.ROUND_HALF_EVEN).toPlainString(); // } /** * läuft rekursiv durch alle Kinder eines Containers und setzt deren Enabled Status auf * enabled. */ public static void setXEnabled(JComponent container, boolean enabled) { // Bei einer Combobox muss die Rekursion ebenfalls enden. // Sie besteht aus weiteren Unterkomponenten // "disabled" wird sie aber bereits hier. if (container.getComponentCount() == 0 || container instanceof JComboBox) { // Rekursionsanker container.setEnabled(enabled); } else { Component[] c = container.getComponents(); for (int i = 0; i < c.length; i++) { if (c[i] instanceof JComponent) { JComponent jc = (JComponent) c[i]; setXEnabled(jc, enabled); } } } } /** * läuft rekursiv durch alle Kinder eines Containers und entfernt evtl. vorhandene Listener. */ public static void unregisterListeners(JComponent container) { if (container == null) { return; } removeListeners(container); if (container.getComponentCount() > 0) { Component[] c = container.getComponents(); for (int i = 0; i < c.length; i++) { if (c[i] instanceof JComponent) { unregisterListeners((JComponent) c[i]); } } } } /** * läuft rekursiv durch alle Kinder eines JFrames und entfernt evtl. vorhandene Listener. */ public static void unregisterListeners(JDialog container) { if (container == null) { return; } if (container.getComponentCount() > 0) { Component[] c = container.getComponents(); for (int i = 0; i < c.length; i++) { if (c[i] instanceof JComponent) { unregisterListeners((JComponent) c[i]); } } } } /** * läuft rekursiv durch alle Kinder eines JFrames und entfernt evtl. vorhandene Listener. */ public static void unregisterListeners(JFrame container) { if (container == null) { return; } if (container.getComponentCount() > 0) { Component[] c = container.getComponents(); for (int i = 0; i < c.length; i++) { if (c[i] instanceof JComponent) { unregisterListeners((JComponent) c[i]); } } } } /** * Tauscht Zeichen in einem String in bester Textverarbeitungsmanier ;-)<br/> * <b>Beispiel:</b> replace("AABBCC", "BB", "DD") = "AADDCC" * * @param input - Eingang * @param find - Muster nach dem gesucht werden soll * @param replace - Ersatzzeichenkette * @param ignoreCase * @return String mit Ersetzung */ public static String replace(String input, String find, String replace, boolean ignoreCase) { int s = 0; int e = 0; String input_case_adjusted = ignoreCase ? input.toLowerCase() : input; String find_case_adjusted = ignoreCase ? find.toLowerCase() : find; StringBuffer result = new StringBuffer(); while ((e = input_case_adjusted.indexOf(find_case_adjusted, s)) >= 0) { result.append(input.substring(s, e)); result.append(replace); s = e + find_case_adjusted.length(); } result.append(input.substring(s)); return result.toString(); } /** * see: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4380536 * Puh, das hier ist aus der Sun Bug Datenbank. Etwas krude... Ich hoffe * die lassen sich mal was besseres einfallen. */ static private void removeListeners(Component comp) { Method[] methods = comp.getClass().getMethods(); for (int i = 0; i < methods.length; i++) { Method method = methods[i]; String name = method.getName(); if (name.startsWith("remove") && name.endsWith("Listener")) { Class[] params = method.getParameterTypes(); if (params.length == 1) { EventListener[] listeners = null; try { listeners = comp.getListeners(params[0]); } catch (Exception e) { // It is possible that someone could create a listener // that doesn't extend from EventListener. If so, // ignore it OPDE.debug("Listener " + params[0] + " does not extend EventListener"); continue; } for (int j = 0; j < listeners.length; j++) { try { method.invoke(comp, new Object[]{listeners[j]}); //OPDE.debug("removed Listener " + name + "for comp " + comp + "\n"); } catch (Exception e) { OPDE.debug("Cannot invoke removeListener method " + e); // Continue on. The reason for removing all listeners is to // make sure that we don't have a listener holding on to something // which will keep it from being garbage collected. We want to // continue freeing listeners to make sure we can free as much // memory has possible } } } else { // The only Listener method that I know of that has more // one argument is removePropertyChangeListener. If it is // something other than that, flag it and move on. if (!name.equals("removePropertyChangeListener")) { OPDE.debug(" Wrong number of Args " + name); } } } } } public static String anonymizeName(String in, int arrayindex) { String name = in; if (OPDE.isAnonym()) { String ersterBuchstabe = in.toLowerCase().substring(0, 1); int random = in.charAt(1) % 5; name = ((String[]) OPDE.anonymize[arrayindex].get(ersterBuchstabe))[random]; } return name; } public static String anonymizeRID(String in) { String rid = in; if (OPDE.isAnonym()) { Random rnd = new Random(System.currentTimeMillis()); char c1 = (char) (65 + rnd.nextInt(25)); char c2 = (char) (65 + rnd.nextInt(25)); rid = new String(new char[]{c1, c2}) + rnd.nextInt(9); } return rid; } public static String anonymizeString(String in) { String out = "[" + SYSTools.xx("misc.msg.anon") + "]"; if (!OPDE.isAnonym()) { out = in; } return out; } public static Date anonymizeDate(Date in) { Date result = in; if (OPDE.isAnonym()) { Random rnd = new Random(System.nanoTime()); DateTime dt = new DateTime(in); int factor = rnd.nextBoolean() ? -1 : 1; result = dt.plusDays(rnd.nextInt(300) * factor).plusYears(rnd.nextInt(5) * factor).toDate(); } return result; } public static String anonymizeUser(String name) { String result; if (OPDE.isAnonym()) { result = name.substring(0, 1) + "***"; } else { result = name; } return result; } public static void markAllTxt(JTextField jtf) { jtf.setSelectionStart(0); jtf.setSelectionEnd(jtf.getText().length()); } public static DefaultListModel list2dlm(List list) { DefaultListModel dlm = new DefaultListModel(); if (list != null) { for (Object o : list) { dlm.addElement(o); } } return dlm; } public static <T> DefaultComboBoxModel<T> list2cmb(List<T> list) { DefaultComboBoxModel cmb = new DefaultComboBoxModel<T>(); if (list != null) { for (T t : list) { cmb.addElement(t); } } return cmb; } public static String hashword(String password) { String hashword = null; try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(password.getBytes()); BigInteger hash = new BigInteger(1, md5.digest()); hashword = hash.toString(16); if (hashword.length() == 31) { hashword = "0" + hashword; } } catch (NoSuchAlgorithmException nsae) { // ignore } return hashword; } // Taken From: http://www.rgagnon.com/javadetails/java-0416.html public static byte[] createChecksum(File file) throws Exception { InputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; MessageDigest complete = MessageDigest.getInstance("MD5"); int numRead; do { numRead = fis.read(buffer); if (numRead > 0) { complete.update(buffer, 0, numRead); } } while (numRead != -1); fis.close(); return complete.digest(); } /** * Berechnet aus einer Datei die MD5 Signatur. * Teilweise auf http://rgagnon.com/javadetails/java-0596.html * * @param file * @return * @throws Exception */ public static String getMD5Checksum(File file) throws Exception { byte[] b = createChecksum(file); String result = ""; for (int i = 0; i < b.length; i++) { result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); } return result; } // /** // * Wählt in einer ComboBox aus ListElements das Element mit einem bestimmten String aus. // */ // public static void selectInComboBox(JComboBox j, String pattern, boolean useValue) { // ComboBoxModel cbm = (ComboBoxModel) j.getModel(); // for (int i = 0; i < cbm.getSize(); i++) { // ListElement le = (ListElement) cbm.getElementAt(i); // if (useValue) { // if (le.getValue().equalsIgnoreCase(pattern)) { // j.setSelectedIndex(i); // return; // } // } else { // if (le.getData().equalsIgnoreCase(pattern)) { // j.setSelectedIndex(i); // return; // } // // } // } // } public static void addAllNodes(DefaultMutableTreeNode root, java.util.List children) { if (children.size() > 0) { Iterator it = children.iterator(); while (it.hasNext()) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) it.next(); root.add(node); } } } public static String catchNull(Object in) { return catchNull(in, ""); } /** * Ermittelt die Zeichendarstellung eines Objekts (toString). Ist das Ergebnis null oder eine leere Zeichenkette, dann wird * der String neutral zurück gegeben. * * @param in * @param neutral * @return */ public static String catchNull(Object in, String neutral) { String result = neutral; if (in != null) { result = in.toString(); if (result.isEmpty()) { result = neutral; } result = xx(result); } return result; } public static String catchNull(String in) { return (in == null ? "" : xx(in.trim())); } /** * Gibt die toString Ausgabe eines Objektes zurück. Hierbei kann man sicher sein, dass man nicht über * ein <code>null</code> stolpert. * * @param in Eingangsobjekt * @param prefix Präfix, der vorangestellt wird, wenn das Objekt nicht null ist. * @param suffix Suffix, der angehangen wird, wenn das Objekt nicht null ist. * @return */ public static String catchNull(Object in, String prefix, String suffix) { String result = ""; if (!catchNull(in).isEmpty()) { result = prefix + catchNull(in) + suffix; } return result; } /** * Gibt eine einheitliche Titelzeile für alle Fenster zurück. */ public static String getWindowTitle(String moduleName) { if (!moduleName.isEmpty()) { moduleName = ", " + SYSTools.xx(moduleName); } return OPDE.getAppInfo().getProgname() + moduleName + ", v" + OPDE.getAppInfo().getVersion(); } public static void expandAll(JTree tree) { int row = 0; while (row < tree.getRowCount()) { tree.expandRow(row); row++; } } /** * taken from: http://www.torsten-horn.de/techdocs/java-net.htm#SimplePing * * @param sHost * @param sPort * @return */ public static String socketping(String sHost, String sPort) throws IOException { String result = null; InetAddress host = InetAddress.getByName(sHost); int port = !catchNull(sPort).isEmpty() ? Integer.parseInt(sPort) : 80; long tm = System.nanoTime(); Socket so = new Socket(); so.connect(new InetSocketAddress(host, port), 5000); so.close(); tm = (System.nanoTime() - tm) / 1000000L; result = "Connection ok (port " + port + ", time = " + tm + " ms). \n" + "Host Address = " + host.getHostAddress() + "\n" + "Host Name = " + host.getHostName(); return result; } // public static DefaultListModel cmb2lst(DefaultComboBoxModel dcbm) { // DefaultListModel dlm = new DefaultListModel(); // for (int i = 0; i < dcbm.getSize(); i++) { // dlm.addElement(dcbm.getElementAt(i)); // } // return dlm; // } // public static File[] chooseFile(Component parent, boolean multiselection) { // File[] result = null; // String cname = parent.getClass().getName(); // String startdir = System.getProperty("user.home"); // if (OPDE.getProps().containsKey("DIR." + cname)) { // startdir = OPDE.getProps().getProperty("DIR." + cname); // } // JFileChooser jfc = new JFileChooser(startdir); // jfc.setMultiSelectionEnabled(multiselection); // int response = jfc.showOpenDialog(parent); // if (response == JFileChooser.APPROVE_OPTION) { // if (multiselection) { // result = jfc.getSelectedFiles(); // } else { // result = new File[]{jfc.getSelectedFile()}; // } // // //String newPath = result[0].getAbsolutePath(); // String myPath = result[0].getParent(); // SYSPropsTools.storeProp("DIR." + cname, myPath, OPDE.getLogin().getUser()); // // } // return result; // } // public static String printDouble(double d) { // String dbl = Double.toString(d); // if (dbl.substring(dbl.length() - 2).equals(".0")) { // dbl = dbl.substring(0, dbl.length() - 2); // } else if (dbl.equals("0.5")) { // dbl = "½"; // } else if (dbl.equals("0.25")) { // dbl = "¼"; // } else if (dbl.equals("0.75")) { // dbl = "¾"; // } else if (dbl.equals("0.33")) { // dbl = "<sup>1</sup>/<sub>3</sub>"; // } // return dbl; // } // // public static String getAsHTML(BigDecimal bd) { // String dbl = bd.toPlainString(); // if (dbl.endsWith(".00")) { // dbl = dbl.substring(0, dbl.length() - 3); // } else if (dbl.equals("0.50")) { // dbl = "½"; // } else if (dbl.equals("0.25")) { // dbl = "¼"; // } else if (dbl.equals("0.75")) { // dbl = "¾"; // } else if (dbl.equals("0.33")) { // dbl = "<sup>1</sup>/<sub>3</sub>"; // } // return dbl; // } /** * Fügt html Tags vor und hinter den Eingangsstring ein. * * @param in Eingangsstring * @return String mit HTML Erweiterungen. */ public static String toHTML(String in) { String out = null; if (!catchNull(in).equals("")) { out = "<html>" + "<head>" + "<title>" + OPDE.getAppInfo().getProgname() + "</title>" + OPDE.getCSS() + "</head>" + "<body>" + xx(in) + "</body></html>"; } return htmlUmlautConversion(out); } public static String toHTMLForScreen(String in) { String out = null; if (!catchNull(in).isEmpty()) { out = "<html>" + xx(in) + "</html>"; } return htmlUmlautConversion(out); } public static String getHTMLSubstring(String in, int maximum) { if (in == null || in.isEmpty()) { return ""; } String htmlshort = in.replaceAll("\\<.*?\\>", " "); // Alle HTML Tags entfernen. int max = Math.min(maximum, htmlshort.length() - 1); // Nur die ersten 40 Zeichen zeigen... return htmlshort.substring(0, max) + (htmlshort.length() - 1 <= max ? "" : "..."); } /** * Einfache Funktion, die einen Text mit einer HTML Dokumentenstruktur umschließt * und dadurch auch den Titel des Browsers setzt. Auf Wunsch wird auch direkt * ein javascript hinzugefügt, dass die Browser Druckfunktion startet. * * @param in - Eingabetext * @param title - Browsertitel * @param print - Drucken ? * @return HTML Dokument */ public static String addHTMLTitle(String in, String title, boolean print) { String out = null; if (!catchNull(in).equals("")) { out = "<html><head><title>" + title + "</title>"; if (print) { out += "<script type=\"text/javascript\">" + "window.onload = function() {" + "window.print();" + "}</script>"; } out += "</head><body>" + in + "</body></html>"; } return out; } /** * removes any dangerous char or html stuff from a string. * * @param in * @return */ public static String tidy(String in) { if (in == null) { return null; } String result = in.replaceAll("\\<[^>]*>", ""); result = result.replaceAll("[\\>\\<]", ""); result = result.replaceAll("\\&.*\\;", ""); return result.trim(); } public static String escapeXML(String in) { String result = in; result = SYSTools.replace(result, "\"", """, false); result = SYSTools.replace(result, "<", "<", false); result = SYSTools.replace(result, ">", ">", false); result = SYSTools.replace(result, "&", "&", false); return result; } public static String unescapeXML(String in) { String result = in; result = SYSTools.replace(result, """, "\"", false); result = SYSTools.replace(result, "<", "<", false); result = SYSTools.replace(result, ">", ">", false); result = SYSTools.replace(result, "&", "&", false); return result; } /** * Tauscht in einem String alle Umlaute gegen den entsprechend HTML Tag aus. * * @param in String * @return geänderter String */ public static String htmlUmlautConversion(String in) { if (in == null) { return null; } String result = in; result = SYSTools.replace(result, "Ä", "Ä", false); result = SYSTools.replace(result, "ä", "ä", false); result = SYSTools.replace(result, "Ö", "Ö", false); result = SYSTools.replace(result, "ö", "ö", false); result = SYSTools.replace(result, "Ü", "Ü", false); result = SYSTools.replace(result, "ü", "ü", false); result = SYSTools.replace(result, "ß", "ß", false); result = SYSTools.replace(result, "°", "°", false); //° result = SYSTools.replace(result, "µ", "µ", false); //micro return result; } public static String removeTags(String input, String tag) { String result = input; result = SYSTools.replace(result, "<" + tag + ">", "", false); result = SYSTools.replace(result, "</" + tag + ">", "", false); return result; } /** * Habe ich von http://helpdesk.objects.com.au/java/how-can-i-merge-two-java-arrays-into-one-combined-array * * @param <T> * @param arrays * @return */ public static <T> T[] merge(T[]... arrays) { // Determine required size of new array int count = 0; for (T[] array : arrays) { count += array.length; } // create new array of required class T[] mergedArray = (T[]) Array.newInstance( arrays[0][0].getClass(), count); // Merge each array into new array int start = 0; for (T[] array : arrays) { System.arraycopy(array, 0, mergedArray, start, array.length); start += array.length; } return (T[]) mergedArray; } public static String anonymizeText(String nachname, String text) { String result = text; if (OPDE.isAnonym() && !catchNull(nachname).equals("")) { result = replace(text, nachname, "[anonym]", false); } return result; } public static String padL(String str, int size, String padChar) { StringBuilder padded = new StringBuilder(str); while (padded.length() < size) { padded.insert(0, padChar); } return padded.toString(); } public static String padC(String str, int size, String padChar) { StringBuilder padded = new StringBuilder(str); while (padded.length() < size) { padded.insert(0, padChar); // Dadurch sitzt das Ergebnis nicht unbedingt in der Mitte. Aber doch so mittig wie möglich. if (padded.length() < size) { padded.append(padChar); } } return padded.toString(); } public static String padR(String str, int size, String padChar) { StringBuilder padded = new StringBuilder(str); while (padded.length() < size) { padded.append(padChar); } return padded.toString(); } public static Color getTableCellBackgroundColor(boolean isSelected, int row) { Color color; Color selectionBackground = UIManager.getColor("Table.selectionBackground"); // Color selectionBackground = new Color(57,105,138); // Nimbus Background Selection Color Color alternate = UIManager.getColor("Table.alternateRowColor"); if (isSelected) { color = selectionBackground; } else { if (row % 2 == 0) { color = alternate; } else { color = Color.white; } } return color; } public static double showSide(JSplitPane split, boolean leftUpper) { return showSide(split, leftUpper, 0); } public static double showSide(JSplitPane split, boolean leftUpper, int speedInMillis) { double stop = leftUpper ? 0.0d : 1.0d; return showSide(split, stop, speedInMillis); } public static double showSide(JSplitPane split, Double pos) { return showSide(split, pos, 0); } /** * Setzt eine Split Pane (animiert oder nicht animiert) auf eine entsprechende Position (Prozentual zwischen 0 und 1) * * @param split * @param stop * @param speedInMillis * @return Die neue, relative Position (zwischen 0 und 1) */ public static double showSide(final JSplitPane split, final double stop, int speedInMillis) { if (OPDE.isAnimation() && speedInMillis > 0) { OPDE.debug("ShowSide double-version"); final double start = new Double(split.getDividerLocation()) / new Double(getDividerInAbsolutePosition(split, 1.0d)); final TimingSource ts = new SwingTimerTimingSource(); Animator.setDefaultTimingSource(ts); ts.init(); Animator animator = new Animator.Builder().setInterpolator(new AccelerationInterpolator(0.2, 0.2)).setDuration(speedInMillis, TimeUnit.MILLISECONDS).setRepeatCount(1).setStartDirection(Animator.Direction.FORWARD).addTarget(new TimingTargetAdapter() { double differenz = stop - start; @Override public void timingEvent(Animator animator, double fraction) { split.setDividerLocation(start + (differenz * fraction)); } }).build(); animator.start(); } else { SwingUtilities.invokeLater(() -> split.setDividerLocation(stop)); } return stop; } public static Integer getDividerInAbsolutePosition(JSplitPane mysplit, double pos) { int max; if (mysplit.getOrientation() == JSplitPane.HORIZONTAL_SPLIT) { max = mysplit.getWidth(); } else { max = mysplit.getHeight(); } return new Double(max * pos).intValue(); } public static Integer getDividerInAbsolutePosition(JideSplitPane mysplit, double pos) { int max; if (mysplit.getOrientation() == JSplitPane.HORIZONTAL_SPLIT) { max = mysplit.getWidth(); } else { max = mysplit.getHeight(); } return new Double(max * pos).intValue(); } public static Double getDividerInRelativePosition(JideSplitPane mysplit) { int max; int pos = mysplit.getDividerLocation(0); if (mysplit.getOrientation() == JSplitPane.HORIZONTAL_SPLIT) { max = mysplit.getWidth(); } else { max = mysplit.getHeight(); } OPDE.debug("DIVIDER IN ABSOLUTE POSITION: " + pos); OPDE.debug("DIVIDER MAX POSITION: " + max); OPDE.debug("DIVIDER IN RELATIVE POSITION: " + new Double(pos) / new Double(max)); return new Double(pos) / new Double(max); } public static Double getDividerInRelativePosition(JSplitPane mysplit) { int max; int pos = mysplit.getDividerLocation(); if (mysplit.getOrientation() == JSplitPane.HORIZONTAL_SPLIT) { max = mysplit.getWidth(); } else { max = mysplit.getHeight(); } OPDE.debug("DIVIDER IN ABSOLUTE POSITION: " + pos); OPDE.debug("DIVIDER MAX POSITION: " + max); OPDE.debug("DIVIDER IN RELATIVE POSITION: " + new Double(pos) / new Double(max)); return new Double(pos) / new Double(max); } // http://www.mkyong.com/java/how-to-detect-os-in-java-systemgetpropertyosname/ public static boolean isWindows() { String os = System.getProperty("os.name").toLowerCase(); //windows return (os.indexOf("win") >= 0); } // http://www.mkyong.com/java/how-to-detect-os-in-java-systemgetpropertyosname/ public static boolean isMac() { String os = System.getProperty("os.name").toLowerCase(); //Mac return (os.indexOf("mac") >= 0); } // http://www.mkyong.com/java/how-to-detect-os-in-java-systemgetpropertyosname/ public static boolean isUnix() { String os = System.getProperty("os.name").toLowerCase(); //linux or unix return (os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0); } public static String getThrowableAsHTML(Throwable exc) { String html = ""; StackTraceElement[] stacktrace = exc.getStackTrace(); html += SYSConst.html_h1("mail.errormail.attachment.line1"); html += SYSConst.html_h2(exc.getClass().getName()); html += SYSConst.html_paragraph(exc.getMessage()); if (OPDE.getMainframe().getCurrentResident() != null) { html += SYSConst.html_h3("ResID: " + OPDE.getMainframe().getCurrentResident().getRID()); } html += SYSConst.html_h3(OPDE.getMainframe().getCurrentVisiblePanel().getInternalClassID()); String table = SYSConst.html_table_th("mail.errormail.attachment.tab.col1") + SYSConst.html_table_th("mail.errormail.attachment.tab.col2") + SYSConst.html_table_th("mail.errormail.attachment.tab.col3") + SYSConst.html_table_th("mail.errormail.attachment.tab.col4"); for (int exception = 0; exception < stacktrace.length; exception++) { StackTraceElement element = stacktrace[exception]; table += SYSConst.html_table_tr( SYSConst.html_table_td(element.getMethodName()) + SYSConst.html_table_td(Integer.toString(element.getLineNumber())) + SYSConst.html_table_td(element.getClassName()) + SYSConst.html_table_td(element.getFileName()) ); } html += SYSConst.html_table(table, "1"); // Possible Cause if (exc.getCause() != null) { html += SYSConst.html_h3("Caused by: " + exc.getCause().getMessage()); StackTraceElement[] stacktrace1 = exc.getCause().getStackTrace(); String table1 = SYSConst.html_table_th("mail.errormail.attachment.tab.col1") + SYSConst.html_table_th("mail.errormail.attachment.tab.col2") + SYSConst.html_table_th("mail.errormail.attachment.tab.col3") + SYSConst.html_table_th("mail.errormail.attachment.tab.col4"); for (int exception = 0; exception < stacktrace1.length; exception++) { StackTraceElement element = stacktrace1[exception]; table1 += SYSConst.html_table_tr( SYSConst.html_table_td(element.getMethodName()) + SYSConst.html_table_td(Integer.toString(element.getLineNumber())) + SYSConst.html_table_td(element.getClassName()) + SYSConst.html_table_td(element.getFileName()) ); } html += SYSConst.html_table(table1, "1"); } return html; } /** * @param filePath name of file to open. The file can reside * anywhere in the classpath * http://snippets.dzone.com/posts/show/4480 */ public static String readFileAsString(String filePath) throws IOException { StringBuffer fileData = new StringBuffer(1000); FileInputStream fis = new FileInputStream(filePath); InputStreamReader reader = new InputStreamReader(fis, "UTF-8"); char[] buf = new char[1024]; int numRead = 0; while ((numRead = reader.read(buf)) != -1) { String readData = String.valueOf(buf, 0, numRead); fileData.append(readData); buf = new char[1024]; } reader.close(); fis.close(); return fileData.toString(); } public static BigDecimal checkBigDecimal(javax.swing.event.CaretEvent evt) { // https://github.com/tloehr/Offene-Pflege.de/issues/30 JTextComponent txt = (JTextComponent) evt.getSource(); return parseDecimal(txt.getText()); } public static Integer checkInteger(String txt) { Integer i = null; try { NumberFormat nf = DecimalFormat.getIntegerInstance(); Number number = nf.parse(txt); if (number instanceof Integer) { i = Integer.valueOf(number.intValue()); } else if (number instanceof Long) { i = Integer.valueOf(number.intValue()); } } catch (ParseException ex) { OPDE.debug(ex); // Pech } return i; } public static String left(String text, int size) { return left(text, size, "..."); } public static String left(String text, int size, String abrev) { // OPDE.debug("IN: " + text); int originalLaenge = text.length(); int max = Math.min(size, originalLaenge); text = text.substring(0, max); if (max < originalLaenge) { text += abrev; } return text; } // https://github.com/tloehr/Offene-Pflege.de/issues/31 public static String formatCurrency(BigDecimal bd) { return DecimalFormat.getCurrencyInstance().format(bd); } // https://github.com/tloehr/Offene-Pflege.de/issues/31 public static String formatBigDecimal(BigDecimal bd) { if (bd == null) return ""; return DecimalFormat.getNumberInstance().format(bd); } // https://github.com/tloehr/Offene-Pflege.de/issues/17 // https://github.com/tloehr/Offene-Pflege.de/issues/31 public static BigDecimal parseDecimal(String test) { if (test == null) return null; DecimalFormat fmt = new DecimalFormat(); fmt.setParseBigDecimal(true); // test = assimilateDecimalSeparators(test); BigDecimal num; try { num = (BigDecimal) fmt.parse(test); } catch (ParseException ex) { num = null; } // BigDecimal wert = null; // if (num != null) { // if (num instanceof Long) { // wert = new BigDecimal(num.longValue()); // } else if (num instanceof Double) { // wert = new BigDecimal(num.doubleValue()).setScale(2, BigDecimal.ROUND_HALF_UP); // } else if (num instanceof BigDecimal) { // wert = (BigDecimal) num; // } else { // wert = null; // } // } return num; } public static BigDecimal parseCurrency(String test) { NumberFormat nf = DecimalFormat.getCurrencyInstance(); Number num; try { num = nf.parse(test); } catch (ParseException ex) { try { String test1 = test + " " + SYSConst.eurosymbol; num = nf.parse(test1); } catch (ParseException ex1) { num = null; } } BigDecimal betrag = null; if (num != null) { if (num instanceof Long) { betrag = new BigDecimal(num.longValue()); } else if (num instanceof Double) { betrag = new BigDecimal(num.doubleValue()); } else if (num instanceof BigDecimal) { betrag = (BigDecimal) num; } else { betrag = null; } } return betrag; } /** * http://nakkaya.com/2009/11/08/command-line-progress-bar/ * * @param percent */ public static void printProgBar(int percent) { StringBuilder bar = new StringBuilder("["); for (int i = 0; i < 50; i++) { if (i < (percent / 2)) { bar.append("="); } else if (i == (percent / 2)) { bar.append(">"); } else { bar.append(" "); } } bar.append("] " + percent + "% "); System.out.print("\r" + bar.toString()); } public static void removeSearchPanels(JPanel panelSearch, int positionToAddPanels) { if (panelSearch.getComponentCount() > positionToAddPanels) { int count = panelSearch.getComponentCount(); for (int i = count - 1; i >= positionToAddPanels; i--) { panelSearch.remove(positionToAddPanels); } } } /** * compares two objects. a null value is always "smaller" than a non null value. * * @param one * @param two * @return 1 if one != null && two == null, -1 if one == null && two != null, 0 if one and two are both == null or both != null. */ public static int nullCompare(Object one, Object two) { if (one != null && two == null) { return 1; } if (one == null && two != null) { return -1; } return 0; } public static String generatePassword(String firstname, String lastname) { Random generator = new Random(System.currentTimeMillis()); return lastname.substring(0, 1).toLowerCase() + firstname.substring(0, 1).toLowerCase() + SYSTools.padL(Integer.toString(generator.nextInt(9999)), 4, "0"); } public static void printpw(String password, Users user) { String html; try { html = SYSTools.readFileAsString(AppInfo.getTemplate(AppInfo.fileNewuser).getAbsolutePath()); } catch (IOException ie) { html = "<body>" + "<h1>Access to Offene-Pflege.de (OPDE)</h1>" + "<br/>" + "<br/>" + "<br/>" + "<h2>For <opde-user-fullname/></h2>" + "<br/>" + "<br/>" + "<br/>" + "<p>UserID: <b><opde-user-userid/></b></p>" + "<p>Password: <b><opde-user-pw/></b></p>" + "<br/>" + "<br/>" + "Please keep this note in a safe place. Don't tell Your password to anyone." + "</body>"; } html = SYSTools.replace(html, "<opde-user-fullname/>", user.getFullname(), false); html = SYSTools.replace(html, "<opde-user-userid/>", user.getUID(), false); html = SYSTools.replace(html, "<opde-user-pw/>", password, false); html = SYSTools.htmlUmlautConversion(html); SYSFilesTools.print(html, true); } public static Collection subtract(Collection coll1, Collection coll2) { // http://code.hammerpig.com/find-the-difference-between-two-lists-in-java.html Collection result = new ArrayList(coll2); result.removeAll(coll1); return result; } public static Collection difference(Collection coll1, Collection coll2) { // http://code.hammerpig.com/find-the-difference-between-two-lists-in-java.html Collection result = union(coll1, coll2); result.removeAll(intersect(coll1, coll2)); return result; } public static Collection union(Collection coll1, Collection coll2) { // http://code.hammerpig.com/find-the-difference-between-two-lists-in-java.html Set union = new HashSet(coll1); union.addAll(new HashSet(coll2)); return new ArrayList(union); } public static Collection intersect(Collection set1, Collection set2) { // http://code.hammerpig.com/find-the-difference-between-two-lists-in-java.html Set intersection = new HashSet(set1); intersection.retainAll(new HashSet(set2)); return intersection; } /** * tiny method to automatically find out if the message is a language key or not. * * @param message * @return replaced message or the original message if there is no appropriate language key. */ public static String xx(String message, @Nullable Object... args) { if (message == null || message.isEmpty()) return ""; String title = message; try { title = String.format(OPDE.lang.getString(message), args); } catch (Exception e) { // ok, its not a langbundle key } return title; } public static void packTable(JTable table, int margin) { for (int colindex = 0; colindex < table.getColumnCount(); colindex++) { packColumn(table, colindex, margin); } } public static String booleanToString(boolean b) { return b ? SYSTools.xx("misc.msg.yes") : SYSTools.xx("misc.msg.no"); } /** * http://exampledepot.com/egs/javax.swing.table/PackCol.html * * @param table * @param vColIndex * @param margin */ public static void packColumn(JTable table, int vColIndex, int margin) { TableModel model = table.getModel(); DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel(); TableColumn col = colModel.getColumn(vColIndex); int width = 0; // Get width of column header TableCellRenderer renderer = col.getHeaderRenderer(); if (renderer == null) { renderer = table.getTableHeader().getDefaultRenderer(); } Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0); width = comp.getPreferredSize().width; // Get maximum width of column data for (int r = 0; r < table.getRowCount(); r++) { renderer = table.getCellRenderer(r, vColIndex); comp = renderer.getTableCellRendererComponent( table, table.getValueAt(r, vColIndex), false, false, r, vColIndex); width = Math.max(width, comp.getPreferredSize().width); } // Add margin width += 2 * margin; // Set the width col.setPreferredWidth(width); OPDE.debug("packColumn/3: col=" + vColIndex + " width=" + width); } // public static void checkForSoftwareupdates() { //// final String FTPServer = "ftp.offene-pflege.de"; // final int FTPPort = 21; // final String FTPUser = "anonymous"; // final String FTPPassword = Integer.toString(OPDE.getAppInfo().getBuildnum()); // final String FTPWorkingDirectory = "/pub/opde"; // final String FILENAME = "buildnum"; // // int remoteBuildnum = -1; // String descriptionURL = ""; // int mybuildnum = OPDE.getAppInfo().getBuildnum(); // FileTransferClient ftp = null; // try { // File target = File.createTempFile("opde", ".txt"); // target.deleteOnExit(); // ftp = new FileTransferClient(); // // ftp.setRemoteHost(OPDE.UPDATE_FTPSERVER); // ftp.setUserName(FTPUser); // ftp.setPassword(FTPPassword); // ftp.setRemotePort(FTPPort); // ftp.setTimeout(5000); // ftp.connect(); // ftp.getAdvancedFTPSettings().setConnectMode(FTPConnectMode.PASV); // ftp.changeDirectory(FTPWorkingDirectory); // ftp.downloadFile(target.getPath(), FILENAME); // // String strRemoteBuildnum = FileUtils.readLines(target).get(0); // remoteBuildnum = Integer.parseInt(strRemoteBuildnum); // // descriptionURL = FileUtils.readLines(target).get(1); // // ftp.disconnect(); // } catch (Exception e) { // if (ftp != null && ftp.isConnected()) { // try { // ftp.disconnect(); // } catch (FTPException e1) { // OPDE.error(e1); // } catch (IOException e1) { // OPDE.error(e1); // } // } // OPDE.warn(e); // } // // OPDE.setUpdateAvailable(remoteBuildnum > mybuildnum, descriptionURL); // } }