[Schmitzm-commits] r711 - in trunk/src: schmitzm/geotools/feature schmitzm/geotools/feature/resource/locales schmitzm/geotools/io schmitzm/jfree/feature/style schmitzm/lang schmitzm/swing/table skrueger/swing

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Fri Feb 19 02:09:41 CET 2010


Author: alfonx
Date: 2010-02-19 02:09:35 +0100 (Fri, 19 Feb 2010)
New Revision: 711

Modified:
   trunk/src/schmitzm/geotools/feature/FeatureTypeBuilderTableModel.java
   trunk/src/schmitzm/geotools/feature/resource/locales/FeatureResourceBundle_de.properties
   trunk/src/schmitzm/geotools/io/GeoImportUtil.java
   trunk/src/schmitzm/jfree/feature/style/FeatureBasicChartStyle.java
   trunk/src/schmitzm/jfree/feature/style/FeatureChartStyle.java
   trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java
   trunk/src/schmitzm/lang/LangUtil.java
   trunk/src/schmitzm/swing/table/DoubleRenderer.java
   trunk/src/skrueger/swing/CancellableTabbedDialogAdapter.java
   trunk/src/skrueger/swing/ColorButton.java
   trunk/src/skrueger/swing/TranslationEditJPanel.java
   trunk/src/skrueger/swing/TranslationJTextField.java
Log:
Fine-tuning session with A + R

Modified: trunk/src/schmitzm/geotools/feature/FeatureTypeBuilderTableModel.java
===================================================================
--- trunk/src/schmitzm/geotools/feature/FeatureTypeBuilderTableModel.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/schmitzm/geotools/feature/FeatureTypeBuilderTableModel.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -53,10 +53,8 @@
 import schmitzm.geotools.gui.GeotoolsGUIUtil;
 import schmitzm.swing.BooleanInputOption;
 import schmitzm.swing.ExceptionDialog;
-import schmitzm.swing.InputOption;
 import schmitzm.swing.ManualInputOption;
 import schmitzm.swing.SelectionInputOption;
-import schmitzm.swing.event.InputOptionAdapter;
 import schmitzm.swing.table.AbstractMutableTableModel;
 import schmitzm.swing.table.ComponentRenderer;
 import schmitzm.temp.BaseTypeUtil;

Modified: trunk/src/schmitzm/geotools/feature/resource/locales/FeatureResourceBundle_de.properties
===================================================================
--- trunk/src/schmitzm/geotools/feature/resource/locales/FeatureResourceBundle_de.properties	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/schmitzm/geotools/feature/resource/locales/FeatureResourceBundle_de.properties	2010-02-19 01:09:35 UTC (rev 711)
@@ -59,7 +59,7 @@
 # --------------------------------------------------
 
 # --- Restrictions for attribute names ---
-org.geotools.err.attr.name=Attribute-Name nicht zulässig
+org.geotools.err.attr.name=Attribute-Name nicht zul\u00e4ssig
 org.geotools.err.attr.name.null=Attribute-Name darf nicht NULL sein! 
 org.geotools.err.attr.name.length=Attribut-Name darf maximal 10 Zeichen lang sein! 
 org.geotools.err.attr.name.start=Attribut-Name muss mit einem Zeichen (A-Z,a-z) beginnen!

Modified: trunk/src/schmitzm/geotools/io/GeoImportUtil.java
===================================================================
--- trunk/src/schmitzm/geotools/io/GeoImportUtil.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/schmitzm/geotools/io/GeoImportUtil.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -70,7 +70,6 @@
 import org.geotools.gce.geotiff.GeoTiffReader;
 import org.geotools.gce.image.WorldImageReader;
 import org.geotools.geometry.Envelope2D;
-import org.geotools.referencing.CRS;
 import org.geotools.referencing.crs.DefaultGeographicCRS;
 import org.opengis.feature.simple.SimpleFeature;
 import org.opengis.feature.simple.SimpleFeatureType;

Modified: trunk/src/schmitzm/jfree/feature/style/FeatureBasicChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/feature/style/FeatureBasicChartStyle.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/schmitzm/jfree/feature/style/FeatureBasicChartStyle.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -36,8 +36,6 @@
 import org.jfree.data.category.CategoryDataset;
 import org.jfree.data.general.Dataset;
 import org.jfree.data.xy.XYDataset;
-import org.opengis.feature.simple.SimpleFeature;
-import org.opengis.feature.simple.SimpleFeatureType;
 
 import schmitzm.jfree.chart.style.BasicChartStyle;
 import schmitzm.jfree.chart.style.ChartStyle;

Modified: trunk/src/schmitzm/jfree/feature/style/FeatureChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/feature/style/FeatureChartStyle.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/schmitzm/jfree/feature/style/FeatureChartStyle.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -43,7 +43,6 @@
 import org.opengis.feature.simple.SimpleFeatureType;
 
 import schmitzm.jfree.chart.style.AbstractChartStyle;
-import schmitzm.jfree.chart.style.ChartAxisStyle;
 import schmitzm.jfree.chart.style.ChartStyle;
 import schmitzm.lang.LangUtil;
 

Modified: trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java
===================================================================
--- trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -278,18 +278,17 @@
 			SimpleFeature f = fi.next();
 			// Determine X value (NULL not permitted for XYDateset!)
 			Number xValue = (Number) f.getAttribute(xAttrName);
-			
+
 			// Filter out NODATA values
 			xValue = chartStyle.filterNoDataValue(0, xValue);
 			if (xValue == null)
 				continue;
 
-			
 			// Determine the Y values and fill the series
 			for (int attrIdx = 1; attrIdx < attrCount; attrIdx++) {
 				String yAttrName = chartStyle.getAttributeName(attrIdx);
 				Number yValue = (Number) f.getAttribute(yAttrName);
-				
+
 				// Filter out NoDataValues
 				yValue = chartStyle.filterNoDataValue(attrIdx, yValue);
 				if (yValue == null)
@@ -313,7 +312,7 @@
 				// Mapping between FID and data index in series
 				mapping.setMapping(f.getID(), yAttrName, datasetIdx++);
 			}
-			
+
 		}
 		return dataset;
 	}
@@ -364,9 +363,23 @@
 							.getAttributeCount(); attrIdx++) {
 
 						if (chartStyle.isAttributeNormalized(attrIdx)) {
+
 							String attrName = chartStyle
 									.getAttributeName(attrIdx);
 
+							// SK: Since normalization is now usaually set for
+							// all
+							// attributes (even when they are not numeric), we
+							// double check here, whether it is really a numeric
+							// attribute
+							if (!Number.class.isAssignableFrom(f
+									.getFeatureType().getDescriptor(attrName)
+									.getType().getBinding())) {
+								continue;
+							}
+
+							// Look for a cached version of the Statistics or
+							// create a new one
 							StaticBin1D stat = attribStats.get(attrName);
 							if (stat == null) {
 								stat = new DynamicBin1D();
@@ -374,21 +387,20 @@
 							}
 
 							// Filter out NoDataValues
-							Object rawValue = chartStyle.filterNoDataValue(attrIdx, f.getAttribute(attrName));
+							Object rawValue = chartStyle.filterNoDataValue(
+									attrIdx, f.getAttribute(attrName));
 							if (rawValue == null)
 								continue;
 
-//							rawValue = ,
-//									rawValue);
-
 							final Double doubleValue = new Double(
 									((Number) rawValue).doubleValue());
+
 							stat.add(doubleValue);
-							// LOGGER.debug("Adding "+doubleValue+" and sd = "+stat.standardDeviation()+" and mean = "+stat.mean());
 						}
 					}
-				} // Featuer iterator
-			} finally {
+				}
+			} // Feature iterator
+			finally {
 				fc.close(fIt);
 			}
 		} // doNormlization
@@ -489,13 +501,13 @@
 				// Determine the category (NULL not permitted!)
 				Comparable<?> catValue = (Comparable<?>) f
 						.getAttribute(xAttrName);
-				
+
 				// Filter out NODATA values
 				catValue = chartStyle.filterNoDataValue(0, catValue);
-				
+
 				if (catValue == null)
 					continue;
-				
+
 				// Determine the Y values and fill the dataset
 				for (int attrIdx = 1; attrIdx < attrCount; attrIdx++) {
 					String yAttrName = chartStyle.getAttributeName(attrIdx);

Modified: trunk/src/schmitzm/lang/LangUtil.java
===================================================================
--- trunk/src/schmitzm/lang/LangUtil.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/schmitzm/lang/LangUtil.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -50,634 +50,808 @@
 
 /**
  * Diese Klasse stellt Hilfsfunktionen fuer Basisoperationen bereit.
- * @author <a href="mailto:martin.schmitz at koeln.de">Martin Schmitz</a> (University of Bonn/Germany)
+ * 
+ * @author <a href="mailto:martin.schmitz at koeln.de">Martin Schmitz</a>
+ *         (University of Bonn/Germany)
  * @version 1.0
  */
 public class LangUtil {
 
-  /** {@link ResourceProvider}, der die Lokalisation fuer Komponenten
-   *  des Package {@code schmitzm.lang} zur Verfuegung stellt. Diese sind
-   *  in properties-Dateien unter {@code schmitzm.lang.resource.locales}
-   *  hinterlegt. */
-  public static ResourceProvider RESOURCE = new ResourceProvider( extendPackagePath(LangUtil.class,"resource.locales.LangResourceBundle"), Locale.ENGLISH );
+	/**
+	 * {@link ResourceProvider}, der die Lokalisation fuer Komponenten des
+	 * Package {@code schmitzm.lang} zur Verfuegung stellt. Diese sind in
+	 * properties-Dateien unter {@code schmitzm.lang.resource.locales}
+	 * hinterlegt.
+	 */
+	public static ResourceProvider RESOURCE = new ResourceProvider(
+			extendPackagePath(LangUtil.class,
+					"resource.locales.LangResourceBundle"), Locale.ENGLISH);
 
-  /**
-   * Liefert den einfachen Namen einer Klasse (ohne Package) oder den
-   * String "null", falls das Objekt {@code null} ist
-   * @param object ein Objekt
-   * @param niemals {@code null}
-   */
-  public static String getSimpleClassName(Object object) {
-    if ( object == null )
-      return "null";
-    return object.getClass().getSimpleName();
-  }
+	/**
+	 * Liefert den einfachen Namen einer Klasse (ohne Package) oder den String
+	 * "null", falls das Objekt {@code null} ist
+	 * 
+	 * @param object
+	 *            ein Objekt
+	 * @param niemals
+	 *            {@code null}
+	 */
+	public static String getSimpleClassName(Object object) {
+		if (object == null)
+			return "null";
+		return object.getClass().getSimpleName();
+	}
 
+	/**
+	 * Prueft, ob ein {@link Enum} ein spezielles Feld besitzt.
+	 * 
+	 * @param enumClass
+	 *            enum typ
+	 * @param fieldName
+	 *            feld name
+	 */
+	public static boolean checkEnumValue(Class<? extends Enum> enumClass,
+			String fieldName) {
+		try {
+			Enum.valueOf(enumClass, fieldName);
+			return true;
+		} catch (IllegalArgumentException err) {
+			return false;
+		}
+	}
 
-  /**
-   * Prueft, ob ein {@link Enum} ein spezielles Feld besitzt.
-   * @param enumClass enum typ
-   * @param fieldName feld name
-   */
-  public static boolean checkEnumValue(Class<? extends Enum> enumClass, String fieldName) {
-    try {
-      Enum.valueOf(enumClass, fieldName);
-      return true;
-    } catch (IllegalArgumentException err) {
-      return false;
-    }
-  }
+	/**
+	 * Fuegt alle Elemente eines Arrays in einen {@link Vector} ein. Wird als
+	 * Vector <code>null</code> angegeben, wird ein neuer Vector erzeugt.
+	 * 
+	 * @param obj
+	 *            einzufuegende Objekte
+	 * @param vec
+	 *            Vector in den die Elemente eingefuegt werden (kann
+	 *            <code>null</code> sein)
+	 * @return den Vector <code>vec</code> oder eine neue {@link Vector}-Instanz
+	 */
+	public static Vector addObjectsToVector(Object[] obj, Vector vec) {
+		if (vec == null)
+			vec = new Vector();
+		for (int i = 0; i < obj.length; i++)
+			vec.add(obj[i]);
+		return vec;
+	}
 
-  /**
-   * Fuegt alle Elemente eines Arrays in einen {@link Vector} ein. Wird als Vector
-   * <code>null</code> angegeben, wird ein neuer Vector erzeugt.
-   * @param obj einzufuegende Objekte
-   * @param vec Vector in den die Elemente eingefuegt werden (kann <code>null</code>
-   *            sein)
-   * @return den Vector <code>vec</code> oder eine neue {@link Vector}-Instanz
-   */
-  public static Vector addObjectsToVector(Object[] obj, Vector vec) {
-    if ( vec == null )
-      vec = new Vector();
-    for (int i=0; i<obj.length; i++)
-      vec.add(obj[i]);
-    return vec;
-  }
+	/**
+	 * Ersetzt alle Tabulator-Vorkommen in einem String durch Leerzeichen.
+	 * 
+	 * @param source
+	 *            Quell-String
+	 * @param tabLen
+	 *            Anzahl an Zeichen die ein Tabulator darstellt
+	 */
+	public static String replaceTabulators(String source, int tabLen) {
+		String outString = new String(source);
+		char[] maxSpacePattern = new char[tabLen];
+		Arrays.fill(maxSpacePattern, ' ');
 
-  /**
-   * Ersetzt alle Tabulator-Vorkommen in einem String durch Leerzeichen.
-   * @param source Quell-String
-   * @param tabLen Anzahl an Zeichen die ein Tabulator darstellt
-   */
-  public static String replaceTabulators(String source, int tabLen) {
-    String outString       = new String(source);
-    char[] maxSpacePattern = new char[tabLen];
-    Arrays.fill(maxSpacePattern,' ');
+		for (int pos; (pos = outString.indexOf('\t')) >= 0;) {
+			outString = outString.replaceFirst("\t", String.valueOf(
+					maxSpacePattern, 0, tabLen - pos % tabLen));
+		}
+		return outString;
+	}
 
-    for(int pos; (pos=outString.indexOf('\t')) >= 0;) {
-      outString = outString.replaceFirst(
-        "\t",
-        String.valueOf(maxSpacePattern,0,tabLen-pos%tabLen)
-      );
-    }
-    return outString;
-  }
+	/**
+	 * Haengt eine beliebige Anzahl von Strings hintereinander.
+	 * 
+	 * @param str
+	 *            aneinanderzuhaengende Stings
+	 */
+	public static String stringConcat(String... str) {
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; str != null && i < str.length; i++)
+			sb.append(str[i]);
+		return sb.toString();
+	}
 
-  /**
-   * Haengt eine beliebige Anzahl von Strings hintereinander.
-   * @param str aneinanderzuhaengende Stings
-   */
-  public static String stringConcat(String... str) {
-    StringBuffer sb = new StringBuffer();
-    for (int i=0; str!=null && i<str.length; i++)
-      sb.append(str[i]);
-    return sb.toString();
-  }
+	/**
+	 * Haengt eine beliebige Anzahl von Strings hintereinander und fuegt
+	 * zwischen den Strings einen Trenner ein.
+	 * 
+	 * @param sep
+	 *            Trenner
+	 * @param str
+	 *            aneinanderzuhaengende Stings
+	 */
+	public static String stringConcatWithSep(String sep, String... str) {
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; str != null && i < str.length; i++) {
+			if (i > 0)
+				sb.append(sep);
+			sb.append(str[i]);
+		}
+		return sb.toString();
+	}
 
