/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2007 - 2008, Open Source Geospatial Foundation (OSGeo)
* (C) 2008 - 2009, Johann Sorel
*
* 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;
* version 2.1 of the License.
*
* 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.
*/
package org.geotoolkit.gui.swing.propertyedit;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JToolBar;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.geotoolkit.gui.swing.propertyedit.styleproperty.JSymbolizerStylePanel;
import org.geotoolkit.font.FontAwesomeIcons;
import org.geotoolkit.font.IconBuilder;
import org.geotoolkit.gui.swing.resource.MessageBundle;
import org.geotoolkit.style.RandomStyleBuilder;
import org.geotoolkit.gui.swing.util.SwingUtilities;
import org.opengis.style.LineSymbolizer;
import org.opengis.style.PointSymbolizer;
import org.opengis.style.PolygonSymbolizer;
import org.opengis.style.Symbolizer;
/**
* Property panel
*
* @author Johann Sorel
* @module
*/
public class JPropertyPane extends JPanel{
private final JButton apply = new JButton(MessageBundle.format("property_apply"));
private final JButton revert = new JButton(MessageBundle.format("property_revert"));
private final JButton close = new JButton(MessageBundle.format("property_close"));
private final JTabbedPane tabs = new JTabbedPane();
private final ArrayList<PropertyPane> panels = new ArrayList<>();
private final JToolBar bas = new JToolBar();
private PropertyPane activePanel = null;
public JPropertyPane(final boolean app, final boolean rev) {
this(app,rev,false,null);
}
public JPropertyPane(final boolean app, final boolean rev, final boolean clo, final JDialog dialog) {
super(new BorderLayout());
bas.setFloatable(false);
bas.setLayout(new FlowLayout(FlowLayout.RIGHT));
if(app)bas.add(apply);
if(rev)bas.add(revert);
if(clo)bas.add(close);
apply.setIcon(IconBuilder.createIcon(FontAwesomeIcons.ICON_CHECK, 16, new Color(0, 100, 0)));
revert.setIcon(IconBuilder.createIcon(FontAwesomeIcons.ICON_UNDO, 16, new Color(255, 150, 50)));
close.setIcon(IconBuilder.createIcon(FontAwesomeIcons.ICON_CHEVRON_RIGHT, 16, new Color(0, 100, 0)));
tabs.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
activePanel = (PropertyPane)tabs.getSelectedComponent();
}
});
apply.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(activePanel != null){
activePanel.apply();
}
}
});
revert.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(activePanel != null){
activePanel.reset();
}
}
});
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.dispose();
}
});
add(BorderLayout.SOUTH,bas);
}
public void addEditPanel(final PropertyPane pan){
panels.add(pan);
removeAll();
tabs.removeAll();
if(panels.size()>1){
for(PropertyPane pp : panels){
tabs.addTab(pp.getTitle(),pp.getIcon(),pp.getComponent(),pp.getToolTip());
}
add(BorderLayout.CENTER,tabs);
}else if(panels.size() == 1){
final JComponent comp = (JComponent)panels.get(0);
add(BorderLayout.CENTER,comp);
activePanel = (PropertyPane) comp;
}
add(BorderLayout.SOUTH,bas);
revalidate();
repaint();
}
public void addApplyListener(ActionListener listener){
apply.addActionListener(listener);
}
public static void showDialog(Component parent, final List<PropertyPane> lst, final Object target){
showDialog(parent,lst,target, true);
}
public static void showDialog(Component parent, final List<PropertyPane> lst, final Object target, final boolean modal){
final Window window = SwingUtilities.windowForComponent(parent);
final JDialog dia = new JDialog(window);
dia.setModal(modal);
dia.setTitle(MessageBundle.format("property_properties"));
//dia.setAlwaysOnTop(true);
final JPropertyPane pane = new JPropertyPane(true,true,true,dia);
dia.setContentPane(pane);
for(PropertyPane pro : lst){
pro.setTarget(target);
pane.addEditPanel(pro);
}
dia.setSize(900,700);
dia.setLocationRelativeTo(null);
dia.setVisible(true);
}
public static Symbolizer showSymbolizerDialog(Component parent, final Symbolizer symbol, final Object target){
return showSymbolizerDialog(parent, symbol, false, target);
}
public static Symbolizer showSymbolizerDialog(Component parent, final Symbolizer symbol, final boolean allowTypeChange, final Object target){
final JPanel container = new JPanel(new BorderLayout());
final JSymbolizerStylePanel pane = new JSymbolizerStylePanel();
pane.setTarget(target);
pane.setSymbolizer(symbol);
container.add(BorderLayout.CENTER,pane);
if(allowTypeChange){
final JComboBox box = new JComboBox(
new Object[]{
PointSymbolizer.class,
LineSymbolizer.class,
PolygonSymbolizer.class
});
if(symbol instanceof PointSymbolizer){
box.setSelectedItem(PointSymbolizer.class);
}else if(symbol instanceof LineSymbolizer){
box.setSelectedItem(LineSymbolizer.class);
}else if(symbol instanceof PolygonSymbolizer){
box.setSelectedItem(PolygonSymbolizer.class);
}
box.setRenderer(new DefaultListCellRenderer(){
@Override
public Component getListCellRendererComponent(JList jlist, Object o, int i, boolean bln, boolean bln1) {
final JLabel lbl = (JLabel) super.getListCellRendererComponent(jlist, o, i, bln, bln1);
if(o == PointSymbolizer.class){
lbl.setText(MessageBundle.format("symbol_point"));
}else if(o == LineSymbolizer.class){
lbl.setText(MessageBundle.format("symbol_line"));
}else if(o == PolygonSymbolizer.class){
lbl.setText(MessageBundle.format("symbol_polygon"));
}
return lbl;
}
});
box.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent ie) {
Object o = box.getSelectedItem();
if(o == PointSymbolizer.class){
pane.setSymbolizer(RandomStyleBuilder.createRandomPointSymbolizer());
}else if(o == LineSymbolizer.class){
pane.setSymbolizer(RandomStyleBuilder.createRandomLineSymbolizer());
}else if(o == PolygonSymbolizer.class){
pane.setSymbolizer(RandomStyleBuilder.createRandomPolygonSymbolizer());
}
}
});
container.add(BorderLayout.NORTH,box);
}
final Window window = SwingUtilities.windowForComponent(parent);
final JDialog dia = new JDialog(window);
dia.setModal(true);
dia.setTitle(MessageBundle.format("property_properties"));
//dia.setAlwaysOnTop(true);
dia.setSize(900,700);
dia.setLocationRelativeTo(null);
dia.setContentPane(container);
dia.setVisible(true);
return pane.getSymbolizer();
}
}