/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2012 Geomatys
*
* 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.styleproperty.simple;
import java.awt.Component;
import java.awt.GraphicsEnvironment;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.AbstractListModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.geotoolkit.filter.FilterUtilities;
import org.geotoolkit.gui.swing.resource.MessageBundle;
import org.geotoolkit.gui.swing.style.StyleElementEditor;
import org.geotoolkit.map.MapLayer;
import org.geotoolkit.style.StyleConstants;
import org.jdesktop.swingx.combobox.ListComboBoxModel;
import org.opengis.filter.expression.Expression;
import org.opengis.style.Font;
/**
* Font editor pane
*
* @author Fabien Rétif (Geomatys)
* @author Johann Sorel (Geomatys)
*/
public class JFontPane extends StyleElementEditor<Font> {
private MapLayer layer = null;
private final List<String> familyFontList;
/**
* Creates new form JFontPane
*/
public JFontPane() {
super(Font.class);
initComponents();
//Initialize family font list with available font family
final GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
final String[] nomPolices = environment.getAvailableFontFamilyNames();
this.familyFontList = Arrays.asList(nomPolices);
guiFamilyFontList.setModel(new ListComboBoxModel(familyFontList));
//Initialize style font list
final List<String> styleList = new ArrayList<String>();
styleList.add(StyleConstants.FONT_STYLE_NORMAL_STRING);
styleList.add(StyleConstants.FONT_STYLE_ITALIC_STRING);
styleList.add(StyleConstants.FONT_STYLE_OBLIQUE_STRING);
styleList.add(StyleConstants.FONT_STYLE_NORMAL_STRING + " " + StyleConstants.FONT_WEIGHT_BOLD_STRING);
styleList.add(StyleConstants.FONT_STYLE_ITALIC_STRING + " " + StyleConstants.FONT_WEIGHT_BOLD_STRING);
styleList.add(StyleConstants.FONT_STYLE_OBLIQUE_STRING + " " + StyleConstants.FONT_WEIGHT_BOLD_STRING);
guiStyleList.setModel(new ListComboBoxModel(styleList));
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jLabel4 = new JLabel();
jScrollPane1 = new JScrollPane();
guiFamilyFontList = new JList();
jScrollPane2 = new JScrollPane();
guiStyleList = new JList();
jScrollPane3 = new JScrollPane();
guiSizeList = new JList();
guiFontFamily = new JTextField();
guiStyle = new JTextField();
guiSize = new JTextField();
jLabel1 = new JLabel();
jLabel2 = new JLabel();
jLabel3 = new JLabel();
jLabel4.setText("jLabel4");
guiFamilyFontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
guiFamilyFontList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
propertyChange(evt);
}
});
jScrollPane1.setViewportView(guiFamilyFontList);
guiStyleList.setModel(new AbstractListModel() {
String[] strings = { "Normale", "Italique", "Gras", "Gras Italique" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
guiStyleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
guiStyleList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
propertyChange(evt);
}
});
jScrollPane2.setViewportView(guiStyleList);
guiSizeList.setModel(new AbstractListModel() {
String[] strings = { "6", "8", "9", "10", "11", "12", "14", "16", "18", "20", "22", "24", "26", "36", "48", "72", " " };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
guiSizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
guiSizeList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
propertyChange(evt);
}
});
jScrollPane3.setViewportView(guiSizeList);
jLabel1.setText(MessageBundle.format("family")); // NOI18N
jLabel2.setText(MessageBundle.format("type")); // NOI18N
jLabel3.setText(MessageBundle.format("size")); // NOI18N
GroupLayout layout = new GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(Alignment.TRAILING, layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addComponent(jScrollPane1, GroupLayout.DEFAULT_SIZE, 115, Short.MAX_VALUE)
.addComponent(guiFontFamily)
.addComponent(jLabel1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(Alignment.LEADING, false)
.addComponent(jScrollPane2)
.addComponent(guiStyle, GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
.addComponent(jLabel2, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(Alignment.LEADING, false)
.addComponent(jScrollPane3)
.addComponent(guiSize, GroupLayout.DEFAULT_SIZE, 110, Short.MAX_VALUE)
.addComponent(jLabel3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
);
layout.linkSize(SwingConstants.HORIZONTAL, new Component[] {guiSize, jScrollPane3});
layout.linkSize(SwingConstants.HORIZONTAL, new Component[] {guiStyle, jScrollPane2});
layout.setVerticalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(5, 5, 5)
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(jLabel3))
.addComponent(jLabel1, GroupLayout.PREFERRED_SIZE, 18, GroupLayout.PREFERRED_SIZE))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(guiFontFamily, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(guiStyle, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addComponent(guiSize, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
.addPreferredGap(ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(Alignment.LEADING)
.addComponent(jScrollPane1)
.addComponent(jScrollPane2)
.addComponent(jScrollPane3)))
);
}// </editor-fold>//GEN-END:initComponents
private void propertyChange(ListSelectionEvent evt) {//GEN-FIRST:event_propertyChange
guiSize.setText(String.valueOf(guiSizeList.getSelectedValue()));
guiStyle.setText(String.valueOf(guiStyleList.getSelectedValue()));
guiFontFamily.setText(String.valueOf(guiFamilyFontList.getSelectedValue()));
firePropertyChange(PROPERTY_UPDATED, null, create());
}//GEN-LAST:event_propertyChange
// Variables declaration - do not modify//GEN-BEGIN:variables
private JList guiFamilyFontList;
private JTextField guiFontFamily;
private JTextField guiSize;
private JList guiSizeList;
private JTextField guiStyle;
private JList guiStyleList;
private JLabel jLabel1;
private JLabel jLabel2;
private JLabel jLabel3;
private JLabel jLabel4;
private JScrollPane jScrollPane1;
private JScrollPane jScrollPane2;
private JScrollPane jScrollPane3;
// End of variables declaration//GEN-END:variables
@Override
public void parse(Font target) {
if(target == null) return;
//Parsing family fonts
for(Expression f : target.getFamily()){
if(!FilterUtilities.isStatic(f))continue;
final String currentFamily = f.evaluate(null, String.class);
if(this.familyFontList.contains(currentFamily)){
guiFamilyFontList.setSelectedValue(currentFamily, true);
break;
}
}
//Parsing size
final Expression expSize = target.getSize();
if (FilterUtilities.isStatic(expSize)) {
guiSizeList.setSelectedValue(expSize.evaluate(null, String.class), true);
}
//Parsing style. Warning style and weight are mixed in graphic mode
final Expression style = target.getStyle();
final Expression weight = target.getWeight();
if (FilterUtilities.isStatic(style) && FilterUtilities.isStatic(weight)) {
final String w = weight.evaluate(null, String.class);
if (w.equalsIgnoreCase(StyleConstants.FONT_WEIGHT_BOLD_STRING)) {
guiStyleList.setSelectedValue(style.evaluate(null, String.class) + " " + w, true);
} else {
guiStyleList.setSelectedValue(style.evaluate(null, String.class), true);
}
}
}
@Override
public Font create() {
String style = guiStyle.getText();
String weight = StyleConstants.FONT_WEIGHT_NORMAL_STRING;
if (style.contains(StyleConstants.FONT_WEIGHT_BOLD_STRING)) {
style = style.replaceAll(StyleConstants.FONT_WEIGHT_BOLD_STRING, "").trim();
weight = StyleConstants.FONT_WEIGHT_BOLD_STRING;
}
return getStyleFactory().font(
getFilterFactory().literal(guiFontFamily.getText()),
getFilterFactory().literal(style),
getFilterFactory().literal(weight),
getFilterFactory().literal(guiSize.getText()));
}
@Override
protected Object[] getFirstColumnComponents() {
return new Object[]{};
}
}