-  /**
-   * Haengt eine beliebige Anzahl von Strings hintereinander und fuegt zwischen
-   * den Strings einen Trenner ein.
-   * @param sep Trenner
-   * @param str aneinanderzuhaengende Stings
-   */
-  public static String stringConcatWithSep(String sep, String... str) {
-    StringBuffer sb = new StringBuffer();
-    for (int i=0; str!=null && i<str.length; i++) {
-      if ( i>0 )
-        sb.append(sep);
-      sb.append(str[i]);
-    }
-    return sb.toString();
-  }
+	/**
+	 * Erzeugt einen vorbelegten Array.
+	 * 
+	 * @param count
+	 *            Groesse des Arrays
+	 * @param value
+	 *            Wert mit dem die Elemente vorbelegt werden
+	 */
+	public static int[] createArray(int count, int value) {
+		int[] array = new int[count];
+		java.util.Arrays.fill(array, value);
+		return array;
+	}
 
-  /**
-   * Erzeugt einen vorbelegten Array.
-   * @param count Groesse des Arrays
-   * @param value Wert mit dem die Elemente vorbelegt werden
-   */
-  public static int[] createArray(int count, int value) {
-    int[] array = new int[count];
-    java.util.Arrays.fill(array,value);
-    return array;
-  }
+	/**
+	 * Erzeugt einen vorbelegten Array.
+	 * 
+	 * @param count
+	 *            Groesse des Arrays
+	 * @param value
+	 *            Wert mit dem die Elemente vorbelegt werden
+	 */
+	public static long[] createArray(int count, long value) {
+		long[] array = new long[count];
+		java.util.Arrays.fill(array, value);
+		return array;
+	}
 
-  /**
-   * Erzeugt einen vorbelegten Array.
-   * @param count Groesse des Arrays
-   * @param value Wert mit dem die Elemente vorbelegt werden
-   */
-  public static long[] createArray(int count, long value) {
-    long[] array = new long[count];
-    java.util.Arrays.fill(array,value);
-    return array;
-  }
+	/**
+	 * Erzeugt einen vorbelegten Array.
+	 * 
+	 * @param count
+	 *            Groesse des Arrays
+	 * @param value
+	 *            Wert mit dem die Elemente vorbelegt werden
+	 */
+	public static float[] createArray(int count, float value) {
+		float[] array = new float[count];
+		java.util.Arrays.fill(array, value);
+		return array;
+	}
 
-  /**
-   * Erzeugt einen vorbelegten Array.
-   * @param count Groesse des Arrays
-   * @param value Wert mit dem die Elemente vorbelegt werden
-   */
-  public static float[] createArray(int count, float value) {
-    float[] array = new float[count];
-    java.util.Arrays.fill(array,value);
-    return array;
-  }
+	/**
+	 * Erzeugt einen vorbelegten Array.
+	 * 
+	 * @param count
+	 *            Groesse des Arrays
+	 * @param value
+	 *            Wert mit dem die Elemente vorbelegt werden
+	 */
+	public static double[] createArray(int count, double value) {
+		double[] array = new double[count];
+		java.util.Arrays.fill(array, value);
+		return array;
+	}
 
-  /**
-   * Erzeugt einen vorbelegten Array.
-   * @param count Groesse des Arrays
-   * @param value Wert mit dem die Elemente vorbelegt werden
-   */
-  public static double[] createArray(int count, double value) {
-    double[] array = new double[count];
-    java.util.Arrays.fill(array,value);
-    return array;
-  }
+	/**
+	 * Erzeugt einen vorbelegten Array.
+	 * 
+	 * @param count
+	 *            Groesse des Arrays
+	 * @param value
+	 *            Wert mit dem die Elemente vorbelegt werden
+	 */
+	public static String[] createArray(int count, String value) {
+		String[] array = new String[count];
+		java.util.Arrays.fill(array, value);
+		return array;
+	}
 
-  /**
-   * Erzeugt einen vorbelegten Array.
-   * @param count Groesse des Arrays
-   * @param value Wert mit dem die Elemente vorbelegt werden
-   */
-  public static String[] createArray(int count, String value) {
-    String[] array = new String[count];
-    java.util.Arrays.fill(array,value);
-    return array;
-  }
+	/**
+	 * Erzeugt einen mehr-dimensionalen {@link Object}-Array.
+	 * 
+	 * @param size
+	 *            Groesse der Array-Dimensionen
+	 * @return einen {@code Object[]..[]}
+	 */
+	public static Object createArray(int... size) {
+		switch (size.length) {
+		case 1:
+			return new Object[size[0]];
+		case 2:
+			return new Object[size[0]][size[1]];
+		case 3:
+			return new Object[size[0]][size[1]][size[2]];
+		case 4:
+			return new Object[size[0]][size[1]][size[2]][size[3]];
+		case 5:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]];
+		case 6:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]];
+		case 7:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]];
+		case 8:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]];
+		case 9:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]];
+		case 10:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]];
+		case 11:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]];
+		case 12:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]];
+		case 13:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]];
+		case 14:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]];
+		case 15:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]];
+		case 16:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]][size[15]];
+		case 17:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]][size[15]][size[16]];
+		case 18:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]][size[15]][size[16]][size[17]];
+		case 19:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]][size[15]][size[16]][size[17]][size[18]];
+		case 20:
+			return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]][size[15]][size[16]][size[17]][size[18]][size[19]];
+		}
+		throw new IllegalArgumentException("Dimension not supported: "
+				+ size.length);
+	}
 
-  /**
-   * Erzeugt einen mehr-dimensionalen {@link Object}-Array.
-   * @param size Groesse der Array-Dimensionen
-   * @return einen {@code Object[]..[]}
-   */
-  public static Object createArray(int... size) {
-    switch ( size.length ) {
-      case  1: return new Object[size[0]];
-      case  2: return new Object[size[0]][size[1]];
-      case  3: return new Object[size[0]][size[1]][size[2]];
-      case  4: return new Object[size[0]][size[1]][size[2]][size[3]];
-      case  5: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]];
-      case  6: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]];
-      case  7: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]];
-      case  8: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]];
-      case  9: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]];
-      case 10: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]];
-      case 11: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]];
-      case 12: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]];
-      case 13: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]];
-      case 14: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]];
-      case 15: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]];
-      case 16: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]][size[15]];
-      case 17: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]][size[15]][size[16]];
-      case 18: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]][size[15]][size[16]][size[17]];
-      case 19: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]][size[15]][size[16]][size[17]][size[18]];
-      case 20: return new Object[size[0]][size[1]][size[2]][size[3]][size[4]][size[5]][size[6]][size[7]][size[8]][size[9]][size[10]][size[11]][size[12]][size[13]][size[14]][size[15]][size[16]][size[17]][size[18]][size[19]];
-    }
-    throw new IllegalArgumentException("Dimension not supported: "+size.length);
-  }
+	/**
+	 * Liefert die Dimension eines multi-dimensionalen {@link Object}-Array.<br>
+	 * <b>Diese Methode funktioniert nur, wenn das Element 0 in jeder Dimension
+	 * belegt ist!</b>
+	 * 
+	 * @param array
+	 *            multi-dim. Array (Instanz von {@code Object[]..[]})
+	 * @exception ArrayIndexOutOfBoundsException
+	 *                wenn das 0te Element in einer Dimension mit {@code null}
+	 *                belegt ist
+	 */
+	public static int getArrayDimension(Object array) {
+		int dim = 0;
+		try {
+			for (;; dim++) {
+				array = ((Object[]) array)[0];
+			}
+		} catch (ClassCastException err) {
+		}
+		return dim;
+	}
 
-  /**
-   * Liefert die Dimension eines multi-dimensionalen {@link Object}-Array.<br>
-   * <b>Diese Methode funktioniert nur, wenn das Element 0 in jeder Dimension
-   * belegt ist!</b>
-   * @param array multi-dim. Array (Instanz von {@code Object[]..[]})
-   * @exception ArrayIndexOutOfBoundsException wenn das 0te Element in einer
-   *            Dimension mit {@code null} belegt ist
-   */
-  public static int getArrayDimension(Object array) {
-    int dim = 0;
-    try {
-      for (;; dim++) {
-        array = ((Object[])array)[0];
-      }
-    } catch (ClassCastException err) {
-    }
-    return dim;
-  }
+	/**
+	 * Liefert die Groessen der einzelnen Dimensionen eines multi-dimensionalen
+	 * {@link Object}-Array.<br>
+	 * <b>Diese Methode funktioniert nur, wenn das Element 0 in jeder Dimension
+	 * belegt ist!</b>
+	 * 
+	 * @param array
+	 *            multi-dim. Array (Instanz von {@code Object[]..[]})
+	 * @exception ArrayIndexOutOfBoundsException
+	 *                wenn das 0te Element in einer Dimension mit {@code null}
+	 *                belegt ist
+	 */
+	public static int[] getArrayLength(Object array) {
+		int[] dimSize = new int[getArrayDimension(array)];
+		for (int d = 0; d < dimSize.length; d++) {
+			dimSize[d] = ((Object[]) array).length;
+			array = ((Object[]) array)[0];
+		}
+		return dimSize;
+	}
 
