From 3a9b843c9ab9ca5cbf129c984a454fe0cfdd46db Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Sun, 1 Jul 2012 17:39:17 +0000 Subject: [PATCH] Add file chooser. --- .../gui/configdialog/AppearancePanel.java | 243 +++++++++++------- 1 file changed, 157 insertions(+), 86 deletions(-) diff --git a/core/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java b/core/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java index e5e616dd3..34d430e05 100644 --- a/core/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java +++ b/core/src/net/sf/openrocket/gui/configdialog/AppearancePanel.java @@ -1,23 +1,27 @@ package net.sf.openrocket.gui.configdialog; +import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; import java.lang.reflect.Method; -import java.util.EventListener; +import java.net.MalformedURLException; +import java.net.URL; import java.util.EventObject; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JColorChooser; import javax.swing.JComboBox; +import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.JSpinner; +import javax.swing.JTextField; import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; -import net.sf.openrocket.appearance.Appearance; import net.sf.openrocket.appearance.AppearanceBuilder; import net.sf.openrocket.appearance.Decal.EdgeMode; import net.sf.openrocket.gui.SpinnerEditor; @@ -28,15 +32,13 @@ import net.sf.openrocket.gui.adaptors.IntegerModel; import net.sf.openrocket.gui.components.BasicSlider; import net.sf.openrocket.gui.components.ColorIcon; import net.sf.openrocket.gui.components.StyledLabel; -import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.components.StyledLabel.Style; +import net.sf.openrocket.gui.components.UnitSelector; import net.sf.openrocket.gui.util.ColorConversion; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; -import java.awt.Color; -import net.sf.openrocket.util.LineStyle; import net.sf.openrocket.util.StateChangeListener; public class AppearancePanel extends JPanel { @@ -44,6 +46,8 @@ public class AppearancePanel extends JPanel { private AppearanceBuilder ab; + private static File lastImageDir = null; + private class ColorActionListener implements ActionListener { private final String valueName; private final Object o; @@ -90,6 +94,9 @@ public class AppearancePanel extends JPanel { final JButton ambientColorButton = new JButton(new ColorIcon(ab.getAmbient())); final JButton specularColorButton = new JButton(new ColorIcon(ab.getSpecular())); + final JTextField uriTextField = new JTextField(ab.getImage() != null ? ab.getImage().toString() : ""); + uriTextField.setEditable(false); + ab.addChangeListener(new StateChangeListener() { @Override public void stateChanged(EventObject e) { @@ -98,6 +105,7 @@ public class AppearancePanel extends JPanel { ambientColorButton.setIcon(new ColorIcon(ab.getAmbient())); specularColorButton.setIcon(new ColorIcon(ab.getSpecular())); c.setAppearance(ab.getAppearance()); + uriTextField.setText(ab.getImage() != null ? ab.getImage().toString() : ""); } }); @@ -113,109 +121,172 @@ public class AppearancePanel extends JPanel { ambientColorButton.addActionListener(new ColorActionListener(ab, "Ambient")); specularColorButton.addActionListener(new ColorActionListener(ab, "Specular")); - add(new StyledLabel("Figure Style", Style.BOLD)); - add(new JCheckBox(), "split 2"); - add(new JLabel("Use default")); - add(new JButton("Set Default"), "span 2, align right, wrap"); + BooleanModel mDefault = new BooleanModel(false); - add(new JLabel("Figure Color:")); - add(figureColorButton); + {// Style Header Row + add(new StyledLabel("Figure Style", Style.BOLD)); + add(new JCheckBox(), "split 2"); + add(new JLabel("Use default")); + add(new JButton("Set Default"), "span 2, align right, wrap"); + } - add(new JLabel("Line Style:")); - add(new JLabel("[Default Style [v]]"), "wrap"); + {// Figure Color + add(new JLabel("Figure Color:")); + add(figureColorButton); + } + + {// Line Style + add(new JLabel("Line Style:")); + add(new JLabel("[Default Style [v]]"), "wrap"); + } add(new JSeparator(SwingConstants.HORIZONTAL), "span, wrap, growx"); - BooleanModel mDefault = new BooleanModel(false); + {// Texture Header Row + add(new StyledLabel("Appearance", Style.BOLD)); + add(new JCheckBox(mDefault), "split 2"); + add(new JLabel("Use default")); + JButton setMDefault = new JButton("Set Default"); + mDefault.addEnableComponent(setMDefault, false); + add(setMDefault, "span 2, align right, wrap"); + } - add(new StyledLabel("Appearance", Style.BOLD)); - add(new JCheckBox(mDefault), "split 2"); - add(new JLabel("Use default")); - JButton setMDefault = new JButton("Set Default"); - mDefault.addEnableComponent(setMDefault, false); - add(setMDefault, "span 2, align right, wrap"); + {// Texture File + JButton choose; + add(new JLabel("Texture:")); + JPanel p = new JPanel(new MigLayout("fill, ins 0", "[grow][]")); + p.add(uriTextField, "grow"); + p.add(choose = new JButton("Choose")); + mDefault.addEnableComponent(uriTextField, false); + mDefault.addEnableComponent(choose, false); + add(p, "span 3, growx, wrap"); + choose.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + URL u = ab.getImage(); + File current = lastImageDir; + if (u != null && u.getProtocol().equals("file")) { + try { + current = new File(u.toURI()).getParentFile(); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + lastImageDir = current; - add(new JLabel("Texture:")); - add(new JLabel("[Filename]")); + JFileChooser fc = new JFileChooser(current); + if (fc.showOpenDialog(AppearancePanel.this) == JFileChooser.APPROVE_OPTION) { + try { + ab.setImage(fc.getSelectedFile().toURI().toURL()); + } catch (MalformedURLException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + } - add(new JLabel("Scale:")); + } + }); + } - add(new JLabel("x:"), "split 4"); - JSpinner scaleU = new JSpinner(new DoubleModel(ab, "ScaleU").getSpinnerModel()); - scaleU.setEditor(new SpinnerEditor(scaleU)); - mDefault.addEnableComponent(scaleU, false); - add(scaleU, "w 40"); + { // Diffuse + add(new JLabel("Diffuse Color:")); + mDefault.addEnableComponent(diffuseColorButton, false); + add(diffuseColorButton); + } - add(new JLabel("y:")); - JSpinner scaleV = new JSpinner(new DoubleModel(ab, "ScaleV").getSpinnerModel()); - scaleV.setEditor(new SpinnerEditor(scaleV)); - mDefault.addEnableComponent(scaleV, false); - add(scaleV, "wrap, w 40"); + { // Scale + add(new JLabel("Scale:")); - add(new JLabel("Diffuse Color:")); - mDefault.addEnableComponent(diffuseColorButton, false); - add(diffuseColorButton); + add(new JLabel("x:"), "split 4"); + JSpinner scaleU = new JSpinner(new DoubleModel(ab, "ScaleU").getSpinnerModel()); + scaleU.setEditor(new SpinnerEditor(scaleU)); + mDefault.addEnableComponent(scaleU, false); + add(scaleU, "w 40"); - add(new JLabel("Offset:")); + add(new JLabel("y:")); + JSpinner scaleV = new JSpinner(new DoubleModel(ab, "ScaleV").getSpinnerModel()); + scaleV.setEditor(new SpinnerEditor(scaleV)); + mDefault.addEnableComponent(scaleV, false); + add(scaleV, "wrap, w 40"); + } - add(new JLabel("x:"), "split 4"); - JSpinner offsetU = new JSpinner(new DoubleModel(ab, "OffsetU").getSpinnerModel()); - offsetU.setEditor(new SpinnerEditor(offsetU)); - mDefault.addEnableComponent(offsetU, false); - add(offsetU, "w 40"); + { // Ambient + add(new JLabel("Ambient Color:")); + mDefault.addEnableComponent(ambientColorButton, false); + add(ambientColorButton); + } - add(new JLabel("y:")); - JSpinner offsetV = new JSpinner(new DoubleModel(ab, "OffsetV").getSpinnerModel()); - offsetV.setEditor(new SpinnerEditor(offsetV)); - mDefault.addEnableComponent(offsetV, false); - add(offsetV, "wrap, w 40"); + { // Offset + add(new JLabel("Offset:")); - add(new JLabel("Ambient Color:")); - mDefault.addEnableComponent(ambientColorButton, false); - add(ambientColorButton); + add(new JLabel("x:"), "split 4"); + JSpinner offsetU = new JSpinner(new DoubleModel(ab, "OffsetU").getSpinnerModel()); + offsetU.setEditor(new SpinnerEditor(offsetU)); + mDefault.addEnableComponent(offsetU, false); + add(offsetU, "w 40"); - add(new JLabel("Center:")); + add(new JLabel("y:")); + JSpinner offsetV = new JSpinner(new DoubleModel(ab, "OffsetV").getSpinnerModel()); + offsetV.setEditor(new SpinnerEditor(offsetV)); + mDefault.addEnableComponent(offsetV, false); + add(offsetV, "wrap, w 40"); + } - add(new JLabel("x:"), "split 4"); - JSpinner centerU = new JSpinner(new DoubleModel(ab, "CenterU").getSpinnerModel()); - centerU.setEditor(new SpinnerEditor(centerU)); - mDefault.addEnableComponent(centerU, false); - add(centerU, "w 40"); + { // Specular + add(new JLabel("Specular Color:")); + mDefault.addEnableComponent(specularColorButton, false); + add(specularColorButton); + } - add(new JLabel("y:")); - JSpinner centerV = new JSpinner(new DoubleModel(ab, "CenterV").getSpinnerModel()); - centerV.setEditor(new SpinnerEditor(centerV)); - mDefault.addEnableComponent(centerV, false); - add(centerV, "wrap, w 40"); + { // Center + add(new JLabel("Center:")); - add(new JLabel("Specular Color:")); - mDefault.addEnableComponent(specularColorButton, false); - add(specularColorButton); + add(new JLabel("x:"), "split 4"); + JSpinner centerU = new JSpinner(new DoubleModel(ab, "CenterU").getSpinnerModel()); + centerU.setEditor(new SpinnerEditor(centerU)); + mDefault.addEnableComponent(centerU, false); + add(centerU, "w 40"); - add(new JLabel("Rotation:")); - DoubleModel rotationModel = new DoubleModel(ab, "Rotation", UnitGroup.UNITS_ANGLE); - JSpinner rotation = new JSpinner(rotationModel.getSpinnerModel()); - rotation.setEditor(new SpinnerEditor(rotation)); - mDefault.addEnableComponent(rotation, false); - add(rotation, "split 3, w 50"); - add(new UnitSelector(rotationModel)); - BasicSlider bs = new BasicSlider(rotationModel.getSliderModel(-Math.PI, Math.PI)); - mDefault.addEnableComponent(bs, false); - add(bs, "w 100, wrap"); - + add(new JLabel("y:")); + JSpinner centerV = new JSpinner(new DoubleModel(ab, "CenterV").getSpinnerModel()); + centerV.setEditor(new SpinnerEditor(centerV)); + mDefault.addEnableComponent(centerV, false); + add(centerV, "wrap, w 40"); + } - add(new JLabel("Shine:")); - IntegerModel shineModel = new IntegerModel(ab, "Shininess", 0, 128); - JSpinner shine = new JSpinner(shineModel.getSpinnerModel()); - mDefault.addEnableComponent(shine, false); - add(shine, "w 40"); + { // Shine + add(new JLabel("Shine:")); + IntegerModel shineModel = new IntegerModel(ab, "Shininess", 0, 128); + JSpinner shine = new JSpinner(shineModel.getSpinnerModel()); + mDefault.addEnableComponent(shine, false); + add(shine, "w 50"); + } - add(new JLabel("Repeat:")); - EdgeMode[] list = new EdgeMode[EdgeMode.values().length + 1]; - System.arraycopy(EdgeMode.values(), 0, list, 1, EdgeMode.values().length); - JComboBox combo = new JComboBox(new EnumModel(ab, "EdgeMode", list)); - mDefault.addEnableComponent(combo, false); - add(combo); + { // Rotation + add(new JLabel("Rotation:")); + DoubleModel rotationModel = new DoubleModel(ab, "Rotation", UnitGroup.UNITS_ANGLE); + JSpinner rotation = new JSpinner(rotationModel.getSpinnerModel()); + rotation.setEditor(new SpinnerEditor(rotation)); + mDefault.addEnableComponent(rotation, false); + add(rotation, "split 3, w 50"); + add(new UnitSelector(rotationModel)); + BasicSlider bs = new BasicSlider(rotationModel.getSliderModel(-Math.PI, Math.PI)); + mDefault.addEnableComponent(bs, false); + add(bs, "w 100, wrap"); + } + + {// Placeholder + add(new JLabel(""), "span 2"); + } + + { // Repeat + add(new JLabel("Repeat:")); + EdgeMode[] list = new EdgeMode[EdgeMode.values().length + 1]; + System.arraycopy(EdgeMode.values(), 0, list, 1, EdgeMode.values().length); + JComboBox combo = new JComboBox(new EnumModel(ab, "EdgeMode", list)); + mDefault.addEnableComponent(combo, false); + add(combo); + } }