[Schmitzm-commits] r881 - in trunk/src: schmitzm/data schmitzm/geotools/feature schmitzm/geotools/gui schmitzm/jfree schmitzm/lang schmitzm/swing schmitzm/swing/resource/locales skrueger/geotools skrueger/geotools/labelsearch skrueger/swing

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Mon May 31 17:48:06 CEST 2010


Author: mojays
Date: 2010-05-31 17:48:02 +0200 (Mon, 31 May 2010)
New Revision: 881

Added:
   trunk/src/schmitzm/swing/ResourceProviderManagerFrame.java
Modified:
   trunk/src/schmitzm/data/DataUtil.java
   trunk/src/schmitzm/geotools/feature/FeatureUtil.java
   trunk/src/schmitzm/geotools/gui/GeoPositionLabel.java
   trunk/src/schmitzm/geotools/gui/GeotoolsGUIUtil.java
   trunk/src/schmitzm/geotools/gui/GridPanelFormatter.java
   trunk/src/schmitzm/geotools/gui/XMapPaneTool.java
   trunk/src/schmitzm/jfree/JFreeChartUtil.java
   trunk/src/schmitzm/lang/LangUtil.java
   trunk/src/schmitzm/lang/ResourceProvider.java
   trunk/src/schmitzm/swing/SwingUtil.java
   trunk/src/schmitzm/swing/resource/locales/SwingResourceBundle.properties
   trunk/src/schmitzm/swing/resource/locales/SwingResourceBundle_de.properties
   trunk/src/skrueger/geotools/MapPaneToolBar.java
   trunk/src/skrueger/geotools/labelsearch/LabelSearch.java
   trunk/src/skrueger/geotools/labelsearch/Snippet.java
   trunk/src/skrueger/swing/CancellableDialogAdapter.java
   trunk/src/skrueger/swing/HeapBar.java
Log:
new ResourceProviderManagerFrame
Made ResourceProvider constructors protected to avoid duplicate instances; ResourceProvider.newInstance(.) method should be used instead.

Modified: trunk/src/schmitzm/data/DataUtil.java
===================================================================
--- trunk/src/schmitzm/data/DataUtil.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/data/DataUtil.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -45,5 +45,5 @@
    *  des Package {@code schmitzm.data} zur Verfuegung stellt. Diese sind
    *  in properties-Datein unter {@code schmitzm.data.resource.locales}
    *  hinterlegt. */
-  public static ResourceProvider RESOURCE = new ResourceProvider( LangUtil.extendPackagePath(DataUtil.class,"resource.locales.DataResourceBundle"), Locale.ENGLISH );
+  public static ResourceProvider RESOURCE = ResourceProvider.newInstance( LangUtil.extendPackagePath(DataUtil.class,"resource.locales.DataResourceBundle"), Locale.ENGLISH );
 }

Modified: trunk/src/schmitzm/geotools/feature/FeatureUtil.java
===================================================================
--- trunk/src/schmitzm/geotools/feature/FeatureUtil.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/geotools/feature/FeatureUtil.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -128,7 +128,7 @@
 	 * sind in properties-Dateien unter {@code
 	 * schmitzm.geotools.feature.resource.locales} hinterlegt.
 	 */
-	public static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
+	public static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil
 			.extendPackagePath(FeatureUtil.class,
 					"resource.locales.FeatureResourceBundle"), Locale.ENGLISH);
 

Modified: trunk/src/schmitzm/geotools/gui/GeoPositionLabel.java
===================================================================
--- trunk/src/schmitzm/geotools/gui/GeoPositionLabel.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/geotools/gui/GeoPositionLabel.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -98,7 +98,7 @@
     this(0);
   }
 
-	protected static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
+	protected static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil
 			.extendPackagePath(GeotoolsGUIUtil.class,
 					"resource.locales.GTResourceBundle"), Locale.ENGLISH);
 

Modified: trunk/src/schmitzm/geotools/gui/GeotoolsGUIUtil.java
===================================================================
--- trunk/src/schmitzm/geotools/gui/GeotoolsGUIUtil.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/geotools/gui/GeotoolsGUIUtil.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -64,7 +64,7 @@
    *  des Package {@code schmitzm.geotools.gui} zur Verfuegung stellt. Diese sind
    *  in properties-Datein unter {@code schmitzm.geotools.gui.resource.locales}
    *  hinterlegt. */
-  public static ResourceProvider RESOURCE = new ResourceProvider( LangUtil.extendPackagePath(GeotoolsGUIUtil.class,"resource.locales.GTResourceBundle"), Locale.ENGLISH );
+  public static ResourceProvider RESOURCE = ResourceProvider.newInstance( LangUtil.extendPackagePath(GeotoolsGUIUtil.class,"resource.locales.GTResourceBundle"), Locale.ENGLISH );
 
 	/**
 	 * Convenience method to access the translations in the {@link ResourceProvider}

Modified: trunk/src/schmitzm/geotools/gui/GridPanelFormatter.java
===================================================================
--- trunk/src/schmitzm/geotools/gui/GridPanelFormatter.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/geotools/gui/GridPanelFormatter.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -60,7 +60,7 @@
 	private static final Logger LOGGER = LangUtil
 			.createLogger(GridPanelFormatter.class);
 
-	protected static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
+	protected static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil
 			.extendPackagePath(GeotoolsGUIUtil.class,
 					"resource.locales.GTResourceBundle"), Locale.ENGLISH);
 

Modified: trunk/src/schmitzm/geotools/gui/XMapPaneTool.java
===================================================================
--- trunk/src/schmitzm/geotools/gui/XMapPaneTool.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/geotools/gui/XMapPaneTool.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -23,9 +23,7 @@
  * {@link XMapPaneAction}s and provides a tool icon and a default mouse cursor.
  */
 public class XMapPaneTool implements Copyable<XMapPaneTool> {
-	public static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
-			.extendPackagePath(MapPaneToolBar.class,
-					"resource.locales.mapPaneToolbar"), Locale.ENGLISH);
+	public static ResourceProvider RESOURCE = MapPaneToolBar.RESOURCE;
 
 	public static String R(String key, Object... values) {
 		return RESOURCE.getString(key, values);

Modified: trunk/src/schmitzm/jfree/JFreeChartUtil.java
===================================================================
--- trunk/src/schmitzm/jfree/JFreeChartUtil.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/jfree/JFreeChartUtil.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -120,7 +120,7 @@
 	 * schmitzm.jfree.resource.locales.JFreeResourceBundle_XXX.properties}
 	 * hinterlegt.
 	 */