-  /**
-   * Liefert die Groessen der einzelnen Dimensionen eines multi-dimensionalen
-   * {@link Object}-Array.<br>
-   * <b>Diese Methode funktioniert nur, wenn das Element 0 in jeder Dimension
-   * belegt ist!</b>
-   * @param array multi-dim. Array (Instanz von {@code Object[]..[]})
-   * @exception ArrayIndexOutOfBoundsException wenn das 0te Element in einer
-   *            Dimension mit {@code null} belegt ist
-   */
-  public static int[] getArrayLength(Object array) {
-    int[] dimSize = new int[ getArrayDimension(array) ];
-    for (int d=0; d<dimSize.length; d++) {
-      dimSize[d] = ((Object[])array).length;
-      array = ( (Object[]) array)[0];
-    }
-    return dimSize;
-  }
+	/**
+	 * Liefert einen Wert aus einem multi-dimensionalen {@link Object}-Array.
+	 * 
+	 * @param array
+	 *            multi-dim. Array (Instanz von {@code Object[]..[]})
+	 * @param coord
+	 *            Koordinaten des Arrays
+	 * @exception ArrayIndexOutOfBoundsException
+	 *                wenn eine fehlerhafte Koordinate angegeben wird
+	 */
+	public static Object getArrayValue(Object array, int... coord) {
+		for (int i = 0; i < coord.length; i++)
+			array = ((Object[]) array)[coord[i]];
+		return array;
+	}
 
-  /**
-   * Liefert einen Wert aus einem multi-dimensionalen {@link Object}-Array.
-   * @param array multi-dim. Array (Instanz von {@code Object[]..[]})
-   * @param coord Koordinaten des Arrays
-   * @exception ArrayIndexOutOfBoundsException wenn eine fehlerhafte Koordinate
-   *            angegeben wird
-   */
-  public static Object getArrayValue(Object array, int... coord) {
-    for (int i=0; i<coord.length; i++)
-      array = ((Object[])array)[ coord[i] ];
-    return array;
-  }
+	/**
+	 * Setzt einen Wert aus einem multi-dimensionalen {@link Object}-Array.
+	 * 
+	 * @param array
+	 *            multi-dim. Array (Instanz von {@code Object[]..[]})
+	 * @param value
+	 *            zu setzender Wert (Instanz von {@code Object[]..[]})
+	 * @param coord
+	 *            Koordinaten des Arrays
+	 * @exception ArrayIndexOutOfBoundsException
+	 *                wenn eine fehlerhafte Koordinate angegeben wird
+	 */
+	public static void setArrayValue(Object array, Object value, int... coord) {
+		for (int i = 0; i < coord.length - 1; i++)
+			array = ((Object[]) array)[coord[i]];
+		((Object[]) array)[coord[coord.length - 1]] = value;
+	}
 
-  /**
-   * Setzt einen Wert aus einem multi-dimensionalen {@link Object}-Array.
-   * @param array multi-dim. Array (Instanz von {@code Object[]..[]})
-   * @param value zu setzender Wert (Instanz von {@code Object[]..[]})
-   * @param coord Koordinaten des Arrays
-   * @exception ArrayIndexOutOfBoundsException wenn eine fehlerhafte Koordinate
-   *            angegeben wird
-   */
-  public static void setArrayValue(Object array, Object value, int... coord) {
-    for (int i=0; i<coord.length-1; i++)
-      array = ((Object[])array)[ coord[i] ];
-    ((Object[])array)[ coord[coord.length-1] ] = value;
-  }
+	/**
+	 * Kopiert einen Array (aber nicht dessen Elemente). Darueberhinaus koennen
+	 * (einige) Elemente direkt neu belegt werden. Ist das Flag {@code replNull}
+	 * auf {@code false} gesetzt, werden {@code null}-Werte in {@code replElem}
+	 * ignoriert. So ist es z.B. moeglich, nur das 4. und 5. Element im neuen
+	 * Array neu zu belegen und die davor liegenden Elemente unangetastet zu
+	 * lassen.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param replNull
+	 *            Bestimmt, ob {@code null}-Elemente von {@code replElem} im
+	 *            neuen Array gesetzt werden ({@code true}) oder nicht
+	 * @param replElem
+	 *            Elemente (beginnend bei Index 0), die nach dem Kopieren im
+	 *            Array neu gesetzt werden
+	 * @return Array von der Groesse {@code max(source.length, replElem.length)}
+	 */
+	public static <T> T[] cloneArray(T[] source, boolean replNull,
+			T... replElem) {
+		T[] newArray = java.util.Arrays.copyOf(source, Math.max(source.length,
+				replElem.length));
+		for (int i = 0; i < replElem.length; i++)
+			if (replNull || replElem[i] != null)
+				newArray[i] = replElem[i];
+		return newArray;
+	}
 
-  /**
-   * Kopiert einen Array (aber nicht dessen Elemente). Darueberhinaus koennen
-   * (einige) Elemente direkt neu belegt werden. Ist das Flag {@code replNull}
-   * auf {@code false} gesetzt, werden {@code null}-Werte in {@code replElem}
-   * ignoriert. So ist es z.B. moeglich, nur das 4. und 5. Element im neuen
-   * Array neu zu belegen und die davor liegenden Elemente unangetastet zu lassen.
-   * @param source   zu kopierender Array
-   * @param replNull Bestimmt, ob {@code null}-Elemente von {@code replElem}
-   *                 im neuen Array gesetzt werden ({@code true}) oder nicht
-   * @param replElem Elemente (beginnend bei Index 0), die nach dem Kopieren
-   *                 im Array neu gesetzt werden
-   * @return Array von der Groesse {@code max(source.length, replElem.length)}
-   */
-  public static <T> T[] cloneArray(T[] source, boolean replNull, T... replElem) {
-    T[] newArray =  java.util.Arrays.copyOf(source, Math.max(source.length, replElem.length));
-    for (int i=0; i<replElem.length; i++)
-      if (replNull || replElem[i] != null)
-        newArray[i] = replElem[i];
-    return newArray;
-  }
+	/**
+	 * Kopiert einen Array (aber nicht dessen Elemente). Darueberhinaus koennen
+	 * (einige) Elemente direkt neu belegt werden.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param replElem
+	 *            Elemente (beginnend bei Index 0), die nach dem Kopieren im
+	 *            Array neu gesetzt werden
+	 * @return Array von der Groesse {@code max(source.length, replElem.length)}
+	 */
+	public static <T> T[] cloneArray(T[] source, T... replElem) {
+		return cloneArray(source, true, replElem);
+	}
 
-  /**
-   * Kopiert einen Array (aber nicht dessen Elemente). Darueberhinaus koennen
-   * (einige) Elemente direkt neu belegt werden.
-   * @param source   zu kopierender Array
-   * @param replElem Elemente (beginnend bei Index 0), die nach dem Kopieren
-   *                 im Array neu gesetzt werden
-   * @return Array von der Groesse {@code max(source.length, replElem.length)}
-   */
-  public static <T> T[] cloneArray(T[] source, T... replElem) {
-    return cloneArray(source,true,replElem);
-  }
+	/**
+	 * Kopiert einen Array und belegt (einige) Elemente direkt neu.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param replElem
+	 *            Elemente (beginnend bei Index 0), die nach dem Kopieren im
+	 *            Array neu gesetzt werden
+	 * @return Array von der Groesse {@code max(source.length, replElem.length)}
+	 */
+	public static long[] cloneArray(long[] source, long... replElem) {
+		long[] newArray = java.util.Arrays.copyOf(source, Math.max(
+				source.length, replElem.length));
+		for (int i = 0; i < replElem.length; i++)
+			newArray[i] = replElem[i];
+		return newArray;
+	}
 
-  /**
-   * Kopiert einen Array und belegt (einige) Elemente direkt neu.
-   * @param source   zu kopierender Array
-   * @param replElem Elemente (beginnend bei Index 0), die nach dem Kopieren
-   *                 im Array neu gesetzt werden
-   * @return Array von der Groesse {@code max(source.length, replElem.length)}
-   */
-  public static long[] cloneArray(long[] source, long... replElem) {
-    long[] newArray =  java.util.Arrays.copyOf(source, Math.max(source.length, replElem.length));
-    for (int i=0; i<replElem.length; i++)
-      newArray[i] = replElem[i];
-    return newArray;
-  }
+	/**
+	 * Kopiert einen Array und belegt (einige) Elemente direkt neu.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param replElem
+	 *            Elemente (beginnend bei Index 0), die nach dem Kopieren im
+	 *            Array neu gesetzt werden
+	 * @return Array von der Groesse {@code max(source.length, replElem.length)}
+	 */
+	public static int[] cloneArray(int[] source, int... replElem) {
+		int[] newArray = java.util.Arrays.copyOf(source, Math.max(
+				source.length, replElem.length));
+		for (int i = 0; i < replElem.length; i++)
+			newArray[i] = replElem[i];
+		return newArray;
+	}
 
-  /**
-   * Kopiert einen Array und belegt (einige) Elemente direkt neu.
-   * @param source   zu kopierender Array
-   * @param replElem Elemente (beginnend bei Index 0), die nach dem Kopieren
-   *                 im Array neu gesetzt werden
-   * @return Array von der Groesse {@code max(source.length, replElem.length)}
-   */
-  public static int[] cloneArray(int[] source, int... replElem) {
-    int[] newArray =  java.util.Arrays.copyOf(source, Math.max(source.length, replElem.length));
-    for (int i=0; i<replElem.length; i++)
-      newArray[i] = replElem[i];
-    return newArray;
-  }
+	/**
+	 * Kopiert einen Array und belegt (einige) Elemente direkt neu.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param replElem
+	 *            Elemente (beginnend bei Index 0), die nach dem Kopieren im
+	 *            Array neu gesetzt werden
+	 * @return Array von der Groesse {@code max(source.length, replElem.length)}
+	 */
+	public static short[] cloneArray(short[] source, short... replElem) {
+		short[] newArray = java.util.Arrays.copyOf(source, Math.max(
+				source.length, replElem.length));
+		for (int i = 0; i < replElem.length; i++)
+			newArray[i] = replElem[i];
+		return newArray;
+	}
 
-  /**
-   * Kopiert einen Array und belegt (einige) Elemente direkt neu.
-   * @param source   zu kopierender Array
-   * @param replElem Elemente (beginnend bei Index 0), die nach dem Kopieren
-   *                 im Array neu gesetzt werden
-   * @return Array von der Groesse {@code max(source.length, replElem.length)}
-   */
-  public static short[] cloneArray(short[] source, short... replElem) {
-    short[] newArray =  java.util.Arrays.copyOf(source, Math.max(source.length, replElem.length));
-    for (int i=0; i<replElem.length; i++)
-      newArray[i] = replElem[i];
-    return newArray;
-  }
+	/**
+	 * Kopiert einen Array und belegt (einige) Elemente direkt neu.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param replElem
+	 *            Elemente (beginnend bei Index 0), die nach dem Kopieren im
+	 *            Array neu gesetzt werden
+	 * @return Array von der Groesse {@code max(source.length, replElem.length)}
+	 */
+	public static byte[] cloneArray(byte[] source, byte... replElem) {
+		byte[] newArray = java.util.Arrays.copyOf(source, Math.max(
+				source.length, replElem.length));
+		for (int i = 0; i < replElem.length; i++)
+			newArray[i] = replElem[i];
+		return newArray;
+	}
 
-  /**
-   * Kopiert einen Array und belegt (einige) Elemente direkt neu.
-   * @param source   zu kopierender Array
-   * @param replElem Elemente (beginnend bei Index 0), die nach dem Kopieren
-   *                 im Array neu gesetzt werden
-   * @return Array von der Groesse {@code max(source.length, replElem.length)}
-   */
-  public static byte[] cloneArray(byte[] source, byte... replElem) {
-    byte[] newArray =  java.util.Arrays.copyOf(source, Math.max(source.length, replElem.length));
-    for (int i=0; i<replElem.length; i++)
-      newArray[i] = replElem[i];
-    return newArray;
-  }
+	/**
+	 * Kopiert einen Array und belegt (einige) Elemente direkt neu.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param replElem
+	 *            Elemente (beginnend bei Index 0), die nach dem Kopieren im
+	 *            Array neu gesetzt werden
+	 * @return Array von der Groesse {@code max(source.length, replElem.length)}
+	 */
+	public static double[] cloneArray(double[] source, double... replElem) {
+		double[] newArray = java.util.Arrays.copyOf(source, Math.max(
+				source.length, replElem.length));
+		for (int i = 0; i < replElem.length; i++)
+			newArray[i] = replElem[i];
+		return newArray;
+	}
 
