[Schmitzm-commits] r173 - trunk/src/schmitzm/geotools/gui

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Tue Jun 30 22:41:44 CEST 2009


Author: alfonx
Date: 2009-06-30 22:41:43 +0200 (Tue, 30 Jun 2009)
New Revision: 173

Modified:
   trunk/src/schmitzm/geotools/gui/FeatureCollectionFilterPanel.java
   trunk/src/schmitzm/geotools/gui/FeatureTablePane.java
Log:
* Changed the behaviour of the preview JMapPane in the FeatureTablePane. 
** In FeaturetablePane it now shows the table's features in gry, and the selected features in red.
** In FeatureCollectionFilterPane, the unfiltered features are shown in gray, with the filter's result in red.


Modified: trunk/src/schmitzm/geotools/gui/FeatureCollectionFilterPanel.java
===================================================================
--- trunk/src/schmitzm/geotools/gui/FeatureCollectionFilterPanel.java	2009-06-30 20:40:00 UTC (rev 172)
+++ trunk/src/schmitzm/geotools/gui/FeatureCollectionFilterPanel.java	2009-06-30 20:41:43 UTC (rev 173)
@@ -28,148 +28,213 @@
 import javax.swing.event.AncestorListener;
 
 import org.geotools.feature.FeatureCollection;
+import org.geotools.map.DefaultMapLayer;
+import org.geotools.styling.Rule;
 import org.geotools.styling.Style;
+import org.geotools.styling.Symbolizer;
 import org.opengis.filter.Filter;
 
 import schmitzm.geotools.feature.AttributeTypeFilter;
 import schmitzm.geotools.feature.FeatureOperationTree;
 import schmitzm.geotools.feature.FeatureOperationTreeFilter;
 import schmitzm.geotools.feature.FeatureOperationTreeParser;
+import schmitzm.geotools.feature.FeatureUtil;
+import schmitzm.geotools.styling.StylingUtil;
 import schmitzm.swing.ExceptionDialog;
 import schmitzm.swing.SwingUtil;
+import sun.util.logging.resources.logging;
 
 /**
  * Diese Klasse stellt ein Panel zur Verfuegung, mit der ein
- * {@link FeatureOperationTreeFilter} in Form einer arithmetischen
- * (und boolschen) Formel erstellt werden kann. Neben den Komponenten zur
- * Definition/Eingabe des Filters enthaelt das Panel einen Vorschau-Bereich,
- * in dem eine {@link FeatureCollection} angezeigt wird, auf der der Filter
+ * {@link FeatureOperationTreeFilter} in Form einer arithmetischen (und
+ * boolschen) Formel erstellt werden kann. Neben den Komponenten zur
+ * Definition/Eingabe des Filters enthaelt das Panel einen Vorschau-Bereich, in
+ * dem eine {@link FeatureCollection} angezeigt wird, auf der der Filter
  * angewandt wird.
+ * 
  * @see FeatureOperationTree
  * @see FeatureOperationTreeParser
  * @see FeatureOperationTreeFilter
- * @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 FeatureCollectionFilterPanel extends FeatureFilterPanel {
-  /** Konstante fuer die Layout-Constraints des Vorschau-Bereich.
-   *  @see #layoutConstraints
-   *  @see #previewPanel */
-  public static final String PREVIEW_PANEL = FeatureCollectionFilterPanel.class.getName()+"filterPreviewPanel";
-  /** Konstante fuer die Layout-Constraints des Testen-Button.
-   *  @see #layoutConstraints
-   *  @see #resetCaptions(Map)
-   *  @see #testButton */
-  public static final String TEST_BUTTON = FeatureCollectionFilterPanel.class.getName()+".TestButton";
-  /** Konstante fuer die Layout-Constraints des Testen-Button.
-   *  @see #layoutConstraints
-   *  @see #testButton */
-  public static final String TESTRESULT_LABEL = FeatureCollectionFilterPanel.class.getName()+".TestResultLabel";
-  /** Konstante fuer die Layout-Constraints des Details-Button.
-   *  @see #layoutConstraints
-   *  @see #testResultDetails */
-  public static final String TESTRESULTDETAILS_BUTTON = FeatureCollectionFilterPanel.class.getName()+".TestResultDetailsButton";
-  /** Konstante fuer den Tooltip des Details-Button.
-   *  @see #testResultDetails */
-  public static final String TESTRESULTDETAILS_TOOLTIP = FeatureCollectionFilterPanel.class.getName()+".TestResultDetailsToolTip";
 
-  /** Panel fuer Filter-Vorschau. */
-  private FeatureTablePane previewPanel = null;
-  /** Button zum Testen der Formel */
-  protected JButton testButton = null;
-  /** Label mit Ergebnis des Formel-Tests */
-  protected JLabel  testResult = null;
-  /** Button fuer Details des Formel-Tests-Ergebnis */
-  protected JButton  testResultDetails = null;
+	/**
+	 * Konstante fuer die Layout-Constraints des Vorschau-Bereich.
+	 * 
+	 * @see #layoutConstraints
+	 * @see #previewPanel
+	 */
+	public static final String PREVIEW_PANEL = FeatureCollectionFilterPanel.class
+			.getName()
+			+ "filterPreviewPanel";
+	/**
+	 * Konstante fuer die Layout-Constraints des Testen-Button.
+	 * 
+	 * @see #layoutConstraints
+	 * @see #resetCaptions(Map)
+	 * @see #testButton
+	 */
+	public static final String TEST_BUTTON = FeatureCollectionFilterPanel.class
+			.getName()
+			+ ".TestButton";
+	/**
+	 * Konstante fuer die Layout-Constraints des Testen-Button.
+	 * 
+	 * @see #layoutConstraints
+	 * @see #testButton
+	 */
+	public static final String TESTRESULT_LABEL = FeatureCollectionFilterPanel.class
+			.getName()
+			+ ".TestResultLabel";
+	/**
+	 * Konstante fuer die Layout-Constraints des Details-Button.
+	 * 
+	 * @see #layoutConstraints
+	 * @see #testResultDetails
+	 */
+	public static final String TESTRESULTDETAILS_BUTTON = FeatureCollectionFilterPanel.class
+			.getName()
+			+ ".TestResultDetailsButton";
+	/**
+	 * Konstante fuer den Tooltip des Details-Button.
+	 * 
+	 * @see #testResultDetails
+	 */
+	public static final String TESTRESULTDETAILS_TOOLTIP = FeatureCollectionFilterPanel.class
+			.getName()
+			+ ".TestResultDetailsToolTip";
 