-	public static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
+	public static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil
 			.extendPackagePath(JFreeChartUtil.class,
 					"resource.locales.JFreeResourceBundle"), Locale.ENGLISH);
 

Modified: trunk/src/schmitzm/lang/LangUtil.java
===================================================================
--- trunk/src/schmitzm/lang/LangUtil.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/lang/LangUtil.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -63,7 +63,7 @@
 	 * properties-Dateien unter {@code schmitzm.lang.resource.locales}
 	 * hinterlegt.
 	 */
-	public static ResourceProvider RESOURCE = new ResourceProvider(
+	public static ResourceProvider RESOURCE = ResourceProvider.newInstance(
 			extendPackagePath(LangUtil.class,
 					"resource.locales.LangResourceBundle"), Locale.ENGLISH);
 

Modified: trunk/src/schmitzm/lang/ResourceProvider.java
===================================================================
--- trunk/src/schmitzm/lang/ResourceProvider.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/lang/ResourceProvider.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -35,6 +35,7 @@
 import java.io.PrintWriter;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.util.HashMap;
 import java.util.Locale;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
@@ -84,9 +85,13 @@
 	/**
 	 * Enthaelt automatisch alle erzeugten {@link ResourceProvider}. Wird im
 	 * Konstruktor von {@link ResourceProvider} automatisch befuellt.<br>
-	 * TODO: private machen und ordentliche getter und setter implementieren!
 	 */
-	public static final SortableVector<ResourceProvider> RESOURCE_BUNDLES = new SortableVector<ResourceProvider>();
+	private static final SortableVector<ResourceProvider> RESOURCE_PROVIDER_SORTABLE = new SortableVector<ResourceProvider>();
+	
+	/** Enthaelt alle instanziierten {@link ResourceProvider} gemappt
+	 *  nach ihrem "defaultResourceBundle".
+	 */
+	private static final HashMap<String, ResourceProvider> RESOURCE_PROVIDER = new HashMap<String, ResourceProvider>();
 
 	private static final Logger LOGGER = Logger
 			.getLogger(ResourceProvider.class.getSimpleName());
@@ -129,7 +134,59 @@
 	 * Nur zu Informationszwecken!
 	 */
 	private Locale rootLocale = null;
+	
+    /**
+     * Erzeugt neuen Resource-Provider.
+     * 
+     * @param defaultResourceBundle
+     *            Name des Standard Resource-Bundle
+     * @param rootLocale
+     *            Sprache des Root-Bundles
+     * @param ignoreMissingResource
+     *            bestimmt, ob fehlende Ressourcen ignoriert werden oder mit
+     *            einer {@link MissingResourceException} behandelt werden
+     * @param missingResourceString
+     *            Alternativ-String der - wenn fehlende Ressourcen ignoriert
+     *            werden - von {@link #getString(String)} zurueckgegeben wird
+     */
+    protected ResourceProvider(String defaultResourceBundle, Locale rootLocale,
+            boolean ignoreMissingResource, String missingResourceString) {
+        this.defaultResourceBundle = defaultResourceBundle;
+        this.rootLocale = rootLocale;
+        this.resourceBundle = null;
+        this.ignoreMissingResource = ignoreMissingResource;
+        this.missingResourceString = missingResourceString;
+        // Registrieren des neuen ResourceProvider
+        RESOURCE_PROVIDER.put(defaultResourceBundle, this);
+        // Registrieren des neuen ResourceProvider als sortierbare Liste
+        RESOURCE_PROVIDER_SORTABLE.add(this);
+    }
 
+    /**
+     * Erzeugt neuen Resource-Provider.
+     * 
+     * @param defaultResourceBundle
+     *            Name des Standard Resource-Bundle
+     * @param rootLocale
+     *            Sprache des Root-Bundles
+     * @param ignoreMissingResource
+     *            bestimmt, ob fehlende Ressourcen ignoriert werden oder mit
+     *            einer {@link MissingResourceException} behandelt werden
+     * @param missingResourceString
+     *            Alternativ-String der - wenn fehlende Ressourcen ignoriert
+     *            werden - von {@link #getString(String)} zurueckgegeben wird
+     */
+    public static ResourceProvider newInstance(String defaultResourceBundle, Locale rootLocale,
+            boolean ignoreMissingResource, String missingResourceString) {
+      ResourceProvider provider = RESOURCE_PROVIDER.get(defaultResourceBundle);
+      // only create a new provider if none is yet created for
+      // the bundle name
+      if ( provider == null ) {
+        provider = new ResourceProvider(defaultResourceBundle,rootLocale,ignoreMissingResource,missingResourceString);
+      }
+      return provider;
+    }
+    
 	/**
 	 * Erzeugt neuen Resource-Provider mit dem Namen "ResourceBundle". Fehlende
 	 * Ressourcen werden ignoriert und mit {@code null} oder
@@ -140,8 +197,8 @@
 	 * @param rootLocale
 	 *            Sprache des Root-Bundles
 	 */
-	public ResourceProvider(Class clazz, Locale rootLocale) {
-		this(clazz, rootLocale, true);
+    public static ResourceProvider newInstance(Class clazz, Locale rootLocale) {
+		return newInstance(clazz, rootLocale, true);
 	}
 
 	/**
@@ -158,9 +215,9 @@
 	 *            bestimmt, ob fehlende Ressourcen ignoriert werden oder mit
 	 *            einer {@link MissingResourceException} behandelt werden
 	 */
-	public ResourceProvider(Class clazz, Locale rootLocale,
+    public static ResourceProvider newInstance(Class clazz, Locale rootLocale,
 			boolean ignoreMissingResource) {
-		this(clazz, rootLocale, ignoreMissingResource, MISSING_RESOURCE_STRING);
+		return newInstance(clazz, rootLocale, ignoreMissingResource, MISSING_RESOURCE_STRING);
 	}
 
 	/**
@@ -178,9 +235,9 @@
 	 *            Alternativ-String der - wenn fehlende Ressourcen ignoriert
 	 *            werden - von {@link #getString(String)} zurueckgegeben wird
 	 */
-	public ResourceProvider(Class clazz, Locale rootLocale,
+    public static ResourceProvider newInstance(Class clazz, Locale rootLocale,
 			boolean ignoreMissingResource, String missingResourceString) {
-		this(clazz.getPackage().getName() + ".ResourceBundle", rootLocale,
+		return newInstance(clazz.getPackage().getName() + ".ResourceBundle", rootLocale,
 				ignoreMissingResource, missingResourceString);
 	}
 
@@ -194,8 +251,8 @@
 	 * @param rootLocale
 	 *            Sprache des Root-Bundles
 	 */
-	public ResourceProvider(String defaultResourceBundle, Locale rootLocale) {
-		this(defaultResourceBundle, rootLocale, true);
+    public static ResourceProvider newInstance(String defaultResourceBundle, Locale rootLocale) {
+		return newInstance(defaultResourceBundle, rootLocale, true);
 	}
 
 	/**
@@ -211,38 +268,13 @@
 	 *            bestimmt, ob fehlende Ressourcen ignoriert werden oder mit
 	 *            einer {@link MissingResourceException} behandelt werden
 	 */
-	public ResourceProvider(String defaultResourceBundle, Locale rootLocale,
+    public static ResourceProvider newInstance(String defaultResourceBundle, Locale rootLocale,
 			boolean ignoreMissingResource) {
-		this(defaultResourceBundle, rootLocale, ignoreMissingResource,
+		return newInstance(defaultResourceBundle, rootLocale, ignoreMissingResource,
 				MISSING_RESOURCE_STRING);
 	}
 
 	/**
-	 * Erzeugt neuen Resource-Provider.
-	 * 
-	 * @param defaultResourceBundle
-	 *            Name des Standard Resource-Bundle
-	 * @param rootLocale
-	 *            Sprache des Root-Bundles
-	 * @param ignoreMissingResource
-	 *            bestimmt, ob fehlende Ressourcen ignoriert werden oder mit
-	 *            einer {@link MissingResourceException} behandelt werden
-	 * @param missingResourceString
-	 *            Alternativ-String der - wenn fehlende Ressourcen ignoriert
-	 *            werden - von {@link #getString(String)} zurueckgegeben wird
-	 */
-	public ResourceProvider(String defaultResourceBundle, Locale rootLocale,
-			boolean ignoreMissingResource, String missingResourceString) {
-		this.defaultResourceBundle = defaultResourceBundle;
-		this.rootLocale = rootLocale;
-		this.resourceBundle = null;
-		this.ignoreMissingResource = ignoreMissingResource;
-		this.missingResourceString = missingResourceString;
-		// Registrieren des neuen ResourceProvider
-		RESOURCE_BUNDLES.add(this);
-	}
-
-	/**
 	 * Liefert den Namen des Bundles.
 	 * 
 	 * @see #getBundleName()
@@ -672,6 +704,13 @@
 	}
 
 	/**
+	 * Liefert alle instanziierten {@link ResourceProvider}.
+	 */
+	public static SortableVector<ResourceProvider> getRegisteredResourceProvider() {
+	  return RESOURCE_PROVIDER_SORTABLE;
+	}
+	
+	/**
 	 * Setzt alternative ResourceBundles für jeden bisher registrierten
 	 * ResourceProvider. Das alternative Bundle wird ohne die Packagebezeichung
 	 * im Classpath als Datei erwartet.
@@ -681,7 +720,7 @@
 	 */
 	public static void resetAllRegisteredResourceBundles() {
 		// Enabling user-translated locales that are searched in the classpath
-		for (ResourceProvider rp : RESOURCE_BUNDLES) {
+		for (ResourceProvider rp : RESOURCE_PROVIDER_SORTABLE) {
 			String filename = rp.getBundleName();
 			if (filename.contains("."))
 				filename = filename.substring(filename.lastIndexOf('.') + 1);
@@ -702,4 +741,6 @@
 	// }
 	// }
 
+	
+	
 }

Added: trunk/src/schmitzm/swing/ResourceProviderManagerFrame.java
===================================================================
--- trunk/src/schmitzm/swing/ResourceProviderManagerFrame.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/swing/ResourceProviderManagerFrame.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -0,0 +1,329 @@
+/** XULU - This file is part of the eXtendable Unified Land Use Modelling Platform (XULU)
+
+    This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
+    This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+    You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
+
+    Diese Bibliothek ist freie Software; Sie dürfen sie unter den Bedingungen der GNU Lesser General Public License, wie von der Free Software Foundation veröffentlicht, weiterverteilen und/oder modifizieren; entweder gemäß Version 2.1 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
+    Diese Bibliothek wird in der Hoffnung weiterverbreitet, daß sie nützlich sein wird, jedoch OHNE IRGENDEINE GARANTIE, auch ohne die implizierte Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Mehr Details finden Sie in der GNU Lesser General Public License.
+    Sie sollten eine Kopie der GNU Lesser General Public License zusammen mit dieser Bibliothek erhalten haben; falls nicht, schreiben Sie an die Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA.
+ **/
+
+package schmitzm.swing;
+
+import java.awt.AWTEvent;
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowEvent;
+import java.io.File;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.JTextPane;
+import javax.swing.table.AbstractTableModel;
+
+import schmitzm.lang.LocaleComparator;
+import schmitzm.lang.ResourceProvider;
+import schmitzm.swing.ExceptionDialog;
+import schmitzm.swing.InputOption;
+import schmitzm.swing.JPanel;
+import schmitzm.swing.ManualInputOption;
+import schmitzm.swing.MultipleOptionPane;
+import schmitzm.swing.SelectionInputOption;
+import schmitzm.swing.event.InputOptionAdapter;
+
+
+/**
+ * This class provides a dialog to maintain the language packs, which are
+ * registered in {@link ResourceProvider#RESOURCE_BUNDLES}.
+ * @author <a href="mailto:martin.schmitz at koeln.de">Martin Schmitz</a> (University of Bonn/Germany)
+ * @version 1.0
+ */
+public class ResourceProviderManagerFrame extends JDialog implements ActionListener {
+  private JTextPane infoText      = null;
+  private JButton   cancelButton  = null;
+  private JButton   newLangButton = null;
+  private JTable    bundleTable   = null;
+  private JPanel    controlPanel  = null;
+
+  private SelectionInputOption newLangDialog_LangDesc = null;
+  private ManualInputOption    newLangDialog_LangCode = null;
+
+  /**
+   * Creates a new dialog.
+   * @param parent   calling frame
+   * @param modal    flag, whether the frame is modal
+   */
+  public ResourceProviderManagerFrame(Frame parent, boolean modal) {
+    this(parent,modal,null);
+  }
+
+  /**
+   * Creates a new dialog.
+   * @param parent   calling frame
+   * @param modal    flag, whether the frame is modal
+   * @param infoText information message shown in the north path of
+   *                 the window to explain the usage of resource bundles
+   */
+  public ResourceProviderManagerFrame(Frame parent, boolean modal, String infoText) {
+    super(parent,modal);
+    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
+    try {
+      initGUI(infoText);
+      initNewLanguageDialog();
+    }
+    catch(Exception e) {
+      ExceptionDialog.show(e);
+    }
+  }
+  
+  /**
+   * Returns a translated string from the SCHMITZM Swing resource bundle.
+   * The key prefix "ResourceProviderManagerFrame." is automatically added
+   * to the given key.
+   * @param keyPostfix key postfix
+   * @param replParams optional parameter to replace in the translation string
+   * @return
+   */
+  private String getResource(String keyPostfix, Object... replParams) {
+    return SwingUtil.R("ResourceProviderManagerFrame."+keyPostfix, replParams);
+  }
+
+  /**
+   * Initializes die GUI.
+   */
+  private void initGUI(String infoMess) throws Exception  {
+    //imageLabel.setIcon(new ImageIcon(XuluMainFrame_Infodialog.class.getResource("[Ihre Grafik]")));
+    this.setTitle(getResource("Title"));
+    this.setSize(500,400);
+    this.getContentPane().setLayout(new BorderLayout());
+    
+    if (infoMess != null) {
+      infoText = new JTextPane();
+      infoText.setText( infoMess );
+      infoText.setBackground( this.getContentPane().getBackground() );
+    } else
+      infoText = null;
+    
+    bundleTable = new JTable( new BundleTableModel() );
+
+    cancelButton = new JButton(SwingUtil.R("Cancel"));
+    cancelButton.addActionListener(this);
+    newLangButton = new JButton(getResource("NewLang"));
+    newLangButton.addActionListener(this);
+
+    controlPanel = new JPanel();
+    controlPanel.setLayout( new FlowLayout(FlowLayout.CENTER) );
+    controlPanel.add( cancelButton );
+    controlPanel.add( newLangButton );
+
+    if ( infoText != null )
+      this.getContentPane().add(infoText, BorderLayout.NORTH);
+    this.getContentPane().add(controlPanel, BorderLayout.SOUTH);
+    this.getContentPane().add(new JScrollPane(bundleTable), BorderLayout.CENTER);
+
+//    this.pack();
+  }
+
+  /**
+   * Initializes the dialog to create new languages.
+   */
+  private void initNewLanguageDialog() {
+    // sort the provided languages according to their description
+    TreeSet<Locale> sortedLocales = new TreeSet<Locale>(new LocaleComparator(true));
+    for (Locale l : Locale.getAvailableLocales())
+      sortedLocales.add(l);
+
+    // insert descriptions and language codes to arrays
+    String[] avLocaleDesc = new String[sortedLocales.size()+1];
+    String[] avLocaleCode = new String[sortedLocales.size()+1];
+    int i = 0;
+    for (Locale l : sortedLocales) {
+      avLocaleDesc[i] = l.getDisplayName();
+      avLocaleCode[i] = l.toString();
+      i++;
+    }
+    // additional option "other language"
+    avLocaleDesc[i] = getResource("OtherLang");
+    avLocaleCode[i] = "";
+
+    // create input option for the language code
+    newLangDialog_LangCode = new ManualInputOption.Text(
+      getResource("LanguageCode"),
+      true
+    );
+    // create input option for predefined languages
+    newLangDialog_LangDesc = new SelectionInputOption.Combo(
+      getResource("Language"),
+      true,
+      avLocaleCode,
+      "",
+      avLocaleDesc
+    );
+    // if the language selection changes, also the language code should
+    // change
+    newLangDialog_LangDesc.addInputOptionListener(new InputOptionAdapter() {
+      public void optionChanged(InputOption option, Object oldValue, Object newValue) {
+        newLangDialog_LangCode.setValue(newValue);
+        newLangDialog_LangCode.transferFocus();
+        newLangDialog_LangCode.setEnabled( "".equals(newValue));
+      }
+    });
+  }
+
+  /**
+   * Closes the window, if {@code e} is a <code>WindowEvent.WINDOW_CLOSING<code>-event.
+   */
+  protected void processWindowEvent(WindowEvent e) {
+    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
+      cancel();
+    }
+    super.processWindowEvent(e);
+  }
+
+  /**
+   * Closes the frame.
+   */
+  private void cancel() {
+    dispose();
+  }
+
+  /**
+   * Opens the language dialog and creates the new bundles.
+   */
+  private void createNewLanguage() {
+    // set the selection to the first language
+    newLangDialog_LangDesc.setSelectedIndex(0);
+    // show the dialog
+    Object[] input = MultipleOptionPane.showMultipleInputDialog(
+        this,
+        getResource("NewLang"),
+        newLangDialog_LangDesc,
+        newLangDialog_LangCode
+    );
+    if ( input == null )
+      return;
+
+    // create the property files for all bundles
+    Locale newLocale = new Locale((String)input[1]);
+    try {
+      // check whether the file exists for one bundle
+      for ( ResourceProvider rp : ResourceProvider.getRegisteredResourceProvider() ) {
+        File file = ResourceProvider.getPropertyFile(rp,newLocale);
+        if ( file.exists() ) {
+          SwingUtil.FileOverrideOption answer = SwingUtil.approveFileOverwrite(this,file.getName(),true);
+          if ( answer.equals( SwingUtil.FileOverrideOption.CANCEL ) )
+            return;
+          if ( answer.equals( SwingUtil.FileOverrideOption.OVERWRITE_ALL ) )
+            break;
+          }
+      }
+      // If all files are approved to overwrite, delete the files
+      for ( ResourceProvider rp : ResourceProvider.getRegisteredResourceProvider() ) {
+        File file = ResourceProvider.getPropertyFile(rp,newLocale);
+        if ( file.exists() )
+          file.delete();
+      }
+      // Create new files (with APPEND-function, so extended bundles are
+      // not overwritten directly)
+      for ( ResourceProvider rp : ResourceProvider.getRegisteredResourceProvider() )
+        ResourceProvider.createPropertyFile(rp, newLocale, true);
+
+      // Update table
+      ResourceBundle.clearCache();
+      ((AbstractTableModel)bundleTable.getModel()).fireTableDataChanged();
+      // show message
+      JOptionPane.showMessageDialog(
+                                    this,
+                                    getResource("FinishMess"),
+                                    SwingUtil.R("Information")+"...",
+                                    JOptionPane.INFORMATION_MESSAGE
+                                  );
+    } catch (Exception err) {
+      ExceptionDialog.show(this,err,err.getClass().getSimpleName(),null);
+    }
+  }
+
+
+  /**
+   * Performs the button action.
+   */
+  public void actionPerformed(ActionEvent e) {
+    if (e.getSource() == cancelButton)
+      cancel();
+    if (e.getSource() == newLangButton)
+      createNewLanguage();
+  }
+
+  /**
+   * This class provides a table model for the language packs.
+   * @author <a href="mailto:Martin.Schmitz at koeln.de">Martin Schmitz</a> (University of Bonn/Germany)
+   * @version 1.0
+   */
+  private class BundleTableModel extends AbstractTableModel {
+    public BundleTableModel() {
+      super();
+      fireTableDataChanged();
+    }
+
+    public int getColumnCount() {
+      return 4;
+    }
+
+    public String getColumnName(int col) {
+      switch ( col ) {
+        case 0: return getResource("Bundle");
+        case 1: return getResource("ExtentionOf");
+        case 2: return getResource("RootLang");
+        case 3: return getResource("AdditionalLang");
+      }
+      return null;
+    }
+
+    public int getRowCount() {
+      return ResourceProvider.getRegisteredResourceProvider().size();
+    }
+
+    public Object getValueAt(int row, int col) {
+      ResourceProvider rp = ResourceProvider.getRegisteredResourceProvider().elementAt(row);
+      switch ( col ) {
+        // Name des Bundles
+        case 0: return rp.getBundleName();
+        // Name des Original-Bundles (falls es existiert)
+        case 1: String defName    = rp.getDefaultBundleName();
+                String bundleName = rp.getBundleName();
+                return !defName.equals(bundleName) ? defName : "";
+        // Root-Sprache (Fall-Back-Locale)
+        case 2: return rp.getRootLocale().getDisplayLanguage()+ " (" + rp.getRootLocale().toString() + ")";
+        // weitere zur Verfuegung stehende Sprachen (durch Komma getrennt)
+        case 3: return getLanguageString( rp.getAvailableLocales(false) );
+      }
+      return null;
+    }
+
+    private String getLanguageString(Set<Locale> locales) {
+      String langStr = "";
+      for (Locale l : locales) {
+        if ( !langStr.equals("") )
+          langStr += ", ";
+        langStr += l.getDisplayLanguage() + " (" + l.toString() + ")";
+      }
+      return langStr;
+    }
+
+    public void fireTableDataChanged() {
+      ResourceProvider.getRegisteredResourceProvider().sort();
+      super.fireTableDataChanged();
+    }
+  }
+}

Modified: trunk/src/schmitzm/swing/SwingUtil.java
===================================================================
--- trunk/src/schmitzm/swing/SwingUtil.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/swing/SwingUtil.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -45,6 +45,7 @@
 import java.awt.Window;
 import java.awt.event.MouseWheelListener;
 import java.awt.image.BufferedImage;
+import java.io.File;
 import java.text.NumberFormat;
 import java.util.Enumeration;
 import java.util.Locale;
@@ -59,6 +60,7 @@
 import javax.swing.JFrame;
 import javax.swing.JInternalFrame;
 import javax.swing.JLabel;
+import javax.swing.JOptionPane;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.JTree;
@@ -91,7 +93,7 @@
 	 * properties-Dateien unter {@code schmitzm.swing.resource.locales}
 	 * hinterlegt.
 	 */
-	public static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
+	public static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil
 			.extendPackagePath(SwingUtil.class,
 					"resource.locales.SwingResourceBundle"), Locale.ENGLISH);
 
@@ -101,7 +103,19 @@
 	public static String R(String key, Object... values) {
 		return RESOURCE.getString(key, values);
 	}
+	
+	/** Auswahl von {@link #checkFileOverwrite(Component,File,boolean)} und
+	 *  {@link #approveFileOverwrite(Component,String,boolean)} */
+	public static enum FileOverrideOption {
+	  /** Dialog wurde abgebrochen. */
+	  CANCEL,
+	  /** Auswahl "Ueberschreiben". */
+	  OVERWRITE,
+	  /** Auswahl "Immer ueberschreiben". */
+	  OVERWRITE_ALL
+	}
 
+
 	// ****************************************************************************
 	// Diese Icons sind auf Basis der Icons von Gimp erstellt
 	// Eine Sammlung aller Gimp-Icons liegt im svn: gimp-tool-cursors.xcf
@@ -934,6 +948,61 @@
 		return result.toString();
 	}
 
+	
+	  /**
+	   * Prueft, ob eine Datei existiert und fordert gegenfalls zum Bestaetigen
+	   * des Ueberschreiben auf.
+	   * @param parent Uebergeordnete GUI-Komponente fuer die Meldung
+	   * @param file zu ueberpruefende Datei
+	   * @param owAllOption Flag, ob die Option "Alle ueberschreiben" zur Auswahlt
+	   *                    gestellt wird
+	   * @return {@link FileOverrideOption#CANCEL} falls der Dialog abgebrochen wurde;
+	   *         {@link FileOverrideOption#OVERWRITE} falls das Ueberschreiben
+	   *         bestaetigt wurde; {@link FileOverrideOption#OVERWRITE_ALL} falls
+	   *         das Ueberschreiben generell bestaetigt wurde
+	   */
+	  public static FileOverrideOption checkFileOverwrite(Component parent, File file, boolean owAllOption) {
+	    if ( !file.exists() )
+	      return FileOverrideOption.OVERWRITE;
+	    return approveFileOverwrite(parent, file.getName(), owAllOption);
+	  }
+
+	  /**
+	   * Zeigt einen Dialog an, in dem das Ueberschreiben einer Datei bestaetigt
+	   * werden muss.
+	   * @param parent Uebergeordnete GUI-Komponente fuer die Meldung
+	   * @param filename Bezeichnung der Datei
+	   * @param owAllOption Flag, ob die Option "Alle ueberschreiben" zur Auswahlt
+	   *                    gestellt wird
+	   * @return {@link FileOverrideOption#CANCEL} falls der Dialog abgebrochen wurde;
+	   *         {@link FileOverrideOption#OVERWRITE} falls das Ueberschreiben
+	   *         bestaetigt wurde; {@link FileOverrideOption#OVERWRITE_ALL} falls
+	   *         das Ueberschreiben generell bestaetigt wurde
+	   */
+	  public static FileOverrideOption approveFileOverwrite(Component parent, String filename, boolean owAllOption) {
+	    // Fehler-Dialog
+	    // --> Abfrage Abbrechen / Ueberschreiben / Immer ueberschreiben
+	    String cancelOption = RESOURCE.getString("Cancel");
+	    String overwriteOption = RESOURCE.getString("Overwrite");
+	    String overwriteAllOption = RESOURCE.getString("OverwriteAll");
+	    Object selection = MultipleOptionPane.showMultipleOptionDialog(
+	        parent,
+	        JOptionPane.WARNING_MESSAGE,
+	        RESOURCE.getString("Warning")+"...",
+	        RESOURCE.getString("FileExists")+": "+filename,
+	        owAllOption ? new String[] {cancelOption, overwriteOption, overwriteAllOption} : new String[] {cancelOption, overwriteOption},
+	        cancelOption
+	        );
+	    // Ueberschreiben
+	    if (overwriteOption.equals(selection))
+	      return FileOverrideOption.OVERWRITE;
+	    // Immer ueberschreiben
+	    if (overwriteAllOption.equals(selection))
+	      return FileOverrideOption.OVERWRITE_ALL;
+	    // Abbrechen
+	    return FileOverrideOption.CANCEL;
+	  }
+
 	/**
 	 * Setzt das Label eine Componente neu. Macht nichts, falls {@code newLabel}
 	 * oder {@code comp} den Wert {@code null} hat.

Modified: trunk/src/schmitzm/swing/resource/locales/SwingResourceBundle.properties
===================================================================
--- trunk/src/schmitzm/swing/resource/locales/SwingResourceBundle.properties	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/swing/resource/locales/SwingResourceBundle.properties	2010-05-31 15:48:02 UTC (rev 881)
@@ -210,3 +210,16 @@
 CQLFitlerParser.OpTooltip.le=Lesser or equal
 CQLFitlerParser.OpTooltip.gt=Greater
 CQLFitlerParser.OpTooltip.ge=Greater or equal
+
+ResourceProviderManagerFrame.Title=Xulu language packs
+ResourceProviderManagerFrame.Bundle=Language bundle
+ResourceProviderManagerFrame.ExtentionOf=Extention of...
+ResourceProviderManagerFrame.RootLang=Root language
+ResourceProviderManagerFrame.AdditionalLang=Additional languages
+ResourceProviderManagerFrame.NewLang=Create new language...
+ResourceProviderManagerFrame.OtherLang=<other language>
+ResourceProviderManagerFrame.Language=Language
+ResourceProviderManagerFrame.LanguageCode=Language code
+ResourceProviderManagerFrame.FinishMess=Property files successfully created...
+
+

Modified: trunk/src/schmitzm/swing/resource/locales/SwingResourceBundle_de.properties
===================================================================
--- trunk/src/schmitzm/swing/resource/locales/SwingResourceBundle_de.properties	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/schmitzm/swing/resource/locales/SwingResourceBundle_de.properties	2010-05-31 15:48:02 UTC (rev 881)
@@ -59,9 +59,9 @@
 # ----------------------------------------------------
 
 Cancel=Abbrechen
-Apply=\u00dcbernehmen
+Apply=\u00DCbernehmen
 Ready=Fertig
-Open=\u00d6ffnen
+Open=\u00D6ffnen
 Close=Schliessen
 Save=Speichern
 WaitMess=Bitte warten...
@@ -70,13 +70,13 @@
 Error=Fehler
 Class=Klasse
 Description=Beschreibung
-InvalidInputMess=Unzul\u00e4ssige Eingabe
+InvalidInputMess=Unzul\u00E4ssige Eingabe
 Refresh=Aktualisieren
 Reload=Neu laden
-Clear=L\u00f6schen
-Skip=\u00dcbergehen
-Overwrite=\u00dcberschreiben
-OverwriteAll=Alle \u00fcberschreiben
+Clear=L\u00F6schen
+Skip=\u00DCbergehen
+Overwrite=\u00DCberschreiben
+OverwriteAll=Alle \u00FCberschreiben
 Replace=Ersetzen
 CreateDuplicate=Duplikat erzeugen
 RememberChoice=Immer diese Auswahl treffen
@@ -141,11 +141,11 @@
 OperationTreePanel.OpTooltip.log=Berechnet die Logarithmus-Funktion zur Basis 10.
 OperationTreePanel.OpTooltip.str=Konvertiert eine Zahl in einen Text.
 OperationTreePanel.OpTooltip.val=Konvertiert einen Text in eine Zahl.
-OperationTreePanel.OpTooltip.len=Berechnet die L\u00e4nge eines Texts.
-OperationTreePanel.OpTooltip.toupper=Konvertiert Text in Gro\u00dfbuchstaben.
+OperationTreePanel.OpTooltip.len=Berechnet die L\u00E4nge eines Texts.
+OperationTreePanel.OpTooltip.toupper=Konvertiert Text in Gro\u00DFbuchstaben.
 OperationTreePanel.OpTooltip.tolower=Konvertiert Text in Kleinbuchstaben.
 OperationTreePanel.OpTooltip.ITE=Spezifiziert einen logischen Test.
-OperationTreePanel.OpTooltip.REGEX=Wertet einen regul\u00e4ren Ausdruck auf einem Text aus.
+OperationTreePanel.OpTooltip.REGEX=Wertet einen regul\u00E4ren Ausdruck auf einem Text aus.
 OperationTreePanel.OpTooltip.SUBSTR=Liefert einen Teil-String.
 OperationTreePanel.OpTooltip.plus=Addition
 OperationTreePanel.OpTooltip.minus=Subtraktion
@@ -156,23 +156,23 @@
 OperationTreePanel.OpTooltip.ne=Ungleich
 OperationTreePanel.OpTooltip.lt=Kleiner als
 OperationTreePanel.OpTooltip.le=Kleiner oder gleich
-OperationTreePanel.OpTooltip.gt=Gr\u00f6\u00dfer als 
-OperationTreePanel.OpTooltip.ge=Gr\u00f6\u00dfer oder gleich
+OperationTreePanel.OpTooltip.gt=Gr\u00F6\u00DFer als 
+OperationTreePanel.OpTooltip.ge=Gr\u00F6\u00DFer oder gleich
 OperationTreePanel.OpTooltip.X=Liefert die X-Koordinate einer Zelle (in Raster-Koordinaten)
 OperationTreePanel.OpTooltip.Y=Liefert die Y-Koordinate einer Zelle (in Raster-Koordinaten)
 OperationTreePanel.OpTooltip.NoData=Liefert den "NoData"-Wert
 OperationTreePanel.OpTooltip.isNoData=Liefert WAHR, wenn die Zelle keinen Wert beinhaltet
 
-TranslationAskJDialog.Title=Bitte \u00fcbersetzen
-TranslationAskJDialog.ErrorMsg.InvalidCharacterInTranslation = Die Zeichen { und } d\u00fcrfen Sie leider nicht benutzen.
+TranslationAskJDialog.Title=Bitte \u00FCbersetzen
+TranslationAskJDialog.ErrorMsg.InvalidCharacterInTranslation = Die Zeichen { und } d\u00FCrfen Sie leider nicht benutzen.
 
 
 CancellableDialogAdapter.close.save.title=Speichern?
-CancellableDialogAdapter.close.save.msg=<html>Wollen Sie eventuelle \u00c4nderungen an <center><b><i>${0}</i></b></center> speichern?</html>
-CancellableDialogAdapter.forceClose.save.msg=<html>Das Fenster <center><b><i>${0}</i></b></center> muss nun gesclossen werden. Wollen Sie eventuelle \u00c4nderungen speichern?</html>
+CancellableDialogAdapter.close.save.msg=<html>Wollen Sie eventuelle \u00C4nderungen an <center><b><i>${0}</i></b></center> speichern?</html>
+CancellableDialogAdapter.forceClose.save.msg=<html>Das Fenster <center><b><i>${0}</i></b></center> muss nun gesclossen werden. Wollen Sie eventuelle \u00C4nderungen speichern?</html>
 
 HeapMemoryBar.status =${0} (${1}%) von max. ${2}
-HeapMemoryBar.tt = Eine \u00dcbersicht \u00fcber den aktuellen Speicherverbrauch der Anwendung. 
+HeapMemoryBar.tt = Eine \u00DCbersicht \u00FCber den aktuellen Speicherverbrauch der Anwendung. 
 
 
 CQLFitlerParser.OpDesc.and=AND
@@ -194,5 +194,16 @@
 CQLFitlerParser.OpTooltip.ne=Zwei Zahlen sind ungleich. z.B.  VAR <> 45
 CQLFitlerParser.OpTooltip.lt=Kleiner als, z.B. VAR < VAR2
 CQLFitlerParser.OpTooltip.le=Kleiner oder gleich, z.B. VAR < VAR2
-CQLFitlerParser.OpTooltip.gt=Gr\u00f6\u00dfer
-CQLFitlerParser.OpTooltip.ge=Gr\u00f6\u00dfer oder gleich
+CQLFitlerParser.OpTooltip.gt=Gr\u00F6\u00DFer
+CQLFitlerParser.OpTooltip.ge=Gr\u00F6\u00DFer oder gleich
+
+ResourceProviderManagerFrame.Title=Sprach-Pakete
+ResourceProviderManagerFrame.Bundle=Sprach Paket
+ResourceProviderManagerFrame.ExtentionOf=Erweiterung von...
+ResourceProviderManagerFrame.RootLang=Standard Sprache
+ResourceProviderManagerFrame.AdditionalLang=Weitere Sprachen
+ResourceProviderManagerFrame.NewLang=Neue Sprache anlegen...
+ResourceProviderManagerFrame.OtherLang=<andere Sprache>
+ResourceProviderManagerFrame.Language=Sprache
+ResourceProviderManagerFrame.LanguageCode=Sprachcode
+ResourceProviderManagerFrame.FinishMess=Property-Dateien erfolgreich erstellt...

Modified: trunk/src/skrueger/geotools/MapPaneToolBar.java
===================================================================
--- trunk/src/skrueger/geotools/MapPaneToolBar.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/skrueger/geotools/MapPaneToolBar.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -80,7 +80,7 @@
 	private static final Logger LOGGER = Logger.getLogger(MapPaneToolBar.class
 			.getName());
 
-	public static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
+	public static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil
 			.extendPackagePath(MapPaneToolBar.class,
 					"resource.locales.mapPaneToolbar"), Locale.ENGLISH);
 

Modified: trunk/src/skrueger/geotools/labelsearch/LabelSearch.java
===================================================================
--- trunk/src/skrueger/geotools/labelsearch/LabelSearch.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/skrueger/geotools/labelsearch/LabelSearch.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -66,7 +66,7 @@
 public class LabelSearch {
 	final static private Logger LOGGER = Logger.getLogger(LabelSearch.class);
 
-	public static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
+	public static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil
 			.extendPackagePath(LabelSearch.class, "labelsearch"),
 			Locale.ENGLISH);
 

Modified: trunk/src/skrueger/geotools/labelsearch/Snippet.java
===================================================================
--- trunk/src/skrueger/geotools/labelsearch/Snippet.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/skrueger/geotools/labelsearch/Snippet.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -36,7 +36,7 @@
 import skrueger.swing.TranslationAskJDialog;
 
 public class Snippet {
-	public static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
+	public static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil
 			.extendPackagePath(TranslationAskJDialog.class,
 					"resource.locales.SwingResourceBundle"), Locale.ENGLISH);
 }

Modified: trunk/src/skrueger/swing/CancellableDialogAdapter.java
===================================================================
--- trunk/src/skrueger/swing/CancellableDialogAdapter.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/skrueger/swing/CancellableDialogAdapter.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -24,7 +24,7 @@
 public abstract class CancellableDialogAdapter extends AtlasDialog implements
 		CancellableDialog {
 	
-	protected static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
+	protected static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil
 			.extendPackagePath(SwingUtil.class,
 					"resource.locales.SwingResourceBundle"), Locale.ENGLISH);
 

Modified: trunk/src/skrueger/swing/HeapBar.java
===================================================================
--- trunk/src/skrueger/swing/HeapBar.java	2010-05-31 08:43:48 UTC (rev 880)
+++ trunk/src/skrueger/swing/HeapBar.java	2010-05-31 15:48:02 UTC (rev 881)
@@ -20,7 +20,7 @@
 public class HeapBar extends JProgressBar {
 	private static final Logger LOGGER = Logger.getLogger(HeapBar.class);
 
-	protected static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
+	protected static ResourceProvider RESOURCE = ResourceProvider.newInstance(LangUtil
 			.extendPackagePath(SwingUtil.class,
 					"resource.locales.SwingResourceBundle"), Locale.ENGLISH);
 



More information about the Schmitzm-commits mailing list