-  /**
-   * Kopiert einen Array und belegt (einige) Elemente direkt neu.
-   * @param source   zu kopierender Array
-   * @param replElem Elemente (beginnend bei Index 0), die nach dem Kopieren
-   *                 im Array neu gesetzt werden
-   * @return Array von der Groesse {@code max(source.length, replElem.length)}
-   */
-  public static double[] cloneArray(double[] source, double... replElem) {
-    double[] newArray =  java.util.Arrays.copyOf(source, Math.max(source.length, replElem.length));
-    for (int i=0; i<replElem.length; i++)
-      newArray[i] = replElem[i];
-    return newArray;
-  }
+	/**
+	 * Kopiert einen Array und belegt (einige) Elemente direkt neu.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param replElem
+	 *            Elemente (beginnend bei Index 0), die nach dem Kopieren im
+	 *            Array neu gesetzt werden
+	 * @return Array von der Groesse {@code max(source.length, replElem.length)}
+	 */
+	public static float[] cloneArray(float[] source, float... replElem) {
+		float[] newArray = java.util.Arrays.copyOf(source, Math.max(
+				source.length, replElem.length));
+		for (int i = 0; i < replElem.length; i++)
+			newArray[i] = replElem[i];
+		return newArray;
+	}
 
-  /**
-   * Kopiert einen Array und belegt (einige) Elemente direkt neu.
-   * @param source   zu kopierender Array
-   * @param replElem Elemente (beginnend bei Index 0), die nach dem Kopieren
-   *                 im Array neu gesetzt werden
-   * @return Array von der Groesse {@code max(source.length, replElem.length)}
-   */
-  public static float[] cloneArray(float[] source, float... replElem) {
-    float[] newArray =  java.util.Arrays.copyOf(source, Math.max(source.length, replElem.length));
-    for (int i=0; i<replElem.length; i++)
-      newArray[i] = replElem[i];
-    return newArray;
-  }
+	/**
+	 * Kopiert einen Array und belegt (einige) Elemente direkt neu.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param replElem
+	 *            Elemente (beginnend bei Index 0), die nach dem Kopieren im
+	 *            Array neu gesetzt werden
+	 * @return Array von der Groesse {@code max(source.length, replElem.length)}
+	 */
+	public static boolean[] cloneArray(boolean[] source, boolean... replElem) {
+		boolean[] newArray = java.util.Arrays.copyOf(source, Math.max(
+				source.length, replElem.length));
+		for (int i = 0; i < replElem.length; i++)
+			newArray[i] = replElem[i];
+		return newArray;
+	}
 
-  /**
-   * Kopiert einen Array und belegt (einige) Elemente direkt neu.
-   * @param source   zu kopierender Array
-   * @param replElem Elemente (beginnend bei Index 0), die nach dem Kopieren
-   *                 im Array neu gesetzt werden
-   * @return Array von der Groesse {@code max(source.length, replElem.length)}
-   */
-  public static boolean[] cloneArray(boolean[] source, boolean... replElem) {
-    boolean[] newArray =  java.util.Arrays.copyOf(source, Math.max(source.length, replElem.length));
-    for (int i=0; i<replElem.length; i++)
-      newArray[i] = replElem[i];
-    return newArray;
-  }
+	/**
+	 * Kopiert einen Array und belegt (einige) Elemente direkt neu.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param replElem
+	 *            Elemente (beginnend bei Index 0), die nach dem Kopieren im
+	 *            Array neu gesetzt werden
+	 * @return Array von der Groesse {@code max(source.length, replElem.length)}
+	 */
+	public static char[] cloneArray(char[] source, char... replElem) {
+		char[] newArray = java.util.Arrays.copyOf(source, Math.max(
+				source.length, replElem.length));
+		for (int i = 0; i < replElem.length; i++)
+			newArray[i] = replElem[i];
+		return newArray;
+	}
 
-  /**
-   * Kopiert einen Array und belegt (einige) Elemente direkt neu.
-   * @param source   zu kopierender Array
-   * @param replElem Elemente (beginnend bei Index 0), die nach dem Kopieren
-   *                 im Array neu gesetzt werden
-   * @return Array von der Groesse {@code max(source.length, replElem.length)}
-   */
-  public static char[] cloneArray(char[] source, char... replElem) {
-    char[] newArray =  java.util.Arrays.copyOf(source, Math.max(source.length, replElem.length));
-    for (int i=0; i<replElem.length; i++)
-      newArray[i] = replElem[i];
-    return newArray;
-  }
+	/**
+	 * Erweitert einen Array.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param newElem
+	 *            Elemente, die an das Ende des Arrays angehaengt werden
+	 * @return Array von der Groesse {@code source.length + newElem.length}
+	 */
+	public static <T> T[] extendArray(T[] source, T... newElem) {
+		T[] newArray = java.util.Arrays.copyOf(source, source.length
+				+ newElem.length);
+		for (int i = 0; i < newElem.length; i++)
+			newArray[source.length + i] = newElem[i];
+		return newArray;
+	}
 
-  /**
-   * Erweitert einen Array.
-   * @param source   zu kopierender Array
-   * @param newElem  Elemente, die an das Ende des Arrays angehaengt werden
-   * @return Array von der Groesse {@code source.length + newElem.length}
-   */
-  public static <T> T[] extendArray(T[] source, T... newElem) {
-    T[] newArray =  java.util.Arrays.copyOf(source, source.length+newElem.length);
-    for (int i=0; i<newElem.length; i++)
-      newArray[source.length+i] = newElem[i];
-    return newArray;
-  }
+	/**
+	 * Erweitert einen Array.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param newElem
+	 *            Elemente, die an das Ende des Arrays angehaengt werden
+	 * @return Array von der Groesse {@code source.length + newElem.length}
+	 */
+	public static long[] extendArray(long[] source, long... newElem) {
+		long[] newArray = java.util.Arrays.copyOf(source, source.length
+				+ newElem.length);
+		for (int i = 0; i < newElem.length; i++)
+			newArray[source.length + i] = newElem[i];
+		return newArray;
+	}
 
-  /**
-   * Erweitert einen Array.
-   * @param source   zu kopierender Array
-   * @param newElem  Elemente, die an das Ende des Arrays angehaengt werden
-   * @return Array von der Groesse {@code source.length + newElem.length}
-   */
-  public static long[] extendArray(long[] source, long... newElem) {
-    long[] newArray =  java.util.Arrays.copyOf(source, source.length+newElem.length);
-    for (int i=0; i<newElem.length; i++)
-      newArray[source.length+i] = newElem[i];
-    return newArray;
-  }
+	/**
+	 * Erweitert einen Array.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param newElem
+	 *            Elemente, die an das Ende des Arrays angehaengt werden
+	 * @return Array von der Groesse {@code source.length + newElem.length}
+	 */
+	public static int[] extendArray(int[] source, int... newElem) {
+		int[] newArray = java.util.Arrays.copyOf(source, source.length
+				+ newElem.length);
+		for (int i = 0; i < newElem.length; i++)
+			newArray[source.length + i] = newElem[i];
+		return newArray;
+	}
 
-  /**
-   * Erweitert einen Array.
-   * @param source   zu kopierender Array
-   * @param newElem  Elemente, die an das Ende des Arrays angehaengt werden
-   * @return Array von der Groesse {@code source.length + newElem.length}
-   */
-  public static int[] extendArray(int[] source, int... newElem) {
-    int[] newArray = java.util.Arrays.copyOf(source, source.length+newElem.length);
-    for (int i=0; i<newElem.length; i++)
-      newArray[source.length+i] = newElem[i];
-    return newArray;
-  }
+	/**
+	 * Erweitert einen Array.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param newElem
+	 *            Elemente, die an das Ende des Arrays angehaengt werden
+	 * @return Array von der Groesse {@code source.length + newElem.length}
+	 */
+	public static short[] extendArray(short[] source, short... newElem) {
+		short[] newArray = java.util.Arrays.copyOf(source, source.length
+				+ newElem.length);
+		for (int i = 0; i < newElem.length; i++)
+			newArray[source.length + i] = newElem[i];
+		return newArray;
+	}
 
-  /**
-   * Erweitert einen Array.
-   * @param source   zu kopierender Array
-   * @param newElem  Elemente, die an das Ende des Arrays angehaengt werden
-   * @return Array von der Groesse {@code source.length + newElem.length}
-   */
-  public static short[] extendArray(short[] source, short... newElem) {
-    short[] newArray =  java.util.Arrays.copyOf(source, source.length+newElem.length);
-    for (int i=0; i<newElem.length; i++)
-      newArray[source.length+i] = newElem[i];
-    return newArray;
-  }
+	/**
+	 * Erweitert einen Array.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param newElem
+	 *            Elemente, die an das Ende des Arrays angehaengt werden
+	 * @return Array von der Groesse {@code source.length + newElem.length}
+	 */
+	public static byte[] extendArray(byte[] source, byte... newElem) {
+		byte[] newArray = java.util.Arrays.copyOf(source, source.length
+				+ newElem.length);
+		for (int i = 0; i < newElem.length; i++)
+			newArray[source.length + i] = newElem[i];
+		return newArray;
+	}
 
-  /**
-   * Erweitert einen Array.
-   * @param source   zu kopierender Array
-   * @param newElem  Elemente, die an das Ende des Arrays angehaengt werden
-   * @return Array von der Groesse {@code source.length + newElem.length}
-   */
-  public static byte[] extendArray(byte[] source, byte... newElem) {
-    byte[] newArray =  java.util.Arrays.copyOf(source, source.length+newElem.length);
-    for (int i=0; i<newElem.length; i++)
-      newArray[source.length+i] = newElem[i];
-    return newArray;
-  }
+	/**
+	 * Erweitert einen Array.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param newElem
+	 *            Elemente, die an das Ende des Arrays angehaengt werden
+	 * @return Array von der Groesse {@code source.length + newElem.length}
+	 */
+	public static double[] extendArray(double[] source, double... newElem) {
+		double[] newArray = java.util.Arrays.copyOf(source, source.length
+				+ newElem.length);
+		for (int i = 0; i < newElem.length; i++)
+			newArray[source.length + i] = newElem[i];
+		return newArray;
+	}
 
-  /**
-   * Erweitert einen Array.
-   * @param source   zu kopierender Array
-   * @param newElem  Elemente, die an das Ende des Arrays angehaengt werden
-   * @return Array von der Groesse {@code source.length + newElem.length}
-   */
-  public static double[] extendArray(double[] source, double... newElem) {
-    double[] newArray =  java.util.Arrays.copyOf(source, source.length+newElem.length);
-    for (int i=0; i<newElem.length; i++)
-      newArray[source.length+i] = newElem[i];
-    return newArray;
-  }
+	/**
+	 * Erweitert einen Array.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param newElem
+	 *            Elemente, die an das Ende des Arrays angehaengt werden
+	 * @return Array von der Groesse {@code source.length + newElem.length}
+	 */
+	public static float[] extendArray(float[] source, float... newElem) {
+		float[] newArray = java.util.Arrays.copyOf(source, source.length
+				+ newElem.length);
+		for (int i = 0; i < newElem.length; i++)
+			newArray[source.length + i] = newElem[i];
+		return newArray;
+	}
 
-  /**
-   * Erweitert einen Array.
-   * @param source   zu kopierender Array
-   * @param newElem  Elemente, die an das Ende des Arrays angehaengt werden
-   * @return Array von der Groesse {@code source.length + newElem.length}
-   */
-  public static float[] extendArray(float[] source, float... newElem) {
-    float[] newArray =  java.util.Arrays.copyOf(source, source.length+newElem.length);
-    for (int i=0; i<newElem.length; i++)
-      newArray[source.length+i] = newElem[i];
-    return newArray;
-  }
+	/**
+	 * Erweitert einen Array.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param newElem
+	 *            Elemente, die an das Ende des Arrays angehaengt werden
+	 * @return Array von der Groesse {@code source.length + newElem.length}
+	 */
+	public static boolean[] extendArray(boolean[] source, boolean... newElem) {
+		boolean[] newArray = java.util.Arrays.copyOf(source, source.length
+				+ newElem.length);
+		for (int i = 0; i < newElem.length; i++)
+			newArray[source.length + i] = newElem[i];
+		return newArray;
+	}
 
-  /**
-   * Erweitert einen Array.
-   * @param source   zu kopierender Array
-   * @param newElem  Elemente, die an das Ende des Arrays angehaengt werden
-   * @return Array von der Groesse {@code source.length + newElem.length}
-   */
-  public static boolean[] extendArray(boolean[] source, boolean... newElem) {
-    boolean[] newArray =  java.util.Arrays.copyOf(source, source.length+newElem.length);
-    for (int i=0; i<newElem.length; i++)
-      newArray[source.length+i] = newElem[i];
-    return newArray;
-  }
+	/**
+	 * Erweitert einen Array.
+	 * 
+	 * @param source
+	 *            zu kopierender Array
+	 * @param newElem
+	 *            Elemente, die an das Ende des Arrays angehaengt werden
+	 * @return Array von der Groesse {@code source.length + newElem.length}
+	 */
+	public static char[] extendArray(char[] source, char... newElem) {
+		char[] newArray = java.util.Arrays.copyOf(source, source.length
+				+ newElem.length);
+		for (int i = 0; i < newElem.length; i++)
+			newArray[source.length + i] = newElem[i];
+		return newArray;
+	}
 