-  /** Speichert, ob im Vorschau-Panel eine grafische Anzeige erscheinen soll */
-  private boolean geomPrev = false;
-  /** Speichert, die FeatureCollection */
-  private FeatureCollection fc = null;
-  
-  /** Speichert den letzten Fehler in der Filter-Regel. */
-  protected Throwable testError = null;
+	/** Panel fuer Filter-Vorschau. */
+	private FeatureTablePane previewPanel = null;
+	/** Button zum Testen der Formel */
+	protected JButton testButton = null;
+	/** Label mit Ergebnis des Formel-Tests */
+	protected JLabel testResult = null;
+	/** Button fuer Details des Formel-Tests-Ergebnis */
+	protected JButton testResultDetails = null;
 
-  /**
-   * Erzeugt ein neues Panel.
-   * @param fc definiert die zur Verfuegung gestellten Feature-Attribute
-   * @param geomPrev bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
-   *                    oder nicht ({@code false})
-   * @see FeatureCollection#getSchema()
-   */
-  public FeatureCollectionFilterPanel(FeatureCollection fc, boolean geomPrev) {
-    this( fc, geomPrev, true );
-  }
+	/** Speichert, ob im Vorschau-Panel eine grafische Anzeige erscheinen soll */
+	private boolean geomPrev = false;
+	/** Speichert, die FeatureCollection */
+	private FeatureCollection fc = null;
 
-  /**
-   * Erzeugt ein neues Panel
-   * @param fc definiert die zur Verfuegung gestellten Feature-Attribute
-   * @param initGUI Flag, ob {@link #initGUI()} am Ende des Konstruktor
-   *        aufgerufen werden soll (wenn {@code false} muss die explizit
-   *        durch die Unterklasse erfolgen!)
-   */
-  protected FeatureCollectionFilterPanel(FeatureCollection fc, boolean geomPrev, boolean initGUI) {
-    super(fc.getSchema(), false);
-    this.geomPrev = geomPrev;
+	/** Speichert den letzten Fehler in der Filter-Regel. */
+	protected Throwable testError = null;
 
-    // Layout-Anordnung fuer GUI
-    layoutConstraints.get( ATTRIBUTE_TABLE ).gridwidth     = 3;
-    layoutConstraints.get( ATTRIBUTE_TABLE ).weighty       = 0.3;
-    layoutConstraints.get( RULE_TEXTFIELD ).gridwidth      = 2;
-    layoutConstraints.get( OPERATOR_COMBOBOX ).gridx       = 2;
-    layoutConstraints.put( TEST_BUTTON,              new GridBagConstraints(0,4,1,1,  0,  0.0,GridBagConstraints.WEST,   GridBagConstraints.NONE, new Insets(5,10,10,10),0,0) );
-    layoutConstraints.put( TESTRESULT_LABEL,         new GridBagConstraints(1,4,2,1,1.0,  0.0,GridBagConstraints.WEST,   GridBagConstraints.HORIZONTAL, new Insets(5,10,10,10),0,0) );
-    layoutConstraints.put( TESTRESULTDETAILS_BUTTON, new GridBagConstraints(2,4,1,1,  0,  0.0,GridBagConstraints.EAST,   GridBagConstraints.NONE, new Insets(5,10,10,10),0,0) );
-    layoutConstraints.put( PREVIEW_PANEL,            new GridBagConstraints(0,5,3,1,  0,  0.7,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5,10,10,10),0,0) );
+	/**
+	 * Erzeugt ein neues Panel.
+	 * 
+	 * @param fc
+	 *            definiert die zur Verfuegung gestellten Feature-Attribute
+	 * @param geomPrev
+	 *            bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
+	 *            oder nicht ({@code false})
+	 * @see FeatureCollection#getSchema()
+	 */
+	public FeatureCollectionFilterPanel(FeatureCollection fc, boolean geomPrev) {
+		this(fc, geomPrev, true);
+	}
 
-    if ( initGUI )
-      initGUI();
+	/**
+	 * Erzeugt ein neues Panel
+	 * 
+	 * @param fc
+	 *            definiert die zur Verfuegung gestellten Feature-Attribute
+	 * @param initGUI
+	 *            Flag, ob {@link #initGUI()} am Ende des Konstruktor aufgerufen
+	 *            werden soll (wenn {@code false} muss die explizit durch die
+	 *            Unterklasse erfolgen!)
+	 */
+	protected FeatureCollectionFilterPanel(FeatureCollection fc,
+			boolean geomPrev, boolean initGUI) {
+		super(fc.getSchema(), false);
+		this.geomPrev = geomPrev;
 
-    setFeatureCollection(fc);
-  }
+		// Layout-Anordnung fuer GUI
+		layoutConstraints.get(ATTRIBUTE_TABLE).gridwidth = 3;
+		layoutConstraints.get(ATTRIBUTE_TABLE).weighty = 0.3;
+		layoutConstraints.get(RULE_TEXTFIELD).gridwidth = 2;
+		layoutConstraints.get(OPERATOR_COMBOBOX).gridx = 2;
+		layoutConstraints.put(TEST_BUTTON, new GridBagConstraints(0, 4, 1, 1,
+				0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE,
+				new Insets(5, 10, 10, 10), 0, 0));
+		layoutConstraints
+				.put(TESTRESULT_LABEL, new GridBagConstraints(1, 4, 2, 1, 1.0,
+						0.0, GridBagConstraints.WEST,
+						GridBagConstraints.HORIZONTAL,
+						new Insets(5, 10, 10, 10), 0, 0));
+		layoutConstraints.put(TESTRESULTDETAILS_BUTTON, new GridBagConstraints(
+				2, 4, 1, 1, 0, 0.0, GridBagConstraints.EAST,
+				GridBagConstraints.NONE, new Insets(5, 10, 10, 10), 0, 0));
+		layoutConstraints.put(PREVIEW_PANEL, new GridBagConstraints(0, 5, 3, 1,
+				0, 0.7, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
+				new Insets(5, 10, 10, 10), 0, 0));
 
-  /**
-   * Initalisiert die GUI des Fensters. Der "Start-Button" der durch die
-   * Oberklasse definiert wird, wird dabei aus dem Panel entfernt!
-   */
-  protected void initGUI() {
+		if (initGUI)
+			initGUI();
+
+		setFeatureCollection(fc);
+	}
+
+	/**
+	 * Initalisiert die GUI des Fensters. Der "Start-Button" der durch die
+	 * Oberklasse definiert wird, wird dabei aus dem Panel entfernt!
+	 */
+	protected void initGUI() {
 		super.initGUI();
 
 		// Button zum Testen des Filters
-		testButton = new JButton(GeotoolsGUIUtil.RESOURCE.getString(TEST_BUTTON));
+		testButton = new JButton(GeotoolsGUIUtil.RESOURCE
+				.getString(TEST_BUTTON));
 		testButton.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent e) {
 				performRuleTest();
 			}
 		});
