Add file chooser.
This commit is contained in:
parent
f466729fe0
commit
3a9b843c9a
@ -1,23 +1,27 @@
|
|||||||
package net.sf.openrocket.gui.configdialog;
|
package net.sf.openrocket.gui.configdialog;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
|
import java.io.File;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.EventListener;
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
import java.util.EventObject;
|
import java.util.EventObject;
|
||||||
|
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JCheckBox;
|
import javax.swing.JCheckBox;
|
||||||
import javax.swing.JColorChooser;
|
import javax.swing.JColorChooser;
|
||||||
import javax.swing.JComboBox;
|
import javax.swing.JComboBox;
|
||||||
|
import javax.swing.JFileChooser;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.JSeparator;
|
import javax.swing.JSeparator;
|
||||||
import javax.swing.JSpinner;
|
import javax.swing.JSpinner;
|
||||||
|
import javax.swing.JTextField;
|
||||||
import javax.swing.SwingConstants;
|
import javax.swing.SwingConstants;
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import net.sf.openrocket.appearance.Appearance;
|
|
||||||
import net.sf.openrocket.appearance.AppearanceBuilder;
|
import net.sf.openrocket.appearance.AppearanceBuilder;
|
||||||
import net.sf.openrocket.appearance.Decal.EdgeMode;
|
import net.sf.openrocket.appearance.Decal.EdgeMode;
|
||||||
import net.sf.openrocket.gui.SpinnerEditor;
|
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.BasicSlider;
|
||||||
import net.sf.openrocket.gui.components.ColorIcon;
|
import net.sf.openrocket.gui.components.ColorIcon;
|
||||||
import net.sf.openrocket.gui.components.StyledLabel;
|
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.StyledLabel.Style;
|
||||||
|
import net.sf.openrocket.gui.components.UnitSelector;
|
||||||
import net.sf.openrocket.gui.util.ColorConversion;
|
import net.sf.openrocket.gui.util.ColorConversion;
|
||||||
import net.sf.openrocket.l10n.Translator;
|
import net.sf.openrocket.l10n.Translator;
|
||||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
import net.sf.openrocket.startup.Application;
|
import net.sf.openrocket.startup.Application;
|
||||||
import net.sf.openrocket.unit.UnitGroup;
|
import net.sf.openrocket.unit.UnitGroup;
|
||||||
import java.awt.Color;
|
|
||||||
import net.sf.openrocket.util.LineStyle;
|
|
||||||
import net.sf.openrocket.util.StateChangeListener;
|
import net.sf.openrocket.util.StateChangeListener;
|
||||||
|
|
||||||
public class AppearancePanel extends JPanel {
|
public class AppearancePanel extends JPanel {
|
||||||
@ -44,6 +46,8 @@ public class AppearancePanel extends JPanel {
|
|||||||
|
|
||||||
private AppearanceBuilder ab;
|
private AppearanceBuilder ab;
|
||||||
|
|
||||||
|
private static File lastImageDir = null;
|
||||||
|
|
||||||
private class ColorActionListener implements ActionListener {
|
private class ColorActionListener implements ActionListener {
|
||||||
private final String valueName;
|
private final String valueName;
|
||||||
private final Object o;
|
private final Object o;
|
||||||
@ -90,6 +94,9 @@ public class AppearancePanel extends JPanel {
|
|||||||
final JButton ambientColorButton = new JButton(new ColorIcon(ab.getAmbient()));
|
final JButton ambientColorButton = new JButton(new ColorIcon(ab.getAmbient()));
|
||||||
final JButton specularColorButton = new JButton(new ColorIcon(ab.getSpecular()));
|
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() {
|
ab.addChangeListener(new StateChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void stateChanged(EventObject e) {
|
public void stateChanged(EventObject e) {
|
||||||
@ -98,6 +105,7 @@ public class AppearancePanel extends JPanel {
|
|||||||
ambientColorButton.setIcon(new ColorIcon(ab.getAmbient()));
|
ambientColorButton.setIcon(new ColorIcon(ab.getAmbient()));
|
||||||
specularColorButton.setIcon(new ColorIcon(ab.getSpecular()));
|
specularColorButton.setIcon(new ColorIcon(ab.getSpecular()));
|
||||||
c.setAppearance(ab.getAppearance());
|
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"));
|
ambientColorButton.addActionListener(new ColorActionListener(ab, "Ambient"));
|
||||||
specularColorButton.addActionListener(new ColorActionListener(ab, "Specular"));
|
specularColorButton.addActionListener(new ColorActionListener(ab, "Specular"));
|
||||||
|
|
||||||
add(new StyledLabel("Figure Style", Style.BOLD));
|
BooleanModel mDefault = new BooleanModel(false);
|
||||||
add(new JCheckBox(), "split 2");
|
|
||||||
add(new JLabel("Use default"));
|
|
||||||
add(new JButton("Set Default"), "span 2, align right, wrap");
|
|
||||||
|
|
||||||
add(new JLabel("Figure Color:"));
|
{// Style Header Row
|
||||||
add(figureColorButton);
|
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:"));
|
{// Figure Color
|
||||||
add(new JLabel("[Default Style [v]]"), "wrap");
|
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");
|
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));
|
{// Texture File
|
||||||
add(new JCheckBox(mDefault), "split 2");
|
JButton choose;
|
||||||
add(new JLabel("Use default"));
|
add(new JLabel("Texture:"));
|
||||||
JButton setMDefault = new JButton("Set Default");
|
JPanel p = new JPanel(new MigLayout("fill, ins 0", "[grow][]"));
|
||||||
mDefault.addEnableComponent(setMDefault, false);
|
p.add(uriTextField, "grow");
|
||||||
add(setMDefault, "span 2, align right, wrap");
|
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:"));
|
JFileChooser fc = new JFileChooser(current);
|
||||||
add(new JLabel("[Filename]"));
|
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");
|
{ // Diffuse
|
||||||
JSpinner scaleU = new JSpinner(new DoubleModel(ab, "ScaleU").getSpinnerModel());
|
add(new JLabel("Diffuse Color:"));
|
||||||
scaleU.setEditor(new SpinnerEditor(scaleU));
|
mDefault.addEnableComponent(diffuseColorButton, false);
|
||||||
mDefault.addEnableComponent(scaleU, false);
|
add(diffuseColorButton);
|
||||||
add(scaleU, "w 40");
|
}
|
||||||
|
|
||||||
add(new JLabel("y:"));
|
{ // Scale
|
||||||
JSpinner scaleV = new JSpinner(new DoubleModel(ab, "ScaleV").getSpinnerModel());
|
add(new JLabel("Scale:"));
|
||||||
scaleV.setEditor(new SpinnerEditor(scaleV));
|
|
||||||
mDefault.addEnableComponent(scaleV, false);
|
|
||||||
add(scaleV, "wrap, w 40");
|
|
||||||
|
|
||||||
add(new JLabel("Diffuse Color:"));
|
add(new JLabel("x:"), "split 4");
|
||||||
mDefault.addEnableComponent(diffuseColorButton, false);
|
JSpinner scaleU = new JSpinner(new DoubleModel(ab, "ScaleU").getSpinnerModel());
|
||||||
add(diffuseColorButton);
|
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");
|
{ // Ambient
|
||||||
JSpinner offsetU = new JSpinner(new DoubleModel(ab, "OffsetU").getSpinnerModel());
|
add(new JLabel("Ambient Color:"));
|
||||||
offsetU.setEditor(new SpinnerEditor(offsetU));
|
mDefault.addEnableComponent(ambientColorButton, false);
|
||||||
mDefault.addEnableComponent(offsetU, false);
|
add(ambientColorButton);
|
||||||
add(offsetU, "w 40");
|
}
|
||||||
|
|
||||||
add(new JLabel("y:"));
|
{ // Offset
|
||||||
JSpinner offsetV = new JSpinner(new DoubleModel(ab, "OffsetV").getSpinnerModel());
|
add(new JLabel("Offset:"));
|
||||||
offsetV.setEditor(new SpinnerEditor(offsetV));
|
|
||||||
mDefault.addEnableComponent(offsetV, false);
|
|
||||||
add(offsetV, "wrap, w 40");
|
|
||||||
|
|
||||||
add(new JLabel("Ambient Color:"));
|
add(new JLabel("x:"), "split 4");
|
||||||
mDefault.addEnableComponent(ambientColorButton, false);
|
JSpinner offsetU = new JSpinner(new DoubleModel(ab, "OffsetU").getSpinnerModel());
|
||||||
add(ambientColorButton);
|
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");
|
{ // Specular
|
||||||
JSpinner centerU = new JSpinner(new DoubleModel(ab, "CenterU").getSpinnerModel());
|
add(new JLabel("Specular Color:"));
|
||||||
centerU.setEditor(new SpinnerEditor(centerU));
|
mDefault.addEnableComponent(specularColorButton, false);
|
||||||
mDefault.addEnableComponent(centerU, false);
|
add(specularColorButton);
|
||||||
add(centerU, "w 40");
|
}
|
||||||
|
|
||||||
add(new JLabel("y:"));
|
{ // Center
|
||||||
JSpinner centerV = new JSpinner(new DoubleModel(ab, "CenterV").getSpinnerModel());
|
add(new JLabel("Center:"));
|
||||||
centerV.setEditor(new SpinnerEditor(centerV));
|
|
||||||
mDefault.addEnableComponent(centerV, false);
|
|
||||||
add(centerV, "wrap, w 40");
|
|
||||||
|
|
||||||
add(new JLabel("Specular Color:"));
|
add(new JLabel("x:"), "split 4");
|
||||||
mDefault.addEnableComponent(specularColorButton, false);
|
JSpinner centerU = new JSpinner(new DoubleModel(ab, "CenterU").getSpinnerModel());
|
||||||
add(specularColorButton);
|
centerU.setEditor(new SpinnerEditor(centerU));
|
||||||
|
mDefault.addEnableComponent(centerU, false);
|
||||||
|
add(centerU, "w 40");
|
||||||
|
|
||||||
add(new JLabel("Rotation:"));
|
add(new JLabel("y:"));
|
||||||
DoubleModel rotationModel = new DoubleModel(ab, "Rotation", UnitGroup.UNITS_ANGLE);
|
JSpinner centerV = new JSpinner(new DoubleModel(ab, "CenterV").getSpinnerModel());
|
||||||
JSpinner rotation = new JSpinner(rotationModel.getSpinnerModel());
|
centerV.setEditor(new SpinnerEditor(centerV));
|
||||||
rotation.setEditor(new SpinnerEditor(rotation));
|
mDefault.addEnableComponent(centerV, false);
|
||||||
mDefault.addEnableComponent(rotation, false);
|
add(centerV, "wrap, w 40");
|
||||||
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("Shine:"));
|
{ // Shine
|
||||||
IntegerModel shineModel = new IntegerModel(ab, "Shininess", 0, 128);
|
add(new JLabel("Shine:"));
|
||||||
JSpinner shine = new JSpinner(shineModel.getSpinnerModel());
|
IntegerModel shineModel = new IntegerModel(ab, "Shininess", 0, 128);
|
||||||
mDefault.addEnableComponent(shine, false);
|
JSpinner shine = new JSpinner(shineModel.getSpinnerModel());
|
||||||
add(shine, "w 40");
|
mDefault.addEnableComponent(shine, false);
|
||||||
|
add(shine, "w 50");
|
||||||
|
}
|
||||||
|
|
||||||
add(new JLabel("Repeat:"));
|
{ // Rotation
|
||||||
EdgeMode[] list = new EdgeMode[EdgeMode.values().length + 1];
|
add(new JLabel("Rotation:"));
|
||||||
System.arraycopy(EdgeMode.values(), 0, list, 1, EdgeMode.values().length);
|
DoubleModel rotationModel = new DoubleModel(ab, "Rotation", UnitGroup.UNITS_ANGLE);
|
||||||
JComboBox combo = new JComboBox(new EnumModel<EdgeMode>(ab, "EdgeMode", list));
|
JSpinner rotation = new JSpinner(rotationModel.getSpinnerModel());
|
||||||
mDefault.addEnableComponent(combo, false);
|
rotation.setEditor(new SpinnerEditor(rotation));
|
||||||
add(combo);
|
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<EdgeMode>(ab, "EdgeMode", list));
|
||||||
|
mDefault.addEnableComponent(combo, false);
|
||||||
|
add(combo);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user