-  /**
-   * Erweitert einen Array.
-   * @param source   zu kopierender Array
-   * @param newElem  Elemente, die an das Ende des Arrays angehaengt werden
-   * @return Array von der Groesse {@code source.length + newElem.length}
-   */
-  public static char[] extendArray(char[] source, char... newElem) {
-    char[] newArray =  java.util.Arrays.copyOf(source, source.length+newElem.length);
-    for (int i=0; i<newElem.length; i++)
-      newArray[source.length+i] = newElem[i];
-    return newArray;
-  }
+	/**
+	 * Liefert die Klassen-Namen zu einem Array von Klassen.
+	 * 
+	 * @param clazz
+	 *            Klassen
+	 * @param simple
+	 *            gibt an, ob der einfache Klassenname ({@code true}) oder der
+	 *            komplette Klassenname inkl. Paketname ({@code false})
+	 *            zurueckgegeben wird.
+	 */
+	public static String[] getClassNames(Class[] clazz, boolean simple) {
+		String[] className = new String[clazz.length];
+		for (int i = 0; i < className.length; i++)
+			className[i] = simple ? clazz[i].getSimpleName() : clazz[i]
+					.getName();
+		return className;
+	}
 
-  /**
-   * Liefert die Klassen-Namen zu einem Array von Klassen.
-   * @param clazz  Klassen
-   * @param simple gibt an, ob der einfache Klassenname ({@code true}) oder der
-   *               komplette Klassenname inkl. Paketname ({@code false})
-   *               zurueckgegeben wird.
-   */
-  public static String[] getClassNames(Class[] clazz, boolean simple) {
-    String[] className = new String[clazz.length];
-    for (int i=0; i<className.length; i++)
-      className[i] = simple ? clazz[i].getSimpleName() : clazz[i].getName();
-    return className;
-  }
+	/**
+	 * Ruft die Java Garbage Collection auf.
+	 * 
+	 * @return Anzahl an Bytes, die durch den Aufruf der Garbage Collection
+	 *         freigegeben wurden
+	 * @see Runtime#gc()
+	 * @see Runtime#freeMemory()
+	 */
+	public static long gc() {
+		Runtime runtime = Runtime.getRuntime();
+		long prevFreeMem = runtime.freeMemory();
+		runtime.gc();
+		return runtime.freeMemory() - prevFreeMem;
+	}
 
-  /**
-   * Ruft die Java Garbage Collection auf.
-   * @return Anzahl an Bytes, die durch den Aufruf der Garbage Collection
-   *         freigegeben wurden
-   * @see Runtime#gc()
-   * @see Runtime#freeMemory()
-   */
-  public static long gc() {
-    Runtime runtime = Runtime.getRuntime();
-    long prevFreeMem = runtime.freeMemory();
-    runtime.gc();
-    return runtime.freeMemory() - prevFreeMem;
-  }
+	/**
+	 * Ruft die Java Garbage Collection solange auf, bis kein Speicher mehr
+	 * freigegeben werden kann.
+	 * 
+	 * @return Gesamt-Anzahl an Bytes, die durch die Aufrufe der Garbage
+	 *         Collection freigegeben wurden
+	 * @see #gc()
+	 */
+	public static long gcTotal() {
+		long totalFreedMem = 0;
+		for (long freedMem = 0; (freedMem = gc()) > 0;)
+			totalFreedMem += freedMem;
+		return totalFreedMem;
+	}
 
-  /**
-   * Ruft die Java Garbage Collection solange auf, bis kein Speicher mehr
-   * freigegeben werden kann.
-   * @return Gesamt-Anzahl an Bytes, die durch die Aufrufe der Garbage Collection
-   *         freigegeben wurden
-   * @see #gc()
-   */
-  public static long gcTotal() {
-    long totalFreedMem = 0;
-    for ( long freedMem=0; (freedMem = gc()) > 0; )
-     totalFreedMem += freedMem;
-    return totalFreedMem;
-  }
+	/**
+	 * Erzeugt einen neuen {@link URLClassLoader}, der vom
+	 * {@linkplain ClassLoader#getSystemClassLoader() System-ClassLoaders}
+	 * abgeleitet ist.
+	 * 
+	 * @param searchPath
+	 *            Pfade, in denen der ClassLoader nach Klassen sucht
+	 */
+	public static ClassLoader createClassLoader(URL[] searchPath) {
+		return URLClassLoader.newInstance(searchPath, ClassLoader
+				.getSystemClassLoader());
+	}
 
-  /**
-   * Erzeugt einen neuen {@link URLClassLoader}, der vom
-   * {@linkplain ClassLoader#getSystemClassLoader() System-ClassLoaders}
-   * abgeleitet ist.
-   * @param searchPath Pfade, in denen der ClassLoader nach Klassen sucht
-   */
-  public static ClassLoader createClassLoader(URL[] searchPath) {
-    return URLClassLoader.newInstance( searchPath, ClassLoader.getSystemClassLoader() );
-  }
+	/**
+	 * Erzeugt einen neuen {@link URLClassLoader}, der vom
+	 * {@linkplain ClassLoader#getSystemClassLoader() System-ClassLoaders}
+	 * abgeleitet ist.
+	 * 
+	 * @param searchPath
+	 *            Pfad, in denm der ClassLoader nach Klassen sucht
+	 */
+	public static ClassLoader createClassLoader(URL searchPath) {
+		return createClassLoader(new URL[] { searchPath });
+	}
 
-  /**
-   * Erzeugt einen neuen {@link URLClassLoader}, der vom
-   * {@linkplain ClassLoader#getSystemClassLoader() System-ClassLoaders}
-   * abgeleitet ist.
-   * @param searchPath Pfad, in denm der ClassLoader nach Klassen sucht
-   */
-  public static ClassLoader createClassLoader(URL searchPath) {
-    return createClassLoader( new URL[] {searchPath} );
-  }
+	/**
+	 * Laed eine Klasse. Ggf. wird hierfuer ein neuer {@link ClassLoader}
+	 * erzeugt.
+	 * 
+	 * @param clazz
+	 *            Klassenname (inkl. Paket)
+	 * @param searchPath
+	 *            Pfade, in denen der ClassLoader nach Klassen sucht (wenn
+	 *            <code>null</code>, wird der
+	 *            {@linkplain ClassLoader#getSystemClassLoader()
+	 *            System-ClassLoader} zum Laden der Klasse verwendet)
+	 */
+	public static Class loadClass(String clazz, URL[] searchPath)
+			throws ClassNotFoundException {
+		if (searchPath == null)
+			return Class.forName(clazz);
+		return createClassLoader(searchPath).loadClass(clazz);
+	}
 
-  /**
-   * Laed eine Klasse. Ggf. wird hierfuer ein neuer {@link ClassLoader}
-   * erzeugt.
-   * @param clazz      Klassenname (inkl. Paket)
-   * @param searchPath Pfade, in denen der ClassLoader nach Klassen sucht
-   *                   (wenn <code>null</code>, wird der
-   *                   {@linkplain ClassLoader#getSystemClassLoader() System-ClassLoader}
-   *                   zum Laden der Klasse verwendet)
-   */
-  public static Class loadClass(String clazz, URL[] searchPath) throws ClassNotFoundException {
-    if ( searchPath == null )
-      return Class.forName(clazz);
-    return createClassLoader(searchPath).loadClass(clazz);
-  }
+	/**
+	 * Laed eine Klasse. Ggf. wird hierfuer ein neuer {@link ClassLoader}
+	 * erzeugt.
+	 * 
+	 * @param clazz
+	 *            Klassenname (inkl. Paket)
+	 * @param searchPath
+	 *            Pfad, in dem der ClassLoader nach Klassen sucht (wenn
+	 *            <code>null</code>, wird der
+	 *            {@linkplain ClassLoader#getSystemClassLoader()
+	 *            System-ClassLoader} zum Laden der Klasse verwendet)
+	 */
+	public static Class loadClass(String clazz, URL searchPath)
+			throws ClassNotFoundException {
+		if (searchPath == null)
+			return Class.forName(clazz);
+		return createClassLoader(searchPath).loadClass(clazz);
+	}
 
-  /**
-   * Laed eine Klasse. Ggf. wird hierfuer ein neuer {@link ClassLoader}
-   * erzeugt.
-   * @param clazz      Klassenname (inkl. Paket)
-   * @param searchPath Pfad, in dem der ClassLoader nach Klassen sucht
-   *                   (wenn <code>null</code>, wird der
-   *                   {@linkplain ClassLoader#getSystemClassLoader() System-ClassLoader}
-   *                   zum Laden der Klasse verwendet)
-   */
-  public static Class loadClass(String clazz, URL searchPath) throws ClassNotFoundException {
-    if ( searchPath == null )
-      return Class.forName(clazz);
-    return createClassLoader(searchPath).loadClass(clazz);
-  }
-
-  /**
-	 *
-	 * Laed eine Klasse derart das Klassen im Cache ignoriert werden. Dazu ist es erforderlich
-	 * das unter dem Parameter <code>searchPath</code> eine Verzeichnis "META-INF" vorhanden ist.
-	 * Darin muss eine Datei "PREFERRED.LIST" sein. Wie genau diese Datei aufgebaut sein muss, lässt
-	 * sich in der Dokumentation des {@link PreferredClassLoader PreferredClassLoaders} nachlesen.
-	 *
-	 * @param classname  Klassenname (inkl. Paket)
-	 * @param searchPath Pfad, in dem der ClassLoader nach Klassen sucht
-	 *                   (wenn <code>null</code>, wird der System-Klassenpfad
-	 *                   {@linkplain ClassLoader#getSystemResource(String) ClassLoader.getSystemResource("")}
-	 *                   zum Laden der Klasse verwendet)
+	/**
+	 * 
+	 * Laed eine Klasse derart das Klassen im Cache ignoriert werden. Dazu ist
+	 * es erforderlich das unter dem Parameter <code>searchPath</code> eine
+	 * Verzeichnis "META-INF" vorhanden ist. Darin muss eine Datei
+	 * "PREFERRED.LIST" sein. Wie genau diese Datei aufgebaut sein muss, lässt
+	 * sich in der Dokumentation des {@link PreferredClassLoader
+	 * PreferredClassLoaders} nachlesen.
+	 * 
+	 * @param classname
+	 *            Klassenname (inkl. Paket)
+	 * @param searchPath
+	 *            Pfad, in dem der ClassLoader nach Klassen sucht (wenn
+	 *            <code>null</code>, wird der System-Klassenpfad
+	 *            {@linkplain ClassLoader#getSystemResource(String)
+	 *            ClassLoader.getSystemResource("")} zum Laden der Klasse
+	 *            verwendet)
 	 * @throws ClassNotFoundException
 	 * @see PreferredClassLoader
-	 *
-	 *  @author Dominik Appl
+	 * 
+	 * @author Dominik Appl
 	 */
 	public static Class loadPreferredClass(String classname, URL searchPath)
 			throws ClassNotFoundException {
-                if ( searchPath == null )
-                  // System-Klassenpfad verwenden
-                  searchPath = ClassLoader.getSystemResource("");
+		if (searchPath == null)
+			// System-Klassenpfad verwenden
+			searchPath = ClassLoader.getSystemResource("");
 		PreferredClassLoader classLoader = new PreferredClassLoader(
-				new URL[]{searchPath}, Thread.currentThread()
+				new URL[] { searchPath }, Thread.currentThread()
 						.getContextClassLoader(), null, false);
 		Class loadedClass = classLoader.loadClass(classname);
 		if (loadedClass == null)
@@ -686,362 +860,471 @@
 		return loadedClass;
 	}
 
