/*
* Constellation - An open source and standard compliant SDI
* http://www.constellation-sdi.org
*
* Copyright 2014 Geomatys.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.constellation.gui;
// User interface
import org.constellation.resources.i18n.ResourceKeys;
import org.constellation.resources.i18n.Resources;
import org.geotools.resources.SwingUtilities;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.awt.image.RenderedImage;
// Miscellaneous
// Events
// Geotools dependencies
// Constellation
/**
* Boite de dialogue proposant à l'utilisateur d'ajuster la densité des marques sur une grille.
*
* @version $Id$
* @author Martin Desruisseaux
*/
@SuppressWarnings("serial")
public final class GridMarkControler extends JPanel {
/**
* Titre de la boîte de dialogue.
*/
private final String title;
/**
* Paneau permettant de choisir une couleur.
*/
private final MarkColorChooser colorChooser = new MarkColorChooser(true);
/**
* Case à cocher pour indiquer s'il faut ajuster
* la densité automatiquement en fonction du zoom.
*/
private final JToggleButton automatic;
/**
* Case à cocher pour indiquer s'il faut utiliser
* une valeur fixe pour la densité des marques.
*/
private final JToggleButton manual;
/**
* Composante permettant de sélectionner la densité des marques. La valeur
* "1" correspond à la densité maximale (minimum de décimation).
*/
private final JSlider decimation=new JSlider(1, 10, 1);
/**
* Construit une boîte de dialogue par défaut.
*
* @param title Titre de la boîte de dialogue.
*/
public GridMarkControler(final String title) {
super(new BorderLayout());
this.title = title;
final Resources resources = Resources.getResources(null);
automatic = new JRadioButton(resources.getString(ResourceKeys.ADJUST_WITH_ZOOM));
manual = new JRadioButton(resources.getLabel(ResourceKeys.CONSTANT_DECIMATION), true);
final JTabbedPane tabs=new JTabbedPane();
final GridBagConstraints c=new GridBagConstraints();
///////////////////
//// Couleur ////
///////////////////
if (true) {
tabs.addTab(resources.getString(ResourceKeys.COLOR), colorChooser);
}
///////////////////
//// Densité ////
///////////////////
if (true) {
final JPanel panel=new JPanel(new GridBagLayout());
decimation.setMajorTickSpacing(1);
decimation.setPaintTicks (true);
decimation.setSnapToTicks(true);
decimation.setPaintLabels(true);
decimation.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLoweredBevelBorder(),
BorderFactory.createEmptyBorder(/*top*/6, /*left*/6, /*bottom*/6, /*right*/6)));
c.gridx=0; c.anchor=c.WEST;
c.gridy=0; panel.add(automatic, c);
c.gridy=1; panel.add(manual, c);
c.gridy=2; c.insets.left=15; panel.add(decimation, c);
final ButtonGroup group=new ButtonGroup();
group.add(automatic);
group.add(manual);
final ActionListener listener=new ActionListener() {
public void actionPerformed(final ActionEvent event) {
decimation.setEnabled(manual.isSelected());
}
};
automatic.addActionListener(listener);
manual .addActionListener(listener);
tabs.addTab(resources.getString(ResourceKeys.DECIMATION), panel);
}
add(tabs, BorderLayout.CENTER);
setShape(new Ellipse2D.Float(-5, -5, 10, 10));
setColor(new Color(234, 192, 0));
}
/**
* Spécifie l'image à faire apparaître en arrière plan, ou {@code null}
* s'il n'y en a pas. Cette image sera centrée dans la zone "aperçu" du
* paneau servant à sélectionner la couleur.
*/
public void setBackground(final RenderedImage image) {
colorChooser.setBackground(image);
}
/**
* Spécifie la forme géométrique à tracer. Cette forme devrait être centrée
* à (0,0) et ses coordonnées devraient être exprimées en pixels. Cette forme
* sera centrée dans la zone "aperçu" de la boîte de dialogue. Les dimensions
* de cette forme détermineront les dimensions en pixels de la zone d'aperçu.
*/
public void setShape(final Shape shape) {
colorChooser.setShape(shape);
}
/**
* Retourne la couleur sélectionnée.
*/
public Color getColor() {
return colorChooser.getColor();
}
/**
* Spécifie la couleur sélectionnée.
*/
public void setColor(final Color color) {
colorChooser.setColor(color);
}
/**
* Retourne la décimation sélectionnée par l'utilisateur, ou 0 si la décimation
* doit être déterminée automatiquement. Si la décimation a été spécifiée par
* l'utilisateur, elle sera obligatoirement supérieure à 0.
*/
public int getDecimation() {
return manual.isSelected() ? decimation.getValue() : 0;
}
/**
* Spécifie la décimation sélectionnée. La valeur de 0 signifie
* que la décimation devra être déterminée automatiquement.
*/
public void setDecimation(final int dc) {
if (dc != 0) {
manual.setSelected(true);
decimation.setEnabled(true);
decimation.setValue(dc);
} else {
automatic.setSelected(true);
decimation.setEnabled(false);
}
}
/**
* Fait apparaître la boite de dialogue. Cette méthode retourne {@code true}
* si l'utilisateur a cliqué sur "Ok" après avoir changé au moins un paramètre.
* S'il a cliqué sur "Annuler", fermer la boîte de dialogue ou cliqué sur "Ok"
* sans n'avoir rien changé, alors cette méthode retourne {@code false}.
*/
public boolean showDialog(final Component owner) {
final Color color=getColor();
final int dc=getDecimation();
final int value=decimation.getValue();
if (SwingUtilities.showOptionDialog(owner, this, title)) {
return !color.equals(getColor()) || dc!=getDecimation();
} else {
setColor(color);
setDecimation(dc);
decimation.setValue(value);
return false;
}
}
}