package de.latlon.deejump.plugin.style; import static de.latlon.deejump.plugin.style.VertexStylesFactory.BITMAP_STYLE; import static de.latlon.deejump.plugin.style.VertexStylesFactory.CIRCLE_STYLE; import static de.latlon.deejump.plugin.style.VertexStylesFactory.CROSS_STYLE; import static de.latlon.deejump.plugin.style.VertexStylesFactory.SQUARE_STYLE; import static de.latlon.deejump.plugin.style.VertexStylesFactory.STAR_STYLE; import static de.latlon.deejump.plugin.style.VertexStylesFactory.TRIANGLE_STYLE; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Hashtable; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.event.ChangeListener; import javax.swing.filechooser.FileFilter; import com.vividsolutions.jump.I18N; import com.vividsolutions.jump.util.Blackboard; import com.vividsolutions.jump.workbench.ui.renderer.style.VertexStyle; import com.vividsolutions.jump.workbench.ui.style.BasicStylePanel; /** * <code>VertexStyleChooser</code> * * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a> * @author last edited by: $Author: stranger $ * * @version $Revision: 1300 $, $Date: 2008-02-14 14:37:00 +0100 (Do, 14. Feb 2008) $ */ public class VertexStyleChooser extends JPanel { private static final long serialVersionUID = 7256506666365045855L; static final List<String> STYLE_NAMES; static { List<String> TEMP_STYLE_NAMES = new ArrayList<String>(5); TEMP_STYLE_NAMES.add(SQUARE_STYLE); TEMP_STYLE_NAMES.add(CIRCLE_STYLE); TEMP_STYLE_NAMES.add(TRIANGLE_STYLE); TEMP_STYLE_NAMES.add(CROSS_STYLE); TEMP_STYLE_NAMES.add(STAR_STYLE); TEMP_STYLE_NAMES.add(BITMAP_STYLE); STYLE_NAMES = Collections.unmodifiableList(TEMP_STYLE_NAMES); } private JComboBox pointTypeComboBox; private JButton bitmapChangeButton; private String currentFilename; // [sstein 02.08.2006] - removed because we would have two sliders /** * */ public JSlider sizeSlider; private boolean activateOwnSlider = false; private Blackboard blackboard; private BasicStylePanel stylePanel; /** * @param activateOwnSlider */ public VertexStyleChooser(boolean activateOwnSlider) { super(); initGUI(); this.activateOwnSlider = activateOwnSlider; } protected void setBlackboard(Blackboard persistentBlackboard) { blackboard = persistentBlackboard; } protected void setStylePanel(DeeRenderingStylePanel stylePanel) { this.stylePanel = stylePanel; } private void initGUI() { pointTypeComboBox = new JComboBox(); pointTypeComboBox.setEditable(false); pointTypeComboBox.addItem(I18N.get("deejump.ui.style.RenderingStylePanel.square")); pointTypeComboBox.addItem(I18N.get("deejump.ui.style.RenderingStylePanel.circle")); pointTypeComboBox.addItem(I18N.get("deejump.ui.style.RenderingStylePanel.triangle")); pointTypeComboBox.addItem(I18N.get("deejump.ui.style.RenderingStylePanel.cross")); pointTypeComboBox.addItem(I18N.get("deejump.ui.style.RenderingStylePanel.star")); pointTypeComboBox.addItem(I18N.get("deejump.ui.style.RenderingStylePanel.bitmap")); pointTypeComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox comboBox = (JComboBox) e.getSource(); String selectedItem = STYLE_NAMES.get(comboBox.getSelectedIndex()); setSelectedStyle(selectedItem); } }); bitmapChangeButton = new JButton(I18N.get("deejump.ui.style.RenderingStylePanel.bitmap-change")); bitmapChangeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { openFileChooser(); } }); if (sizeSlider == null) { sizeSlider = new JSlider(); // [sstein] init only if needed } sizeSlider.setBorder(BorderFactory.createTitledBorder("Point size: ")); if (this.activateOwnSlider == true) { Hashtable<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>(); labelTable.put(new Integer(5), new JLabel("5")); labelTable.put(new Integer(10), new JLabel("10")); labelTable.put(new Integer(15), new JLabel("15")); labelTable.put(new Integer(20), new JLabel("20")); sizeSlider.setLabelTable(labelTable); sizeSlider.setEnabled(true); sizeSlider.setMajorTickSpacing(1); sizeSlider.setMajorTickSpacing(0); sizeSlider.setPaintLabels(true); sizeSlider.setMinimum(4); sizeSlider.setValue(4); sizeSlider.setMaximum(20); sizeSlider.setSnapToTicks(false); sizeSlider.setPreferredSize(new Dimension(130, 49)); } JPanel oberstPanel = new JPanel(); oberstPanel.add(new JLabel(I18N.get("deejump.ui.style.RenderingStylePanel.point-display-type"))); oberstPanel.add(pointTypeComboBox); oberstPanel.add(bitmapChangeButton); JPanel sliderPanel = new JPanel(); // [sstein] always init although it // may not be needed sliderPanel.add(sizeSlider); setLayout(new BorderLayout()); add(oberstPanel, BorderLayout.NORTH); if (this.activateOwnSlider == true) { add(sliderPanel, BorderLayout.CENTER); } } /** * @param actionListener */ public void addActionListener(ActionListener actionListener) { pointTypeComboBox.addActionListener(actionListener); bitmapChangeButton.addActionListener(actionListener); } /** * @param actionListener */ public void removeActionListener(ActionListener actionListener) { pointTypeComboBox.removeActionListener(actionListener); bitmapChangeButton.removeActionListener(actionListener); } /** * @param cl */ public void addChangeListener(ChangeListener cl) { if (this.activateOwnSlider == true) { this.sizeSlider.addChangeListener(cl); } } /** * @param cl */ public void removeChangeListener(ChangeListener cl) { if (this.activateOwnSlider == true) { this.sizeSlider.removeChangeListener(cl); } } boolean openFileChooser() { boolean imageIsLoaded = false; JFileChooser fileChooser = new JFileChooser(); String f = (String) blackboard.get("VertexStyleChooser.last-location"); if (f != null) { File dir = new File(f); while (!dir.isDirectory()) { dir = dir.getParentFile(); } fileChooser.setCurrentDirectory(dir); } fileChooser.setFileFilter(new FileFilter() { @Override public boolean accept(File file) { return file.isDirectory() || file.getName().toLowerCase().endsWith(".png") || file.getName().toLowerCase().endsWith(".gif") || file.getName().toLowerCase().endsWith(".jpg") || file.getName().toLowerCase().endsWith(".svg"); } @Override public String getDescription() { return "*.png, *.gif, *.jpg, *.svg"; } }); int showFileChooser = fileChooser.showOpenDialog(this); if (showFileChooser == JFileChooser.APPROVE_OPTION) { String currentFilePath; currentFilePath = fileChooser.getSelectedFile().getAbsolutePath(); setCurrentFileName(currentFilePath); setSelectedStyle(BITMAP_STYLE); blackboard.put("VertexStyleChooser.last-location", currentFilePath); } return imageIsLoaded; } protected void setCurrentFileName(String fileName) { currentFilename = fileName; } /** * @return the file name */ public String getCurrentFileName() { return currentFilename; } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); this.pointTypeComboBox.setEnabled(enabled); this.bitmapChangeButton.setEnabled(enabled); if (this.activateOwnSlider == true) { this.sizeSlider.setEnabled(enabled); } } /** * @return the selected vertex style */ public VertexStyle getSelectedStyle() { String wellKnowName = STYLE_NAMES.get(this.pointTypeComboBox.getSelectedIndex()); if (BITMAP_STYLE.equals(wellKnowName)) { wellKnowName = getCurrentFileName(); if (wellKnowName == null) { // reset to the first style wellKnowName = STYLE_NAMES.get(0); } } VertexStyle vertexStyle = VertexStylesFactory.createVertexStyle(wellKnowName); vertexStyle.setSize(sizeSlider.getValue()); vertexStyle.setFillColor(stylePanel.getBasicStyle().getFillColor()); vertexStyle.setLineColor(stylePanel.getBasicStyle().getLineColor()); return vertexStyle; } /** * @param currentVertexStyle */ public void setSelectedStyle(String currentVertexStyle) { int nameIndex = STYLE_NAMES.indexOf(currentVertexStyle); if (nameIndex > -1 && nameIndex < STYLE_NAMES.size()) { this.pointTypeComboBox.setSelectedIndex(nameIndex); } } }