-  /**
-   * Laed eine Klasse neu und erzeugt eine Objekt-Instanz. Als Suchpfad fuer
-   * die Klasse der System-Klassenpfad
-   * {@linkplain ClassLoader#getSystemResource(String) ClassLoader.getSystemResource("")}
-   * verwendet.
-   * @param classname Klassenname (inkl. Paket)
-   * @param param Parameter fuer den Konstruktor-Aufruf
-   * @exception RuntimeException falls irgendein Fehler auftritt
-   */
-  public static Object loadPreferredObject(String classname, Object... param) {
-    return loadPreferredObject(classname,null,param);
-  }
+	/**
+	 * Laed eine Klasse neu und erzeugt eine Objekt-Instanz. Als Suchpfad fuer
+	 * die Klasse der System-Klassenpfad
+	 * {@linkplain ClassLoader#getSystemResource(String)
+	 * ClassLoader.getSystemResource("")} verwendet.
+	 * 
+	 * @param classname
+	 *            Klassenname (inkl. Paket)
+	 * @param param
+	 *            Parameter fuer den Konstruktor-Aufruf
+	 * @exception RuntimeException
+	 *                falls irgendein Fehler auftritt
+	 */
+	public static Object loadPreferredObject(String classname, Object... param) {
+		return loadPreferredObject(classname, null, param);
+	}
 
-  /**
-   * Laed eine Klasse neu und erzeugt eine Objekt-Instanz.
-   * @param classname Klassenname (inkl. Paket)
-   * @param searchPath Pfad, in dem der ClassLoader nach Klassen sucht
-   *                   (wenn <code>null</code>, wird der System-Klassenpfad
-   *                   {@linkplain ClassLoader#getSystemResource(String) ClassLoader.getSystemResource("")}
-   *                   zum Laden der Klasse verwendet)
-   * @param param Parameter fuer den Konstruktor-Aufruf
-   * @exception RuntimeException falls irgendein Fehler auftritt
-   */
-  public static Object loadPreferredObject(String classname, URL searchPath, Object... param) {
-    try {
-      // Klasse laden
-      Class clazz = loadPreferredClass(classname,searchPath);
-//      // Klassen der Konstruktor-Parameter ermitteln
-//      Class[] paramClass = new Class[ param.length ];
-//      for (int i=0; i<paramClass.length; i++)
-//        paramClass[i] = param[i].getClass();
-//      // Konstruktor fuer Parameter ermitteln (erfordert exakes Matching
-//      // zwischen den Klassen der uebergebenen Parameter und der Klassen
-//      // der Konstruktor-Parameter!)
-//      Constructor constructor = clazz.getConstructor(paramClass);
-      // Konstruktor fuer Parameter ausprobieren
-      for ( Constructor constructor : clazz.getConstructors() )
-        try {
-          return constructor.newInstance(param);
-        } catch (IllegalArgumentException err) {
-        }
-        // kein passender Konstruktor gefunden
-        throw new UnsupportedOperationException("No matching constructor found...");
-    } catch (Exception err) {
-      throw new RuntimeException(err);
-    }
-  }
+	/**
+	 * Laed eine Klasse neu und erzeugt eine Objekt-Instanz.
+	 * 
+	 * @param classname
+	 *            Klassenname (inkl. Paket)
+	 * @param searchPath
+	 *            Pfad, in dem der ClassLoader nach Klassen sucht (wenn
+	 *            <code>null</code>, wird der System-Klassenpfad
+	 *            {@linkplain ClassLoader#getSystemResource(String)
+	 *            ClassLoader.getSystemResource("")} zum Laden der Klasse
+	 *            verwendet)
+	 * @param param
+	 *            Parameter fuer den Konstruktor-Aufruf
+	 * @exception RuntimeException
+	 *                falls irgendein Fehler auftritt
+	 */
+	public static Object loadPreferredObject(String classname, URL searchPath,
+			Object... param) {
+		try {
+			// Klasse laden
+			Class clazz = loadPreferredClass(classname, searchPath);
+			// // Klassen der Konstruktor-Parameter ermitteln
+			// Class[] paramClass = new Class[ param.length ];
+			// for (int i=0; i<paramClass.length; i++)
+			// paramClass[i] = param[i].getClass();
+			// // Konstruktor fuer Parameter ermitteln (erfordert exakes
+			// Matching
+			// // zwischen den Klassen der uebergebenen Parameter und der
+			// Klassen
+			// // der Konstruktor-Parameter!)
+			// Constructor constructor = clazz.getConstructor(paramClass);
+			// Konstruktor fuer Parameter ausprobieren
+			for (Constructor constructor : clazz.getConstructors())
+				try {
+					return constructor.newInstance(param);
+				} catch (IllegalArgumentException err) {
+				}
+			// kein passender Konstruktor gefunden
+			throw new UnsupportedOperationException(
+					"No matching constructor found...");
+		} catch (Exception err) {
+			throw new RuntimeException(err);
+		}
+	}
 
+	/**
+	 * Liefert das Package einer Klasse erweitert um einen relativen Pfad in
+	 * Punkt-Notation.
+	 * 
+	 * @param clazz
+	 *            eine Klasse
+	 * @param pathExt
+	 *            Erweiterung des Pfads
+	 */
+	public static String extendPackagePath(Class clazz, String pathExt) {
+		String packagePath = clazz.getPackage().getName();
+		if (pathExt != null && !pathExt.trim().equals(""))
+			packagePath += "." + pathExt;
+		return packagePath;
+	}
 
-  /**
-   * Liefert das Package einer Klasse erweitert um einen relativen Pfad
-   * in Punkt-Notation.
-   * @param clazz eine Klasse
-   * @param pathExt Erweiterung des Pfads
-   */
-  public static String extendPackagePath(Class clazz, String pathExt) {
-    String packagePath = clazz.getPackage().getName();
-    if ( pathExt != null && !pathExt.trim().equals("") )
-      packagePath += "." + pathExt;
-    return packagePath;
-  }
+	/**
+	 * Prueft einen Identifier auf Korrektheit.
+	 * 
+	 * @param identifier
+	 *            Identifier
+	 * @exception IllegalArgumentException
+	 *                falls der Identifier nicht-erlaubte Zeichen enthaelt
+	 * @see Character#isJavaIdentifierStart(char)
+	 * @see Character#isJavaIdentifierPart(char)
+	 */
+	public static void checkIdentifierAndError(String identifier) {
+		if (!Character.isJavaIdentifierStart(identifier.charAt(0)))
+			throw new IllegalArgumentException("Illegal first character '"
+					+ identifier.charAt(0) + "'");
+		for (int i = 1; i < identifier.length(); i++) {
+			char c = identifier.charAt(i);
+			if (!Character.isJavaIdentifierPart(c))
+				throw new IllegalArgumentException("Illegal inner character '"
+						+ c + "'");
+		}
+	}
 
+	/**
+	 * Prueft einen Identifier auf Korrektheit.
+	 * 
+	 * @param identifier
+	 *            Identifier
+	 * @see #checkIdentifierAndError(String)
+	 */
+	public static boolean checkIdentifier(String identifier) {
+		try {
+			checkIdentifierAndError(identifier);
+			return true;
+		} catch (Exception err) {
+			return false;
+		}
+	}
 
-  /**
-   * Prueft einen Identifier auf Korrektheit.
-   * @param identifier Identifier
-   * @exception IllegalArgumentException falls der Identifier nicht-erlaubte
-   *            Zeichen enthaelt
-   * @see Character#isJavaIdentifierStart(char)
-   * @see Character#isJavaIdentifierPart(char)
-   */
-  public static void checkIdentifierAndError(String identifier) {
-    if ( !Character.isJavaIdentifierStart( identifier.charAt(0) ) )
-      throw new IllegalArgumentException("Illegal first character '"+identifier.charAt(0)+"'");
-    for (int i=1; i<identifier.length(); i++) {
-      char c = identifier.charAt(i);
-      if ( !Character.isJavaIdentifierPart(c) )
-        throw new IllegalArgumentException("Illegal inner character '"+c+"'");
-    }
-  }
+	/**
+	 * Sortiert einen Array aus beliebigen Objekten nach der natuerlichen
+	 * Sortierung ihrer {@code toString()}-Werte.
+	 * 
+	 * @param objects
+	 *            Objekte
+	 */
+	public static void sort(Object[] objects) {
+		Arrays.sort(objects, new Comparator<Object>() {
+			public int compare(Object c1, Object c2) {
+				return c1.toString().compareTo(c2.toString());
+			}
+		});
+	}
 
-  /**
-   * Prueft einen Identifier auf Korrektheit.
-   * @param identifier Identifier
-   * @see #checkIdentifierAndError(String)
-   */
-  public static boolean checkIdentifier(String identifier) {
-    try {
-      checkIdentifierAndError(identifier);
-      return true;
-    } catch ( Exception err ) {
-      return false;
-    }
-  }
+	/**
+	 * Returns the maximum value of some integer collections.
+	 * 
+	 * @param defMaxValue
+	 *            value taken as maximum if a collection is empty
+	 * @param collections
+	 *            some collections
+	 */
+	public static int max(int defMaxValue, Collection<Integer>... collections) {
+		int maxValue = defMaxValue;
+		for (Collection<Integer> collection : collections) {
+			int collMax = defMaxValue;
+			if (collection != null && !collection.isEmpty())
+				collMax = Collections.max(collection);
+			maxValue = Math.max(maxValue, collMax);
+		}
+		return maxValue;
+	}
 
-  /**
-   * Sortiert einen Array aus beliebigen Objekten nach der natuerlichen
-   * Sortierung ihrer {@code toString()}-Werte.
-   * @param objects Objekte
-   */
-  public static void sort(Object[] objects) {
-    Arrays.sort( objects, new Comparator<Object>() {
-      public int compare(Object c1, Object c2) {
-        return c1.toString().compareTo(c2.toString());
-      }
-    });
-  }
-  
-  /**
-   * Returns the maximum value of some integer collections.
-   * @param defMaxValue value taken as maximum if a collection is empty
-   * @param collections some collections
-   */
-  public static int max(int defMaxValue, Collection<Integer>... collections) {
-    int maxValue = defMaxValue;
-    for (Collection<Integer> collection : collections) {
-      int collMax = defMaxValue;
-      if ( collection != null && !collection.isEmpty() )
-        collMax = Collections.max(collection);
-      maxValue = Math.max( maxValue, collMax );
-    }
-    return maxValue;
-  }
-  
-  /**
-   * Returns the maximum value of some integer collections. If
-   * a collection is empty, 0 is taken as its maximum value.
-   * @param collections some collections
-   */
-  public static int max(Collection<Integer>... collections) {
-    return max(0,collections);
-  }
+	/**
+	 * Returns the maximum value of some integer collections. If a collection is
+	 * empty, 0 is taken as its maximum value.
+	 * 
+	 * @param collections
+	 *            some collections
+	 */
+	public static int max(Collection<Integer>... collections) {
+		return max(0, collections);
+	}
 
-  /**
-   * Returns the minimum value of some integer collections.
-   * @param defMinValue value taken as minimum if a collection is empty
-   * @param collections some collections
-   */
-  public static int min(int defMinValue, Collection<Integer>... collections) {
-    int minValue = defMinValue;
-    for (Collection<Integer> collection : collections) {
-      int collMin = defMinValue;
-      if ( collection != null && !collection.isEmpty() )
-        collMin = Collections.min(collection);
-      minValue = Math.min( minValue, collMin );
-    }
-    return minValue;
-  }
-  
-  /**
-   * Returns the minimum value of some integer collections. If
-   * a collection is empty, 0 is taken as its minimum value.
-   * @param collections some collections
-   */
-  public static int min(Collection<Integer>... collections) {
-    return min(0,collections);
-  }
+	/**
+	 * Returns the minimum value of some integer collections.
+	 * 
+	 * @param defMinValue
+	 *            value taken as minimum if a collection is empty
+	 * @param collections
+	 *            some collections
+	 */
+	public static int min(int defMinValue, Collection<Integer>... collections) {
+		int minValue = defMinValue;
+		for (Collection<Integer> collection : collections) {
+			int collMin = defMinValue;
+			if (collection != null && !collection.isEmpty())
+				collMin = Collections.min(collection);
+			minValue = Math.min(minValue, collMin);
+		}
+		return minValue;
+	}
 