-		
+
 		// Button fuer Details des Test-Ergebnis
-		testResultDetails = new JButton( GeotoolsGUIUtil.RESOURCE.getString(TESTRESULTDETAILS_BUTTON) );
+		testResultDetails = new JButton(GeotoolsGUIUtil.RESOURCE
+				.getString(TESTRESULTDETAILS_BUTTON));
 		testResultDetails.setVisible(false);
-		testResultDetails.setToolTipText( GeotoolsGUIUtil.RESOURCE.getString(TESTRESULTDETAILS_TOOLTIP) );
-		testResultDetails.addActionListener( new ActionListener() {
-		  public void actionPerformed(ActionEvent e) {
-		    ExceptionDialog.show(FeatureCollectionFilterPanel.this, testError, true);
-		  }
+		testResultDetails.setToolTipText(GeotoolsGUIUtil.RESOURCE
+				.getString(TESTRESULTDETAILS_TOOLTIP));
+		testResultDetails.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				ExceptionDialog.show(FeatureCollectionFilterPanel.this,
+						testError, true);
+			}
 		});
-		
+
 		// Label fuer Fehler-Meldungen
 		testResult = new JLabel("");
 		// Schrift: rot und fett
-		testResult.setForeground( Color.RED );
-		testResult.setFont( testResult.getFont().deriveFont(Font.BOLD) );
+		testResult.setForeground(Color.RED);
+		testResult.setFont(testResult.getFont().deriveFont(Font.BOLD));
 
 		if (getPreviewPanel() == null)
 			setPreviewPanel(new FeatureTablePane(null, geomPrev) {
+
+				FeatureCollection fullFeatureCollection;
+
 				// In der Tabelle sollen einzelne Werte selektiert werden
 				// koennen
 				// und diese bei einem Doppelklick in die Formel uebernommen
 				// werden
+				@Override
 				protected void initGUI(boolean geomPreview) {
 					super.initGUI(geomPreview);
+
+					if (mapPane != null && fullFeatureCollection != null) {
+
+					}
+
 					// nur einzelne Zellen duerfen selektiert werden
 					featuresTable.setColumnSelectionAllowed(true);
-					featuresTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+					featuresTable
+							.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 					// beim Klick auf eine Tabellenzelle, soll der Wert in die
 					// Formel
 					// uebernommen werden
@@ -189,11 +254,55 @@
 
 				// Im Vorschau-Panel sollen nicht die in der Tabelle selektieren
 				// Features angezeigt werden, sondern immer ALLE Features der
-				// Tabelle (also
-				// das Resultat des Filters)
+				// Tabelle (also das Resultat des Filters)
+				@Override
 				public void performListSelection() {
 				}
 
+				@Override
+				/*
+				 * This method differs from the super-method! This method does
+				 * not care about selections in the table. It shows the complete
+				 * table (= paramter fc) as a selection on top of the complete
+				 * feature collection (which is rendered in gray).
+				 */
+				protected void showFeaturesInMap(FeatureCollection fc) {
+					System.out.println("SHOW IN MAP!");
+					final FeatureCollection fullFeatureCollection = FeatureCollectionFilterPanel.this
+							.getFeatureCollection();
+
+					if (fullFeatureCollection != null && fc != null)
+						System.out.println(fullFeatureCollection.size()
+								+ " vs " + fc.size());
+
+					getPreviewPanel().mapPane.getContext().clearLayerList();
+
+					if (fullFeatureCollection != null) {
+						/**
+						 * Als unterstes layer sollen alle Features in grau
+						 * dargestellt werden. Darüber dann in rot das
+						 * Filterergebnis.
+						 */
+						getPreviewPanel().mapPane.getContext().addLayer(
+								new DefaultMapLayer(fullFeatureCollection,
+										StylingUtil.createStyleSimple(fullFeatureCollection, Color.lightGray, Color.darkGray)));
+
+						// This thows an exception... We have to move to GT filters i guess.
+						getPreviewPanel().mapPane.zoomTo(fullFeatureCollection);
+					}
+
+					if (fc != null) {
+
+						/**
+						 * Der Inhalt der Tabelle soll in rot darüber gezeichnet werden
+						 */
+
+						getPreviewPanel().mapPane.getContext().addLayer(
+								new DefaultMapLayer(fc, StylingUtil.createStyleSimple(fc, Color.red, Color.white)));
+					}
+
+				}
+
 			});
 		// Geometry-Attribute sollen nicht angezeigt werden
 		getPreviewPanel().setAttributeFilter(AttributeTypeFilter.NO_GEOMETRY);
@@ -201,176 +310,203 @@
 		SwingUtil.setPreferredHeight(getPreviewPanel(), 50);
 
 		// zusaetzliche Komponenten einfuegen
-		add(testButton,        layoutConstraints.get(TEST_BUTTON));
-        add(testResultDetails, layoutConstraints.get(TESTRESULTDETAILS_BUTTON));
-        add(testResult,        layoutConstraints.get(TESTRESULT_LABEL));
+		add(testButton, layoutConstraints.get(TEST_BUTTON));
+		add(testResultDetails, layoutConstraints.get(TESTRESULTDETAILS_BUTTON));
+		add(testResult, layoutConstraints.get(TESTRESULT_LABEL));
 		add(getPreviewPanel(), layoutConstraints.get(PREVIEW_PANEL));
-		
+
 		// listen to the moment, the panel is inserted into a frame
 		// and then set the TEST-Button the default button
-		addAncestorListener( new AncestorListener() {
-          @Override
-          public void ancestorAdded(AncestorEvent event) {
-            if ( getRootPane() != null && getRootPane().getDefaultButton() == null )
-              getRootPane().setDefaultButton(testButton);
-            
-          }
-          @Override
-          public void ancestorMoved(AncestorEvent event) {}
-          @Override
-          public void ancestorRemoved(AncestorEvent event) {}
+		addAncestorListener(new AncestorListener() {
+			@Override
+			public void ancestorAdded(AncestorEvent event) {
+				if (getRootPane() != null
+						&& getRootPane().getDefaultButton() == null)
+					getRootPane().setDefaultButton(testButton);
+
+			}
+
+			@Override
+			public void ancestorMoved(AncestorEvent event) {
+			}
+
+			@Override
+			public void ancestorRemoved(AncestorEvent event) {
+			}
 		});
 	}
 
-  /**
-   * Setzt den Filter, der die dargestellten Attribute bestimmt.
-   * @param attrFilter Filter
-   */
-  public void setAttributeFilter(AttributeTypeFilter attrFilter) {
-    super.setAttributeFilter(attrFilter);
-    // Filter auch auf die in der Vorschau dargestellten
-    // Attribut-Spalten anwenden
-    getPreviewPanel().setAttributeFilter(attrFilter);
-  }
+	/**
+	 * Setzt den Filter, der die dargestellten Attribute bestimmt.
+	 * 
+	 * @param attrFilter
+	 *            Filter
+	 */
+	public void setAttributeFilter(AttributeTypeFilter attrFilter) {
+		super.setAttributeFilter(attrFilter);
+		// Filter auch auf die in der Vorschau dargestellten
+		// Attribut-Spalten anwenden
+		getPreviewPanel().setAttributeFilter(attrFilter);
+	}
 
-  /**
-   * Setzt die Labels des Panels neu.
-   * @param captionMap Map
-   * @see FeatureFilterPanel#resetCaptions(Map)
-   */
-  public void resetCaptions(Map<String,Object> captionMap) {
-    super.resetCaptions(captionMap);
-    SwingUtil.resetCaption( testButton, captionMap.get(TEST_BUTTON) );
-  }
+	/**
+	 * Setzt die Labels des Panels neu.
+	 * 
+	 * @param captionMap
+	 *            Map
+	 * @see FeatureFilterPanel#resetCaptions(Map)
+	 */
+	public void resetCaptions(Map<String, Object> captionMap) {
+		super.resetCaptions(captionMap);
+		SwingUtil.resetCaption(testButton, captionMap.get(TEST_BUTTON));
+	}
 
-  /**
-   * Fuegt an der Curserposition einen Wert in die Formel ein.
-   * @param value Object
-   */
-  protected void insertValueInRule(Object value) {
-    if ( value == null )
-      value = "";
-    
-    String ruleValue = value.toString();
-    // Nur numerische Werte direkt in Formel einfuegen.
-    // Andere Werte als String in Anfuehrungsstrichen gekapselt.
-    if ( !(value instanceof Number) )
-      ruleValue = "\""+ruleValue+"\"";
-    // Wert in Formel einfuegen
-    performOperatorInsert(ruleValue, (JTextField)this.rule.getInputComponent());
-    // Fokus zurueck auf Formel-Feld
-    rule.grabFocus();
-  }
+	/**
+	 * Fuegt an der Curserposition einen Wert in die Formel ein.
+	 * 
+	 * @param value
+	 *            Object
+	 */
+	protected void insertValueInRule(Object value) {
+		if (value == null)
+			value = "";
 
-  /**
-   * Setzt die aktuell im Dialog eingegebene Formel und aktualisiert die
-   * Vorschau.
-   * @param rule Formel als String
-   */
-  public void setRule(String rule) {
-    super.setRule(rule);
-    performRuleTest();
-  }
+		String ruleValue = value.toString();
+		// Nur numerische Werte direkt in Formel einfuegen.
+		// Andere Werte als String in Anfuehrungsstrichen gekapselt.
+		if (!(value instanceof Number))
+			ruleValue = "\"" + ruleValue + "\"";
+		// Wert in Formel einfuegen
+		performOperatorInsert(ruleValue, (JTextField) this.rule
+				.getInputComponent());
+		// Fokus zurueck auf Formel-Feld
+		rule.grabFocus();
+	}
 
+	/**
+	 * Setzt die aktuell im Dialog eingegebene Formel und aktualisiert die
+	 * Vorschau.
+	 * 
+	 * @param rule
+	 *            Formel als String
+	 */
+	public void setRule(String rule) {
+		super.setRule(rule);
+		performRuleTest();
+	}
 
-  /**
-   * Wird ausgefuehrt, wenn der Testen-Button gedrueckt wird.
-   * Erzeugt einen Filter aus der angegebenen Formel, wertet diese
-   * auf der {@link FeatureCollection} aus und zeigt das Resultat im
-   * {@linkplain #previewPanel Vorschau-Bereich} an.
-   * <br>
-   * Tritt ein Fehler auf, wird die entsprechende Meldung im Label
-   * {@link #testResult} (neben dem Button) angezeigt.
-   *
-   */
-  protected void performRuleTest() {
-    try {
-      FeatureCollection subCollection = filterFeatureCollection();
-      getPreviewPanel().setFeatureCollection( subCollection );
-      resetComponentsAfterTest(null);
-    } catch (Exception err) {
-      getPreviewPanel().setFeatureCollection( null );
-      resetComponentsAfterTest(err);
-    }
-    rule.grabFocus();
-  }
-  
-  /**
-   * (De)aktiviert Label und Button fuer die Fehlermeldung entsprechend einer etwaigen
-   * Fehlermeldung. Wird ausgefuehrt nachdem der "Test"-Button geklickt wurde.
-   * @param err Fehler (kann {@code null} sein)
-   */
-  protected void resetComponentsAfterTest(Throwable err) {
-    testError = err;
-    testResult.setText( err != null ? err.getMessage() : "" );
-    testResultDetails.setVisible( err != null );
-  }
+	/**
+	 * Wird ausgefuehrt, wenn der Testen-Button gedrueckt wird. Erzeugt einen
+	 * Filter aus der angegebenen Formel, wertet diese auf der
+	 * {@link FeatureCollection} aus und zeigt das Resultat im
+	 * {@linkplain #previewPanel Vorschau-Bereich} an. <br>
+	 * Tritt ein Fehler auf, wird die entsprechende Meldung im Label
+	 * {@link #testResult} (neben dem Button) angezeigt.
+	 * 
+	 */
+	protected void performRuleTest() {
+		try {
+			FeatureCollection subCollection = filterFeatureCollection();
+			getPreviewPanel().setFeatureCollection(subCollection);
+			resetComponentsAfterTest(null);
+		} catch (Exception err) {
+			getPreviewPanel().setFeatureCollection(null);
+			resetComponentsAfterTest(err);
+		}
+		rule.grabFocus();
+	}
 
-  /**
-   * Setzt die {@link FeatureCollection}, die (gefiltert) in der Vorschau angezeigt
-   * wird.
-   * @param fc eine {@link FeatureCollection}, die zum Feature-Type (Schema) des
-   *        Formel-Panels passt
-   * @exception IllegalArgumentException falls die FeatureCollection nicht zum
-   *            Schema des Panels passt
-   * @see FeatureCollection#getSchema()
-   */
-  public void setFeatureCollection(FeatureCollection fc) {
-    if ( getFeatureType() == null )
-      setFeatureType( fc.getSchema() );
-    if ( !fc.getSchema().equals( getFeatureType() ) )
-      throw new IllegalArgumentException("FeatureCollection does not fit to schema of the panel!");
-    this.fc = fc;
-    if ( getPreviewPanel() != null )
-      getPreviewPanel().setFeatureCollection( fc );
-  }
+	/**
+	 * (De)aktiviert Label und Button fuer die Fehlermeldung entsprechend einer
+	 * etwaigen Fehlermeldung. Wird ausgefuehrt nachdem der "Test"-Button
+	 * geklickt wurde.
+	 * 
+	 * @param err
+	 *            Fehler (kann {@code null} sein)
+	 */
+	protected void resetComponentsAfterTest(Throwable err) {
+		testError = err;
+		testResult.setText(err != null ? err.getMessage() : "");
+		testResultDetails.setVisible(err != null);
+	}
 
-  /**
-   * Liefert die {@link FeatureCollection}, auf die (gefiltert) im Vorschau-Panel
-   * angezeigt wird.
-   */
-  public FeatureCollection getFeatureCollection() {
-    return fc;
-  }
+	/**
+	 * Setzt die {@link FeatureCollection}, die (gefiltert) in der Vorschau
+	 * angezeigt wird.
+	 * 
+	 * @param fc
+	 *            eine {@link FeatureCollection}, die zum Feature-Type (Schema)
+	 *            des Formel-Panels passt
+	 * @exception IllegalArgumentException
+	 *                falls die FeatureCollection nicht zum Schema des Panels
+	 *                passt
+	 * @see FeatureCollection#getSchema()
+	 */
+	public void setFeatureCollection(FeatureCollection fc) {
+		if (getFeatureType() == null)
+			setFeatureType(fc.getSchema());
+		if (!fc.getSchema().equals(getFeatureType()))
+			throw new IllegalArgumentException(
+					"FeatureCollection does not fit to schema of the panel!");
+		this.fc = fc;
+		if (getPreviewPanel() != null) {
+			getPreviewPanel().setFeatureCollection(fc);
+		}
+	}
 
-  /**
-   * Setzt den Style, in dem die Features in der Vorschau dargestellt werden.
-   * @param style Style fuer die Features
-   */
-  public void setFeatureStyle( Style style ) {
-    getPreviewPanel().setFeatureStyle( style );
-  }
+	/**
+	 * Liefert die {@link FeatureCollection}, auf die (gefiltert) im
+	 * Vorschau-Panel angezeigt wird.
+	 */
+	public FeatureCollection getFeatureCollection() {
+		return fc;
+	}
 
-  /**
-   * Liefert den Style, in dem die Features in der Vorschau dargestellt werden.
-   */
-  public Style getFeatureStyle() {
-    return getPreviewPanel().getFeatureStyle();
-  }
+	/**
+	 * Setzt den Style, in dem die Features in der Vorschau dargestellt werden.
+	 * 
+	 * @param style
+	 *            Style fuer die Features
+	 */
+	public void setFeatureStyle(Style style) {
+		getPreviewPanel().setFeatureStyle(style);
+	}
 
-  /**
-   * Wendet die im Panel eingetragene Filter-Formel auf die {@link FeatureCollection}
-   * des Vorschau-Fensters an und liefert die entsprechende Sub-Collection.
-   * @see FeatureCollection#subCollection(Filter)
-   */
-  public FeatureCollection filterFeatureCollection( ) {
-    return getFeatureCollection().subCollection( createFilter() );
-  }
+	/**
+	 * Liefert den Style, in dem die Features in der Vorschau dargestellt
+	 * werden.
+	 */
+	public Style getFeatureStyle() {
+		return getPreviewPanel().getFeatureStyle();
+	}
 
-  /**
-   * Wendet die im Panel eingetragene Filter-Formel auf eine {@link FeatureCollection}
-   * and und liefert die entsprechende Sub-Collection.
-   * @see FeatureCollection#subCollection(Filter)
-   */
-  public FeatureCollection filterFeatureCollection( FeatureCollection fc ) {
-    return fc.subCollection( createFilter() );
-  }
+	/**
+	 * Wendet die im Panel eingetragene Filter-Formel auf die
+	 * {@link FeatureCollection} des Vorschau-Fensters an und liefert die
+	 * entsprechende Sub-Collection.
+	 * 
+	 * @see FeatureCollection#subCollection(Filter)
+	 */
+	public FeatureCollection filterFeatureCollection() {
+		return getFeatureCollection().subCollection(createFilter());
+	}
 
-public void setPreviewPanel(FeatureTablePane previewPanel) {
-	this.previewPanel = previewPanel;
-}
+	/**
+	 * Wendet die im Panel eingetragene Filter-Formel auf eine
+	 * {@link FeatureCollection} and und liefert die entsprechende
+	 * Sub-Collection.
+	 * 
+	 * @see FeatureCollection#subCollection(Filter)
+	 */
+	public FeatureCollection filterFeatureCollection(FeatureCollection fc) {
+		return fc.subCollection(createFilter());
+	}
 
-public FeatureTablePane getPreviewPanel() {
-	return previewPanel;
+	public void setPreviewPanel(FeatureTablePane previewPanel) {
+		this.previewPanel = previewPanel;
+	}
+
+	public FeatureTablePane getPreviewPanel() {
+		return previewPanel;
+	}
 }
-}

Modified: trunk/src/schmitzm/geotools/gui/FeatureTablePane.java
===================================================================
--- trunk/src/schmitzm/geotools/gui/FeatureTablePane.java	2009-06-30 20:40:00 UTC (rev 172)
+++ trunk/src/schmitzm/geotools/gui/FeatureTablePane.java	2009-06-30 20:41:43 UTC (rev 173)
@@ -12,8 +12,8 @@
 package schmitzm.geotools.gui;
 
 import java.awt.BorderLayout;
+import java.awt.Color;
 import java.awt.Dimension;
-import java.awt.event.MouseEvent;
 
 import javax.swing.BorderFactory;
 import javax.swing.JScrollPane;
@@ -27,11 +27,11 @@
 import javax.swing.table.TableModel;
 
 import org.geotools.feature.FeatureCollection;
-import org.geotools.map.MapLayer;
+import org.geotools.map.DefaultMapLayer;
 import org.geotools.styling.Style;
 
 import schmitzm.geotools.feature.AttributeTypeFilter;
-import schmitzm.geotools.feature.FeatureUtil;
+import schmitzm.geotools.styling.StylingUtil;
 import schmitzm.swing.JPanel;
 import schmitzm.swing.SortableJTable;
 import schmitzm.swing.SwingUtil;
@@ -42,245 +42,283 @@
  * Tabelle die in der Tabelle ausgewaehlten Features grafisch dargestellt.<br>
  * <br>
  * <b>Bemerkung:</b><br>
- * Als {@code TableModel} fuer die Feature-Tabelle verwendet diese Klasse
- * ein eigenes internes {@link TableModel}, welches effizienter arbeitet,
- * als {@link org.geotools.gui.swing.table.FeatureTableModel org.geotools.gui.swing.table.FeatureTableModel}.
- * @author <a href="mailto:martin.schmitz at koeln.de">Martin Schmitz</a> (University of Bonn/Germany)
+ * Als {@code TableModel} fuer die Feature-Tabelle verwendet diese Klasse ein
+ * eigenes internes {@link TableModel}, welches effizienter arbeitet, als
+ * {@link org.geotools.gui.swing.table.FeatureTableModel
+ * org.geotools.gui.swing.table.FeatureTableModel}.
+ * 
+ * @author <a href="mailto:martin.schmitz at koeln.de">Martin Schmitz</a>
+ *         (University of Bonn/Germany)
  * @version 1.0
  */
 public class FeatureTablePane extends JPanel {
-  /** Tabelle in der die Features angezeigt werden. */
-  protected SortableJTable featuresTable = null;
-  
-  /** Tabellen-Modell der Feature-Tabelle. */
-  protected FeatureCollectionTableModel featuresTableModel = null;
-  /** Preview-Bereich fuer die in der Tabelle selektierten Features. */
-  protected JMapPane   mapPane = null;
-  /** Style, in dem die Features in der Karte dargestellt werden */
-  protected Style featureStyle = null;
-  /** Splitpane, das die Karten-Vorschau von der Tabelle trennt ({@code null}
-   *  wenn Karten-Vorschau deaktiviert ist). */
-  protected JSplitPane splitPane = null;
-  private JScrollPane featuresTableScrollPane;
+	/** Tabelle in der die Features angezeigt werden. */
+	protected SortableJTable featuresTable = null;
 
-  public JScrollPane getFeaturesTableScrollPane() {
-	return featuresTableScrollPane;
-}
+	/** Tabellen-Modell der Feature-Tabelle. */
+	protected FeatureCollectionTableModel featuresTableModel = null;
+	/** Preview-Bereich fuer die in der Tabelle selektierten Features. */
+	protected JMapPane mapPane = null;
+	/** Style, in dem die Features in der Karte dargestellt werden */
+	protected Style featureStyle = null;
+	/**
+	 * Splitpane, das die Karten-Vorschau von der Tabelle trennt ({@code null}
+	 * wenn Karten-Vorschau deaktiviert ist).
+	 */
+	protected JSplitPane splitPane = null;
+	private JScrollPane featuresTableScrollPane;
 
-/**
-   * Erzeugt einen neue Komponente mit Preview-Bereich.
-   */
-  public FeatureTablePane() {
-    this(false);
-  }
+	public JScrollPane getFeaturesTableScrollPane() {
+		return featuresTableScrollPane;
+	}
 
-  /**
-   * Erzeugt einen neue Komponente mit Preview-Bereich.
-   * @param fc angezeigte Features
-   */
-  public FeatureTablePane(FeatureCollection fc) {
-    this(fc,true);
-  }
+	/**
+	 * Erzeugt einen neue Komponente mit Preview-Bereich.
+	 */
+	public FeatureTablePane() {
+		this(false);
+	}
 
-  /**
-   * Erzeugt einen neue Komponente.
-   * @param geomPreview bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
-   *                    oder nicht ({@code false})
-   */
-  public FeatureTablePane(boolean geomPreview) {
-    this(null,geomPreview);
-  }
+	/**
+	 * Erzeugt einen neue Komponente mit Preview-Bereich.
+	 * 
+	 * @param fc
+	 *            angezeigte Features
+	 */
+	public FeatureTablePane(FeatureCollection fc) {
+		this(fc, true);
+	}
 
-  /**
-   * Erzeugt einen neue Komponente.
-   * @param fc          angezeigte Features
-   * @param geomPreview bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
-   *                    oder nicht ({@code false})
-   */
-  public FeatureTablePane(FeatureCollection fc, boolean geomPreview) {
-    this(fc,null,geomPreview);
-  }
+	/**
+	 * Erzeugt einen neue Komponente.
+	 * 
+	 * @param geomPreview
+	 *            bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
+	 *            oder nicht ({@code false})
+	 */
+	public FeatureTablePane(boolean geomPreview) {
+		this(null, geomPreview);
+	}
 
-  /**
-   * Erzeugt einen neue Komponente.
-   * @param fc          angezeigte Features
-   * @param style       Style, in dem die Features in der Karte dargestellt werden
-   * @param geomPreview bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
-   *                    oder nicht ({@code false})
-   */
-  public FeatureTablePane(FeatureCollection fc, Style style, boolean geomPreview) {
-    this(new FeatureCollectionTableModel(fc),style,geomPreview);
-  }
-  
-  /**
-   * Erzeugt einen neue Komponente.
-   * @param model       verwendetes TableModel (kann {@code null} sein)
-   * @param fc          angezeigte Features
-   * @param style       Style, in dem die Features in der Karte dargestellt werden
-   * @param geomPreview bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
-   *                    oder nicht ({@code false})
-   */
-  public FeatureTablePane(FeatureCollectionTableModel model, Style style, boolean geomPreview) {
-    super();
-    this.featureStyle = style;
-    this.featuresTableModel = (model != null) ? model : new FeatureCollectionTableModel();
+	/**
+	 * Erzeugt einen neue Komponente.
+	 * 
+	 * @param fc
+	 *            angezeigte Features
+	 * @param geomPreview
+	 *            bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
+	 *            oder nicht ({@code false})
+	 */
+	public FeatureTablePane(FeatureCollection fc, boolean geomPreview) {
+		this(fc, null, geomPreview);
+	}
 
-    initGUI( geomPreview );
+	/**
+	 * Erzeugt einen neue Komponente.
+	 * 
+	 * @param fc
+	 *            angezeigte Features
+	 * @param style
+	 *            Style, in dem die Features in der Karte dargestellt werden
+	 * @param geomPreview
+	 *            bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
+	 *            oder nicht ({@code false})
+	 */
+	public FeatureTablePane(FeatureCollection fc, Style style,
+			boolean geomPreview) {
+		this(new FeatureCollectionTableModel(fc), style, geomPreview);
+	}
 
-    featuresTableScrollPane = new JScrollPane(
-      featuresTable,
-      JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
-      JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
-    );
+	/**
+	 * Erzeugt einen neue Komponente.
+	 * 
+	 * @param model
+	 *            verwendetes TableModel (kann {@code null} sein)
+	 * @param fc
+	 *            angezeigte Features
+	 * @param style
+	 *            Style, in dem die Features in der Karte dargestellt werden
+	 * @param geomPreview
+	 *            bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
+	 *            oder nicht ({@code false})
+	 */
+	public FeatureTablePane(FeatureCollectionTableModel model, Style style,
+			boolean geomPreview) {
+		super();
+		this.featureStyle = style;
+		this.featuresTableModel = (model != null) ? model
+				: new FeatureCollectionTableModel();
 
-    // Komponenten dem Pane hinzufuegen
-    if ( mapPane != null ) {
-      splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
-//      splitPane.setInnerBorder(null);
-      splitPane.setLeftComponent(mapPane);
-      splitPane.setRightComponent(featuresTableScrollPane);
-      splitPane.setDividerLocation(0.3); // SK: Does have no effect because JMapPane overrules this 
-      splitPane.setOneTouchExpandable(true);
-      add(splitPane);
-    } else {
-      add(featuresTableScrollPane);
-    }
-  }
+		initGUI(geomPreview);
 
-  /**
-   * Initalisiert die GUI.
-   * @param geomPreview bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
-   *                    oder nicht ({@code false})
-   */
-  protected void initGUI(boolean geomPreview ) {
-    setLayout( new BorderLayout() );
-    // MapPane fuer Preview der in der Tabelle selektieren Features
-    if ( geomPreview ) {
-      this.mapPane = new JMapPane() {
-        // Bei Links-Klick auf das gesamte Layer zoomen
-        public void mouseClicked(MouseEvent e) {
-          if (getState() == JMapPane.RESET && e.getButton() == e.BUTTON1) {
-            MapLayer layer = getTopLayer();
-            if (layer != null)
-              try {
-                setMapArea(layer.getFeatureSource().getBounds());
-                refresh();
-              } catch (Exception err) {
-              }
-          } else {
-            super.mouseClicked(e);
-          }
-        }
-      };
-      mapPane.setState(JMapPane.RESET);
-      mapPane.setWindowSelectionState(JMapPane.NONE);
-      mapPane.setHighlight(false);
-      mapPane.setMinimumSize(new Dimension(50, 50));
-      SwingUtil.setPreferredWidth(mapPane,100);
-      mapPane.setBorder(BorderFactory.createLoweredBevelBorder());
-    }
+		featuresTableScrollPane = new JScrollPane(featuresTable,
+				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
+				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 
-    // Tabelle fuer FeatureCollection
-    featuresTable = new SortableJTable();
-    featuresTable.setModel( featuresTableModel );
-    featuresTable.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
-    featuresTable.setColumnSelectionAllowed(false);
-    featuresTable.setSelectionMode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
-    // Wenn Auswahl in Tabelle sich aendert, Vorschau anpassen
-    featuresTable.getSelectionModel().addListSelectionListener( new ListSelectionListener() {
-      public void valueChanged(ListSelectionEvent e) {
-    	  if (!e.getValueIsAdjusting()) 
-    		  performListSelection();
-      }
-    } );
-    // Wenn neue FeatureCollection gesetzt wird, alle Features
-    // in Vorschau anzeigen
-    featuresTableModel.addTableModelListener( new TableModelListener() {
-      public void tableChanged(TableModelEvent e) {
-        showFeaturesInMap( getFeatureCollection() );
-      }
-    } );
-  }
+		// Komponenten dem Pane hinzufuegen
+		if (mapPane != null) {
+			splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
+			// splitPane.setInnerBorder(null);
+			splitPane.setLeftComponent(mapPane);
+			splitPane.setRightComponent(featuresTableScrollPane);
+			splitPane.setDividerLocation(0.3); // SK: Does have no effect
+												// because JMapPane overrules
+												// this
+			splitPane.setOneTouchExpandable(true);
+			add(splitPane);
+		} else {
+			add(featuresTableScrollPane);
+		}
+	}
 
-  /**
-   * Liefert den Filter, der die dargestellten Attribut-Spalten bestimmt.
-   */
-  public AttributeTypeFilter getAttributeFilter() {
-    return featuresTableModel.getAttributeFilter();
-  }
+	/**
+	 * Initalisiert die GUI.
+	 * 
+	 * @param geomPreview
+	 *            bestimmt, ob ein Preview-Bereich angezeigt wird ({@code true})
+	 *            oder nicht ({@code false})
+	 */
+	protected void initGUI(boolean geomPreview) {
+		setLayout(new BorderLayout());
+		// MapPane fuer Preview der in der Tabelle selektieren Features
+		if (geomPreview) {
+			this.mapPane = new JMapPane();
 
-  /**
-   * Setzt den Filter, der die dargestellten Attribut-Spalten bestimmt.
-   * @param attrFilter Filter
-   */
-  public void setAttributeFilter(AttributeTypeFilter attrFilter) {
-    featuresTableModel.setAttributeFilter(attrFilter);
-  }
+			// {
+			// // Bei Links-Klick auf das gesamte Layer zoomen
+			// public void mouseClicked(MouseEvent e) {
+			// if (getState() == JMapPane.RESET && e.getButton() == e.BUTTON1) {
+			// MapLayer layer = getTopLayer();
+			// if (layer != null)
+			// try {
+			// setMapArea(layer.getFeatureSource().getBounds());
+			// refresh();
+			// } catch (Exception err) {
+			// }
+			// } else {
+			// super.mouseClicked(e);
+			// }
+			// }
+			// };
+			mapPane.setState(JMapPane.RESET);
+			mapPane.setWindowSelectionState(JMapPane.NONE);
+			mapPane.setHighlight(false);
+			mapPane.setMinimumSize(new Dimension(50, 50));
+			SwingUtil.setPreferredWidth(mapPane, 100);
+			mapPane.setBorder(BorderFactory.createLoweredBevelBorder());
+		}
 
-  /**
-   * Prueft, ob der Geometry-Preview angezeigt wird.
-   */
-  public boolean isGeometryPreviewVisible() {
-    return mapPane.isVisible();
-  }
+		// Tabelle fuer FeatureCollection
+		featuresTable = new SortableJTable();
+		featuresTable.setModel(featuresTableModel);
+		featuresTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+		featuresTable.setColumnSelectionAllowed(false);
+		featuresTable
+				.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+		// Wenn Auswahl in Tabelle sich aendert, Vorschau anpassen
+		featuresTable.getSelectionModel().addListSelectionListener(
+				new ListSelectionListener() {
+					public void valueChanged(ListSelectionEvent e) {
+						if (!e.getValueIsAdjusting())
+							performListSelection();
+					}
+				});
+		// Wenn neue FeatureCollection gesetzt wird, alle Features
+		// in Vorschau anzeigen
+		featuresTableModel.addTableModelListener(new TableModelListener() {
+			public void tableChanged(TableModelEvent e) {
+				showFeaturesInMap(getFeatureCollection());
+			}
+		});
+	}
 
-  /**
-   * Setzt die angezeigte {@link FeatureCollection}
-   * @param fc anzuzeigende Features
-   */
-  public void setFeatureCollection(FeatureCollection fc) {
-    featuresTableModel.setFeatureCollection(fc);
-  }
+	/**
+	 * Liefert den Filter, der die dargestellten Attribut-Spalten bestimmt.
+	 */
+	public AttributeTypeFilter getAttributeFilter() {
+		return featuresTableModel.getAttributeFilter();
+	}
 
-  /**
-   * Liefert die Attribut-Tabelle um deren Eigenschaften (z.B. Spaltenbreite)
-   * zu aendern.
-   */
-  public SortableJTable getTable() {
-    return featuresTable;
-  }
+	/**
+	 * Setzt den Filter, der die dargestellten Attribut-Spalten bestimmt.
+	 * 
+	 * @param attrFilter
+	 *            Filter
+	 */
+	public void setAttributeFilter(AttributeTypeFilter attrFilter) {
+		featuresTableModel.setAttributeFilter(attrFilter);
+	}
 
-  /**
-   * Liefert die angezeigten Features.
-   */
-  public FeatureCollection getFeatureCollection() {
-    return featuresTableModel.getFeatureCollection();
-  }
+	/**
+	 * Prueft, ob der Geometry-Preview angezeigt wird.
+	 */
+	public boolean isGeometryPreviewVisible() {
+		return mapPane.isVisible();
+	}
 
-  /**
-   * Setzt den Style, in dem die Features in der Karte dargestellt werden.
-   * @param style Style fuer die Features
-   */
-  public void setFeatureStyle( Style style ) {
-    this.featureStyle = style;
-  }
+	/**
+	 * Setzt die angezeigte {@link FeatureCollection}
+	 * 
+	 * @param fc
+	 *            anzuzeigende Features
+	 */
+	public void setFeatureCollection(FeatureCollection fc) {
+		featuresTableModel.setFeatureCollection(fc);
+	}
 
-  /**
-   * Liefert den Style, in dem die Features in der Karte dargestellt werden.
-   */
-  public Style getFeatureStyle() {
-    return this.featureStyle;
-  }
+	/**
+	 * Liefert die Attribut-Tabelle um deren Eigenschaften (z.B. Spaltenbreite)
+	 * zu aendern.
+	 */
+	public SortableJTable getTable() {
+		return featuresTable;
+	}
 
-  /**
-   * Liefert die in der Tabelle selektierten Features.
-   */
-  public FeatureCollection getSelectedFeatures() {
-    return featuresTableModel.getFeaturesAsCollection( featuresTable.getSelectedModelRows() );
-  }
+	/**
+	 * Liefert die angezeigten Features.
+	 */
+	public FeatureCollection getFeatureCollection() {
+		return featuresTableModel.getFeatureCollection();
+	}
 
-  /**
-   * Zeigt die aktuell in der Tabelle selektierten Features im Preview-Bereich an.
-   */
-  protected void performListSelection() {
-    FeatureCollection subCollection = getSelectedFeatures();
-    // Wenn keine Auswahl getaetigt ist, alle Features anzeigen
-    if (subCollection == null || subCollection.isEmpty() )
-      subCollection = getFeatureCollection();
-    showFeaturesInMap( subCollection );
-  }
+	/**
+	 * Setzt den Style, in dem die Features in der Karte dargestellt werden.
+	 * 
+	 * @param style
+	 *            Style fuer die Features
+	 */
+	public void setFeatureStyle(Style style) {
+		this.featureStyle = style;
+	}
 
 	/**
+	 * Liefert den Style, in dem die Features in der Karte dargestellt werden.
+	 */
+	public Style getFeatureStyle() {
+		return this.featureStyle;
+	}
+
+	/**
+	 * Liefert die in der Tabelle selektierten Features.
+	 */
+	public FeatureCollection getSelectedFeatures() {
+		return featuresTableModel.getFeaturesAsCollection(featuresTable
+				.getSelectedModelRows());
+	}
+
+	/**
+	 * Zeigt die aktuell in der Tabelle selektierten Features im Preview-Bereich
+	 * an.
+	 */
+	protected void performListSelection() {
+		FeatureCollection subCollection = getSelectedFeatures();
+		// Wenn keine Auswahl getaetigt ist, alle Features anzeigen
+		if (subCollection == null || subCollection.isEmpty())
+			subCollection = getFeatureCollection();
+		showFeaturesInMap(subCollection);
+	}
+
+	/**
 	 * Zeigt einen {@link FeatureCollection} in der Karte an. Diese Funktion hat
 	 * keinen Einfluss auf die in der Tabelle angezeigten Features!!
 	 * 
@@ -292,25 +330,38 @@
 			return;
 		mapPane.getContext().clearLayerList();
 
-//		Envelope bounds = null;
+		final FeatureCollection allFeatures = getFeatureCollection();
 
+		/**
+		 * Add ALL features to the JMapPane as the base laye and style them in
+		 * grey
+		 */
+		if (allFeatures != null) {
+			mapPane.getContext().addLayer(
+					new DefaultMapLayer(allFeatures, StylingUtil.createStyleSimple(allFeatures, Color.lightGray, Color.darkGray)));
+		}
+
 		if (fc != null && fc.size() > 0
 				&& fc.getSchema().getDefaultGeometry() != null) {
-			if (getFeatureStyle() == null)
-				setFeatureStyle(FeatureUtil.createDefaultStyle(fc));
+
+			if (getFeatureStyle() == null) {
+				setFeatureStyle(StylingUtil.createStyleSimple(fc, Color.red, Color.white));
+			}
 			mapPane.getContext().addLayer(fc, getFeatureStyle());
-			
-//			if (featuresTableModel instanceof StyledFeatureCollectionTableModel) {
-//				bounds = ((StyledFeatureCollectionTableModel) featuresTableModel)
-//						.getBounds();
-//			}
-//			// featuresTableModel.getFeatureCollection().getBounds();
-//			if (bounds == null)
-//				bounds = fc.getBounds();
-			
-//			System.out.println(fc.size());
 
-			mapPane.zoomTo(fc); // zoom to the full bound if available,
+			// if (featuresTableModel instanceof
+			// StyledFeatureCollectionTableModel) {
+			// bounds = ((StyledFeatureCollectionTableModel) featuresTableModel)
+			// .getBounds();
+			// }
+			// // featuresTableModel.getFeatureCollection().getBounds();
+			// if (bounds == null)
+			// bounds = fc.getBounds();
+
+			// System.out.println(fc.size());
+
+			mapPane.zoomTo(getFeatureCollection());
+			// zoom to the full bound if available,
 			// otherwise just to the bounds of the
 			// selected.
 
@@ -318,4 +369,3 @@
 		mapPane.refresh();
 	}
 }
-



More information about the Schmitzm-commits mailing list