-  /**
-   * Rundet einen Wert auf Nach- oder Vorkommastellen.
-   * @param value Wert
-   * @param digits Anzahl an Nachkommastellen (negative Werte runden auf
-   *               Vorkommastellen, also 10er-, 100er-, usw. Stelle)
-   * @param mode Modus für das Runden (0 = normal Runden, 1 = Aufrunden, -1 = Abrunden;
-   *             wenn nicht angegeben, wird normal gerundet)
-   */
-  public static double round(double value, int digits, int... mode) {
-    int roundMode = 0; // Default: Normal-Runden
-    if ( mode.length > 0 )
-      roundMode = mode[0];
+	/**
+	 * Returns the minimum value of some integer collections. If a collection is
+	 * empty, 0 is taken as its minimum value.
+	 * 
+	 * @param collections
+	 *            some collections
+	 */
+	public static int min(Collection<Integer>... collections) {
+		return min(0, collections);
+	}
 
-    // 10er-Potenz fuer Nachkommestellen bilden um vor dem Runden
-    // die Nachkommastellen "vor das Komma" zu schieben
-    double digitsFactor = Math.pow(10, digits);
-    value = value * digitsFactor;
-    // Runden
-    if ( roundMode < 0 )
-      value = Math.floor(value);
-    else if ( roundMode > 0 )
-      value = Math.ceil(value);
-    else
-      value = Math.round(value);
+	/**
+	 * Rundet einen Wert auf Nach- oder Vorkommastellen.
+	 * 
+	 * @param value
+	 *            Wert
+	 * @param digits
+	 *            Anzahl an Nachkommastellen (negative Werte runden auf
+	 *            Vorkommastellen, also 10er-, 100er-, usw. Stelle)
+	 * @param mode
+	 *            Modus für das Runden (0 = normal Runden, 1 = Aufrunden, -1 =
+	 *            Abrunden; wenn nicht angegeben, wird normal gerundet)
+	 */
+	public static double round(double value, int digits, int... mode) {
+		int roundMode = 0; // Default: Normal-Runden
+		if (mode.length > 0)
+			roundMode = mode[0];
 
-    // Nachkommastellen wieder hinter das Komma schieben
-    return value / digitsFactor;
-  }
+		// 10er-Potenz fuer Nachkommestellen bilden um vor dem Runden
+		// die Nachkommastellen "vor das Komma" zu schieben
+		double digitsFactor = Math.pow(10, digits);
+		value = value * digitsFactor;
+		// Runden
+		if (roundMode < 0)
+			value = Math.floor(value);
+		else if (roundMode > 0)
+			value = Math.ceil(value);
+		else
+			value = Math.round(value);
 
-  /**
-   * Rundet alle Werte einer {@link Collection} auf Nach- oder Vorkommastellen.<br>
-   * <b>Achtung:</b><br>
-   * Es wird eine neue {@link Collection} des gleichen Typs erzeugt und die
-   * gerundeten Werte darin in der Reihenfolge eingefuegt, wie sie von
-   * {@link Collection#iterator()} geliefert werden! Unter umstaenden kann
-   * die urspruengliche Sortierung verloren gehen! Diese Methode sollte also
-   * im Zweifelsfall nur auf automatisch sortierte {@link Collection Collections}
-   * angewandt werden (z.B. {@link TreeSet}).
-   * @param values Werte
-   * @param digits Anzahl an Nachkommastellen (negative Werte runden auf
-   *               Vorkommastellen, also 10er-, 100er-, usw. Stelle)
-   * @param mode Modus für das Runden (0 = normal Runden, 1 = Aufrunden, -1 = Abrunden;
-   *             wenn nicht angegeben, wird normal gerundet)
-   */
-  public static Collection<Number> round(Collection<Number> values, int digits, int... mode) {
-    try {
-      Collection<Number> newCollection = values.getClass().newInstance();
-      for (Number value : values) {
-        newCollection.add( round(value.doubleValue(),digits,mode) );
-      }
-      return newCollection;
-    } catch (Exception err) {
-      throw new IllegalArgumentException("Can not handle collection: "+getSimpleClassName(values),err);
-    }
-  }
-  
-  /**
-   * Puts a text to system clipboard.
-   * @param str a text
-   */
-  public static void copyToClipboard(String str) {
-    if ( str == null )
-      return;
-    StringSelection sel = new StringSelection( str );
-    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(sel,sel);
-  }
-  
-  
-  /**
-   * Returns the class names of the top of a stack trace. Duplicate class names
-   * are eliminated.
-   * @param stackTrace stack trace to explore
-   * @param depth      maximum count of classes, which are explored in the stack
-   *                   trace
-   */
-  public static String[] getLastStackTraceClasses(StackTraceElement[] stackTrace, int depth) {
-    Vector<String> lastClasses = new Vector<String>();
-    for (StackTraceElement st : stackTrace) {
-      String className = st.getClassName();
-      if ( !lastClasses.contains(className) )
-        lastClasses.add(className);
-      if ( lastClasses.size() >= depth )
-        break;
-    }
-    return lastClasses.toArray(new String[0]);
-  }
+		// Nachkommastellen wieder hinter das Komma schieben
+		return value / digitsFactor;
+	}
 
-  /**
-   * Prints the last X classes from a stack trace.
-   * @param stackTrace stack trace to explore
-   * @param depth      maximum count of classes, which are explored in the stack
-   *                   trace
-   * @param out        output stream to write to
-   */
-  public static void printLastStackTraceClasses(StackTraceElement[] stackTrace, int depth, PrintStream out) {
-    String[] lastClasses = getLastStackTraceClasses(stackTrace, depth);
-    for (int i=0; i<lastClasses.length; i++) {
-      if (i > 0)
-        out.print("\t...");
-      out.println(lastClasses[i]);
-    }
-  }
+	/**
+	 * Rundet alle Werte einer {@link Collection} auf Nach- oder
+	 * Vorkommastellen.<br>
+	 * <b>Achtung:</b><br>
+	 * Es wird eine neue {@link Collection} des gleichen Typs erzeugt und die
+	 * gerundeten Werte darin in der Reihenfolge eingefuegt, wie sie von
+	 * {@link Collection#iterator()} geliefert werden! Unter umstaenden kann die
+	 * urspruengliche Sortierung verloren gehen! Diese Methode sollte also im
+	 * Zweifelsfall nur auf automatisch sortierte {@link Collection Collections}
+	 * angewandt werden (z.B. {@link TreeSet}).
+	 * 
+	 * @param values
+	 *            Werte
+	 * @param digits
+	 *            Anzahl an Nachkommastellen (negative Werte runden auf
+	 *            Vorkommastellen, also 10er-, 100er-, usw. Stelle)
+	 * @param mode
+	 *            Modus für das Runden (0 = normal Runden, 1 = Aufrunden, -1 =
+	 *            Abrunden; wenn nicht angegeben, wird normal gerundet)
+	 */
+	public static Collection<Number> round(Collection<Number> values,
+			int digits, int... mode) {
+		try {
+			Collection<Number> newCollection = values.getClass().newInstance();
+			for (Number value : values) {
+				newCollection.add(round(value.doubleValue(), digits, mode));
+			}
+			return newCollection;
+		} catch (Exception err) {
+			throw new IllegalArgumentException("Can not handle collection: "
+					+ getSimpleClassName(values), err);
+		}
+	}
 
-  /**
-   * Prints the last X classes from a stack trace to the standard output.
-   * @param stackTrace stack trace to explore
-   * @param depth      maximum count of classes, which are explored in the stack
-   *                   trace
-   * @see System#out
-   */
-  public static void printLastStackTraceClasses(StackTraceElement[] stackTrace, int depth) {
-    printLastStackTraceClasses(stackTrace, depth, System.out);
-  }
+	/**
+	 * Puts a text to system clipboard.
+	 * 
+	 * @param str
+	 *            a text
+	 */
+	public static void copyToClipboard(String str) {
+		if (str == null)
+			return;
+		StringSelection sel = new StringSelection(str);
+		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(sel, sel);
+	}
 
-  /**
-   * Erzeugt einen Log4j-Logger fuer ein Objekt. Als Identifier fuer den Logger
-   * wird der Klassenname des Objekts verwendet.
-   * @param object ein Objekt
-   * @return Logger mit dem Namen "NULL", falls das uebergebene Objekt {@code null}
-   *         ist
-   */
-  public static Logger createLogger(Object object) {
-    if ( object == null )
-      return Logger.getLogger("");
-    if ( object instanceof Class )
-      return Logger.getLogger( ((Class)object).getName() );
-    return Logger.getLogger( object.getClass().getName() );
-  }
+	/**
+	 * Returns the class names of the top of a stack trace. Duplicate class
+	 * names are eliminated.
+	 * 
+	 * @param stackTrace
+	 *            stack trace to explore
+	 * @param depth
+	 *            maximum count of classes, which are explored in the stack
+	 *            trace
+	 */
+	public static String[] getLastStackTraceClasses(
+			StackTraceElement[] stackTrace, int depth) {
+		Vector<String> lastClasses = new Vector<String>();
+		for (StackTraceElement st : stackTrace) {
+			String className = st.getClassName();
+			if (!lastClasses.contains(className))
+				lastClasses.add(className);
+			if (lastClasses.size() >= depth)
+				break;
+		}
+		return lastClasses.toArray(new String[0]);
+	}
 
-  /**
-   * Erzeugt einen Error- und einen Debug-Eintrag in einem Logger. Der Error-Eintrag
-   * erhaelt nur die Meldung, der Debug-Eintrag auch die detaillierten Informationen
-   * des Fehlers.
-   * @param logger ein Logger
-   * @param mess   Fehlermeldung (wenn {@code null} wird die Message des Fehlers ausgegeben)
-   * @param err    ein Fehler
-   */
-  public static void logDebugError(Category logger, Object mess, Throwable err) {
-    if ( mess == null )
-      mess = err.getClass().getName()+": "+err.getMessage();
-    logger.error(mess);
-    logger.debug(mess,err);
-  }
+	/**
+	 * Prints the last X classes from a stack trace.
+	 * 
+	 * @param stackTrace
+	 *            stack trace to explore
+	 * @param depth
+	 *            maximum count of classes, which are explored in the stack
+	 *            trace
+	 * @param out
+	 *            output stream to write to
+	 */
+	public static void printLastStackTraceClasses(
+			StackTraceElement[] stackTrace, int depth, PrintStream out) {
+		String[] lastClasses = getLastStackTraceClasses(stackTrace, depth);
+		for (int i = 0; i < lastClasses.length; i++) {
+			if (i > 0)
+				out.print("\t...");
+			out.println(lastClasses[i]);
+		}
+	}
 
-  /**
-   * Erzeugt einen Error- und einen Debug-Eintrag in einem Logger. Der Error-Eintrag
-   * erhaelt nur die Meldung, der Debug-Eintrag auch die detaillierten Informationen
-   * des Fehlers.
-   * @param logger ein Logger
-   * @param err    ein Fehler
-   */
-  public static void logDebugError(Category logger, Throwable err) {
-    logDebugError(logger,null,err);
-  }
+	/**
+	 * Prints the last X classes from a stack trace to the standard output.
+	 * 
+	 * @param stackTrace
+	 *            stack trace to explore
+	 * @param depth
+	 *            maximum count of classes, which are explored in the stack
+	 *            trace
+	 * @see System#out
+	 */
+	public static void printLastStackTraceClasses(
+			StackTraceElement[] stackTrace, int depth) {
+		printLastStackTraceClasses(stackTrace, depth, System.out);
+	}
 
-  /**
-   * Erzeugt einen Warn- und einen Debug-Eintrag in einem Logger. Der Warn-Eintrag
-   * erhaelt nur die Meldung, der Debug-Eintrag auch die detaillierten Informationen
-   * des Fehlers.
-   * @param logger ein Logger
-   * @param mess   Fehlermeldung (wenn {@code null} wird die Message des Fehlers ausgegeben)
-   * @param err    ein Fehler
-   */
-  public static void logDebugWarn(Category logger, Object mess, Throwable err) {
-    if ( mess == null )
-      mess = err.getClass().getName()+": "+err.getMessage();
-    logger.warn(mess);
-    logger.debug(mess,err);
-  }
+	/**
+	 * Erzeugt einen Log4j-Logger fuer ein Objekt. Als Identifier fuer den
+	 * Logger wird der Klassenname des Objekts verwendet.
+	 * 
+	 * @param object
+	 *            ein Objekt
+	 * @return Logger mit dem Namen "NULL", falls das uebergebene Objekt {@code
+	 *         null} ist
+	 */
+	public static Logger createLogger(Object object) {
+		if (object == null)
+			return Logger.getLogger("");
+		if (object instanceof Class)
+			return Logger.getLogger(((Class) object).getName());
+		return Logger.getLogger(object.getClass().getName());
+	}
 
-  /**
-   * Erzeugt einen Warn- und einen Debug-Eintrag in einem Logger. Der Warn-Eintrag
-   * erhaelt nur die Meldung, der Debug-Eintrag auch die detaillierten Informationen
-   * des Fehlers.
-   * @param logger ein Logger
-   * @param err    ein Fehler
-   */
-  public static void logDebugWarn(Category logger, Throwable err) {
-    logDebugWarn(logger,null,err);
-  }
+	/**
+	 * Erzeugt einen Error- und einen Debug-Eintrag in einem Logger. Der
+	 * Error-Eintrag erhaelt nur die Meldung, der Debug-Eintrag auch die
+	 * detaillierten Informationen des Fehlers.
+	 * 
+	 * @param logger
+	 *            ein Logger
+	 * @param mess
+	 *            Fehlermeldung (wenn {@code null} wird die Message des Fehlers
+	 *            ausgegeben)
+	 * @param err
+	 *            ein Fehler
+	 */
+	public static void logDebugError(Category logger, Object mess, Throwable err) {
+		if (mess == null)
+			mess = err.getClass().getName() + ": " + err.getMessage();
+		logger.error(mess);
+		logger.debug(mess, err);
+	}
 
-  /**
-   * Logs the last X classes from a stack trace as debug message.
-   * @param logger     the logger
-   * @param stackTrace stack trace to explore
-   * @param depth      maximum count of classes, which are explored in the stack
-   *                   trace
-   */
-  public static void logDebugLastStackTraceClasses(Category logger, StackTraceElement[] stackTrace, int depth) {
-    String[] lastClasses = getLastStackTraceClasses(stackTrace, depth);
-    for (int i=0; i<lastClasses.length; i++) {
-      String message = "";    
-      if (i > 0)
-        message = "\t...";
-      message += lastClasses[i];
-      logger.debug(message);
-    }
-  }
+	/**
+	 * Erzeugt einen Error- und einen Debug-Eintrag in einem Logger. Der
+	 * Error-Eintrag erhaelt nur die Meldung, der Debug-Eintrag auch die
+	 * detaillierten Informationen des Fehlers.
+	 * 
+	 * @param logger
+	 *            ein Logger
+	 * @param err
+	 *            ein Fehler
+	 */
+	public static void logDebugError(Category logger, Throwable err) {
+		logDebugError(logger, null, err);
+	}
 
+	/**
+	 * Erzeugt einen Warn- und einen Debug-Eintrag in einem Logger. Der
+	 * Warn-Eintrag erhaelt nur die Meldung, der Debug-Eintrag auch die
+	 * detaillierten Informationen des Fehlers.
+	 * 
+	 * @param logger
+	 *            ein Logger
+	 * @param mess
+	 *            Fehlermeldung (wenn {@code null} wird die Message des Fehlers
+	 *            ausgegeben)
+	 * @param err
+	 *            ein Fehler
+	 */
+	public static void logDebugWarn(Category logger, Object mess, Throwable err) {
+		if (mess == null)
+			mess = err.getClass().getName() + ": " + err.getMessage();
+		logger.warn(mess);
+		logger.debug(mess, err);
+	}
+
+	/**
+	 * Erzeugt einen Warn- und einen Debug-Eintrag in einem Logger. Der
+	 * Warn-Eintrag erhaelt nur die Meldung, der Debug-Eintrag auch die
+	 * detaillierten Informationen des Fehlers.
+	 * 
+	 * @param logger
+	 *            ein Logger
+	 * @param err
+	 *            ein Fehler
+	 */
+	public static void logDebugWarn(Category logger, Throwable err) {
+		logDebugWarn(logger, null, err);
+	}
+
+	/**
+	 * Logs the last X classes from a stack trace as debug message.
+	 * 
+	 * @param logger
+	 *            the logger
+	 * @param stackTrace
+	 *            stack trace to explore
+	 * @param depth
+	 *            maximum count of classes, which are explored in the stack
+	 *            trace
+	 */
+	public static void logDebugLastStackTraceClasses(Category logger,
+			StackTraceElement[] stackTrace, int depth) {
+		String[] lastClasses = getLastStackTraceClasses(stackTrace, depth);
+		for (int i = 0; i < lastClasses.length; i++) {
+			String message = "";
+			if (i > 0)
+				message = "\t...";
+			message += lastClasses[i];
+			logger.debug(message);
+		}
+	}
+
+	/**
+	 * Parses a String as a specific Number class, e.g. Double or Long
+	 * 
+	 * @param numClass
+	 *            TODO Martin, geht das nicht schöner? Ich bin zu doof
+	 */
+	public static Number parseNumberAs(final String valueString, final Class<?> numClass) {
+
+		// everything can be parsed as a Double
+		final Double doubleValue = Double.parseDouble(valueString);
+
+		if (numClass == Long.class) {
+			return doubleValue.longValue();
+		} else if (numClass == Double.class) {
+			return doubleValue;
+		} else if (numClass == Integer.class) {
+			return doubleValue.intValue();
+		} else if (numClass == Byte.class) {
+			return doubleValue.byteValue();
+		} else if (numClass == Short.class) {
+			return doubleValue.shortValue();
+		} else if (numClass == Float.class) {
+			return doubleValue.floatValue();
+		} else {
+			throw new RuntimeException(
+					"Please report that parseNumberAs has to support variables of type "
+							+ numClass.getCanonicalName());
+		}
+	}
 }
-

Modified: trunk/src/schmitzm/swing/table/DoubleRenderer.java
===================================================================
--- trunk/src/schmitzm/swing/table/DoubleRenderer.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/schmitzm/swing/table/DoubleRenderer.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -29,16 +29,10 @@
  ******************************************************************************/
 package schmitzm.swing.table;
 
-import java.awt.Color;
-import java.awt.Component;
 import java.text.NumberFormat;
 
-import javax.swing.BorderFactory;
 import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.border.Border;
 import javax.swing.table.DefaultTableCellRenderer;
-import javax.swing.table.TableCellRenderer;
 
 /**
  * Diese Klasse stellt einen Renderer fuer Tabellenzellen dar, in denen

Modified: trunk/src/skrueger/swing/CancellableTabbedDialogAdapter.java
===================================================================
--- trunk/src/skrueger/swing/CancellableTabbedDialogAdapter.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/skrueger/swing/CancellableTabbedDialogAdapter.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -77,7 +77,7 @@
 
 		});
 
-		buttonsJPanel.add(okButton);
+		buttonsJPanel.add(okButton, "tag ok");
 
 		final CancelButton cancelButton = new CancelButton(new AbstractAction(
 				"") {
@@ -85,7 +85,7 @@
 				cancelClose();
 			}
 		});
-		buttonsJPanel.add(cancelButton);
+		buttonsJPanel.add(cancelButton, "tag cancel");
 
 		return buttonsJPanel;
 	}

Modified: trunk/src/skrueger/swing/ColorButton.java
===================================================================
--- trunk/src/skrueger/swing/ColorButton.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/skrueger/swing/ColorButton.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -5,6 +5,7 @@
 import java.awt.image.BufferedImage;
 
 import javax.swing.AbstractAction;
+import javax.swing.Action;
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
 import javax.swing.JButton;
@@ -37,6 +38,12 @@
 	public void setColor(Expression colorExpression) {
 		setColor(StylingUtil.getColorFromExpression(colorExpression));
 	}
+	
+	@Override
+	public void setAction(Action a) {
+		super.setAction(a);
+		setColor(color);
+	}
 
 	/**
 	 * Updates a {@link JButton}'s {@link Icon} with a {@link Color}.
@@ -65,6 +72,7 @@
 		g2d.setBackground(newColor);
 		g2d.fillRect(0, 0, 30, 10);
 		setIcon(new ImageIcon(bi));
+		repaint();
 	}
 
 }

Modified: trunk/src/skrueger/swing/TranslationEditJPanel.java
===================================================================
--- trunk/src/skrueger/swing/TranslationEditJPanel.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/skrueger/swing/TranslationEditJPanel.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -33,10 +33,9 @@
 import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.util.HashSet;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Random;
-import java.util.Set;
 import java.util.WeakHashMap;
 
 import javax.swing.BorderFactory;
@@ -73,9 +72,11 @@
 	/**
 	 * Remembers all {@link JTextField} that have been created.
 	 */
-	 private Set<TranslationJTextField> langTextFields = new HashSet<TranslationJTextField>();
+	private HashMap<String, TranslationJTextField> langTextFields = new HashMap<String, TranslationJTextField>();
 	private WeakHashMap<ActionListener, ActionListener> actionListeners = new WeakHashMap<ActionListener, ActionListener>();
 
+	private final String question;
+
 	/**
 	 * Creates a {@link JPanel} that asks the user for the translation of a
 	 * String in several languages
@@ -92,7 +93,8 @@
 	public TranslationEditJPanel(String question, Translation trans,
 			List<String> languages_) {
 		super(new BorderLayout());
-		
+		this.question = question;
+
 		SwingUtil.setMinimumWidth(this, 400);
 
 		if (trans == null)
@@ -101,6 +103,10 @@
 		this.trans = trans;
 		this.languages = languages_;
 
+		initGUI();
+	}
+
+	private void initGUI() {
 		add(getTranslationGrid(), BorderLayout.CENTER);
 
 		if (question != null) {
@@ -109,10 +115,6 @@
 					.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
 			add(questionLable, BorderLayout.NORTH);
 		}
-
-		/**
-		 * Add listeners
-		 */
 	}
 
 	/**
@@ -141,15 +143,20 @@
 				langDesc.setHorizontalAlignment(SwingConstants.RIGHT);
 				langDesc.setVerticalAlignment(SwingConstants.NORTH);
 
-				TranslationJTextField langTextField = new TranslationJTextField(
-						trans, langId);
-				// Setting a size
-				langTextField.setPreferredSize(new Dimension(360, 22));
-				langDesc.setLabelFor(langTextField);
+				TranslationJTextField langTextField = langTextFields
+						.get(langId);
+
+				if (langTextField == null) {
+					langTextField = new TranslationJTextField(trans, langId);
+					// Setting a size
+					langTextField.setPreferredSize(new Dimension(360, 22));
+					langDesc.setLabelFor(langTextField);
+				}
+
 				translationGrid.add(langDesc);
 				translationGrid.add(langTextField);
 
-				 langTextFields.add(langTextField);
+				langTextFields.put(langId, langTextField);
 			}
 
 			// Lay out the panel.
@@ -174,9 +181,10 @@
 	 * TODO Is never called?!
 	 */
 	public void dispose() {
-		for (TranslationJTextField f: langTextFields) {
+		for (TranslationJTextField f : langTextFields.values()) {
 			f.dispose();
 		}
+		langTextFields.clear();
 	}
 
 	public void addTranslationChangeListener(final ActionListener al) {
@@ -201,4 +209,5 @@
 		}
 	}
 
+
 }

Modified: trunk/src/skrueger/swing/TranslationJTextField.java
===================================================================
--- trunk/src/skrueger/swing/TranslationJTextField.java	2010-02-18 20:52:26 UTC (rev 710)
+++ trunk/src/skrueger/swing/TranslationJTextField.java	2010-02-19 01:09:35 UTC (rev 711)
@@ -120,21 +120,21 @@
 
 			@Override
 			public void actionPerformed(ActionEvent e) {
-//				LOGGER.debug("ActionListener called ");
+				// LOGGER.debug("ActionListener called ");
 
-				if (e.getSource() == trans) 
-//						&& langCode.equals(e.getActionCommand())) 
-						{
-//					LOGGER.debug(" and omittet!\n");
-					return;
-				}
-				LOGGER.debug(" and performed!\n");
+//				if (e.getSource() == trans)
+//				// && langCode.equals(e.getActionCommand()))
+//				{
+//					// LOGGER.debug(" and omittet!\n");
+//					return;
+//				}
+//				LOGGER.debug(" and performed!\n");
 				String newString = trans.get(langCode);
 				if (newString == null)
 					newString = "";
 				if ((newString != null && !newString.equals(getText()))) {
-					LOGGER.debug("Setting text to " + newString
-							+ " becuse oldString was " + getText());
+//					LOGGER.debug("Setting text to " + newString
+//							+ " becuse oldString was " + getText());
 					setText(newString);
 				}
 			}
@@ -180,6 +180,24 @@
 		}
 
 		// LOGGER.debug("putting '"+trimmedText+"' into the translation");
-		trans.put(langCode, trimmedText);
+		if (!trimmedText.equals(trans.get(langCode)))
+			trans.put(langCode, trimmedText);
 	}
+//
+//	ActionListener listenToChangesOfTheTranslationAndUpdateTheGUI = new ActionListener() {
+//
+//		@Override
+//		public void actionPerformed(ActionEvent e) {
+//			if (!hasFocus())
+//				translationChangedExternally();
+//		}
+//	};
+//
+//	/**
+//	 * Call it when the translation object has changed to update the JTextFields
+//	 */
+//	public void translationChangedExternally() {
+//		setText(trans.get(langCode));
+//	}
+
 }



More information about the Schmitzm-commits mailing list