Fiber,lb/ft3,41,,,,1,0,0,0,0,0,0,0,0,1,1,0,0,0,,,,,,,,None,0,0
lite ply,lb/ft3,22,,,Composite,1,0,1,0,0,0,0,0,0,1,1,1,0,0,,,,,,,,None,0,0
Paper,lb/ft3,70,,,,1,1,1,1,0,1,0,1,1,1,1,1,1,1,,,,,,,,None,0,0
+Polyethylene LDPE,lb/ft3,57.7,,,,1,0,0,0,0,0,1,1,0,0,0,0,0,0,,,,,,,,None,0,0
+Rip stop nylon,g/cm2,0.006685,,,,1,0,0,0,0,0,1,1,0,0,0,0,0,0,,,,,,,,None,0,0
+30 Lb. kevlar,g/cm,0.00178,,,,1,0,0,0,1,0,0,0,0,0,0,0,0,0,,,,,,,,None,0,0
+1/16 In. braided nylon,g/cm,0.0102,,,,1,0,0,0,1,0,0,0,0,0,0,0,0,0,,,,,,,,None,0,0
/**
* State variable to keep track of which file was opened, in case it needs to be saved back to that file.
*/
- private File openedFile = null;
+// private File openedFile = null;
/**
* Last directory; file chooser is set here so user doesn't have to keep navigating to a common area.
*/
- private File lastDirectory = null;
+ // private File lastDirectory = null;
/**
* The table of presets.
/**
* Flag that indicates if an existing Preset is currently being edited.
*/
- private boolean editingSelected = false;
+ // private boolean editingSelected = false;
+
+ private final OpenedFileContext editContext = new OpenedFileContext();
static {
trans = new ResourceBundleTranslator("l10n.messages");
else {
if (e.getClickCount() == 2) {
int row = target.getSelectedRow();
- editingSelected = true;
- new PresetEditorDialog(ComponentPresetEditor.this, (ComponentPreset) model.getAssociatedObject(row)).setVisible(true);
+ editContext.setEditingSelected(true);
+ new PresetEditorDialog(ComponentPresetEditor.this,
+ (ComponentPreset) model.getAssociatedObject(row), editContext.getMaterialsLoaded()).setVisible(true);
}
}
}
addBtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
- editingSelected = false;
+ editContext.setEditingSelected(false);
new PresetEditorDialog(ComponentPresetEditor.this).setVisible(true);
}
});
//Is this a new preset?
String description = preset.has(ComponentPreset.DESCRIPTION) ? preset.get(ComponentPreset.DESCRIPTION) :
preset.getPartNo();
- if (!editingSelected) {
+ if (!editContext.isEditingSelected()|| table.getSelectedRow() == -1) {
model.addRow(new Object[]{preset.getManufacturer().getDisplayName(), preset.getType().name(),
preset.getPartNo(), description, Icons.EDIT_DELETE}, preset);
}
model.associated.set(row, preset);
}
}
- editingSelected = false;
+ editContext.setEditingSelected(false);
}
/**
chooser.addChoosableFileFilter(FileHelper.CSV_FILE_FILTER);
chooser.setFileFilter(FileHelper.OPEN_ROCKET_COMPONENT_FILTER);
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
- if (lastDirectory != null) {
- chooser.setCurrentDirectory(lastDirectory);
+ if (editContext.getLastDirectory() != null) {
+ chooser.setCurrentDirectory(editContext.getLastDirectory());
}
else {
chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory());
int option = chooser.showOpenDialog(ComponentPresetEditor.this);
if (option != JFileChooser.APPROVE_OPTION) {
- openedFile = null;
+ editContext.setOpenedFile(null);
log.user("User decided not to open, option=" + option);
return false;
}
return false;
}
- lastDirectory = file.getParentFile();
+ editContext.setLastDirectory(file.getParentFile());
+ editContext.setMaterialsLoaded(null);
List<ComponentPreset> presets = null;
if (file.getName().toLowerCase().endsWith(".orc")) {
}
presets = new ArrayList<ComponentPreset>();
MaterialHolder materialHolder = RocksimComponentFileTranslator.loadAll(presets, file);
+ editContext.setMaterialsLoaded(materialHolder);
}
if (presets != null) {
for (ComponentPreset next : presets) {
notifyResult(next);
}
- openedFile = file;
+ editContext.setOpenedFile(file);
}
}
catch (Exception e) {
- e.printStackTrace();
JOptionPane.showMessageDialog(ComponentPresetEditor.this, "Unable to open OpenRocket component file: " +
file.getName() + " Invalid format. " + e.getMessage());
- openedFile = null;
+ editContext.setOpenedFile(null);
+ editContext.setEditingSelected(false);
return false;
}
return true;
chooser.addChoosableFileFilter(FileHelper.OPEN_ROCKET_COMPONENT_FILTER);
chooser.setFileFilter(FileHelper.OPEN_ROCKET_COMPONENT_FILTER);
- if (openedFile != null) {
- chooser.setSelectedFile(openedFile);
+ if (editContext.getOpenedFile() != null) {
+ chooser.setSelectedFile(editContext.getOpenedFile());
}
else {
chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory());
return FileHelper.confirmWrite(file, this) && new OpenRocketComponentSaver().save(file, materials, presets);
}
+
+ class OpenedFileContext {
+
+ /**
+ * State variable to keep track of which file was opened, in case it needs to be saved back to that file.
+ */
+ private File openedFile = null;
+
+ /**
+ * Last directory; file chooser is set here so user doesn't have to keep navigating to a common area.
+ */
+ private File lastDirectory = null;
+
+ private boolean editingSelected = false;
+
+ private MaterialHolder materialsLoaded = null;
+
+ OpenedFileContext() {
+ }
+
+ public File getOpenedFile() {
+ return openedFile;
+ }
+
+ public void setOpenedFile(final File theOpenedFile) {
+ openedFile = theOpenedFile;
+ }
+
+ public File getLastDirectory() {
+ return lastDirectory;
+ }
+
+ public void setLastDirectory(final File theLastDirectory) {
+ lastDirectory = theLastDirectory;
+ }
+
+ public boolean isEditingSelected() {
+ return editingSelected;
+ }
+
+ public void setEditingSelected(final boolean theEditingSelected) {
+ editingSelected = theEditingSelected;
+ }
+
+ public MaterialHolder getMaterialsLoaded() {
+ return materialsLoaded;
+ }
+
+ public void setMaterialsLoaded(final MaterialHolder theMaterialsLoaded) {
+ materialsLoaded = theMaterialsLoaded;
+ }
+ }
}
import net.sf.openrocket.gui.dialogs.CustomMaterialDialog;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
+import net.sf.openrocket.preset.loader.MaterialHolder;
import net.sf.openrocket.startup.Application;
import javax.swing.DefaultComboBoxModel;
private Component parent;
- public MaterialModel(Component theParent, Material.Type type) {
+ public MaterialModel(Component theParent, Material.Type theType, Database<Material> materials) {
parent = theParent;
- this.type = type;
+ type = theType;
+ database = materials;
+ database.addDatabaseListener(this);
+ }
+
+ public MaterialModel(Component theParent, Material.Type theType) {
+ parent = theParent;
+ type = theType;
switch (type) {
case LINE:
public Material.Type getType() {
return type;
}
+
+ public void removeListener() {
+ database.removeChangeListener(this);
+ }
}
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPresetFactory;
import net.sf.openrocket.preset.InvalidComponentPresetException;
+import net.sf.openrocket.preset.TypedKey;
import net.sf.openrocket.preset.TypedPropertyMap;
+import net.sf.openrocket.preset.loader.MaterialHolder;
import net.sf.openrocket.rocketcomponent.Transition;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
import javax.imageio.ImageIO;
+import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.InputVerifier;
private final JPanel contentPanel = new JPanel();
private DeselectableComboBox typeCombo;
private JTextField mfgTextField;
- private JComboBox materialChooser;
+ private MaterialChooser materialChooser;
+ private MaterialHolder holder = null;
private JTextField ncPartNoTextField;
private JTextField ncDescTextField;
private JTextField pcLineCount;
private DoubleModel pcDiameter;
private DoubleModel pcLineLength;
- private JComboBox pcLineMaterialChooser;
+ private MaterialChooser pcLineMaterialChooser;
private DoubleModel pcMass;
private ImageIcon pcImage;
private JButton pcImageBtn;
* @param theCallback the listener that gets the results of editing the presets
*/
public PresetEditorDialog(PresetResultListener theCallback) {
- this(theCallback, null);
+ this(theCallback, null, null);
}
/**
*
* @param theCallback the listener that gets the results of editing the presets
* @param toEdit the ComponentPreset to be edited; or null if a new one is being added
+ * @param matHolder the set of materials; if null then use system materials
*/
- public PresetEditorDialog(PresetResultListener theCallback, ComponentPreset toEdit) {
+ public PresetEditorDialog(PresetResultListener theCallback, ComponentPreset toEdit, MaterialHolder matHolder) {
resultListener = theCallback;
getContentPane().setMinimumSize(new Dimension(200, 200));
setBounds(100, 100, 825, 610);
JLabel bhMaterialLabel = new JLabel("Material:");
contentPanel.add(bhMaterialLabel, "cell 2 2, alignx left");
- materialChooser = new JComboBox(new MaterialModel(this, Material.Type.BULK));
+ materialChooser = new MaterialChooser(new MaterialModel(this, Material.Type.BULK));
contentPanel.add(materialChooser, "cell 3 2,growx");
spin = new JSpinner(trAftDia.getSpinnerModel());
spin.setEditor(new SpinnerEditor(spin));
trPanel.add(spin, "cell 1 3, growx");
- trPanel.add(new UnitSelector(trAftDia));
+ trPanel.add(new UnitSelector(trAftDia), "growx");
JLabel trForeDiaLabel = new JLabel("Fore Dia.:");
trPanel.add(trForeDiaLabel, "cell 3 3,alignx left");
JPanel pcPanel = new JPanel();
componentOverlayPanel.add(pcPanel, "PARACHUTE");
pcPanel.setLayout(new MigLayout("", "[][157.00,grow 79][65.00][grow][][]", "[][][][][][]"));
- //pcPanel.setLayout(new MigLayout("", "[][grow][][grow]", "[][][][]"));
JLabel pcPartNoLabel = new JLabel("Part No:");
pcPanel.add(pcPartNoLabel, "cell 0 0,alignx left");
JLabel pcLineMaterialLabel = new JLabel("Line Material:");
pcPanel.add(pcLineMaterialLabel, "cell 3 4,alignx left, aligny top, pad 7 0 0 0 ");
- pcLineMaterialChooser = new JComboBox();
+ pcLineMaterialChooser = new MaterialChooser();
pcLineMaterialChooser.setModel(new MaterialModel(PresetEditorDialog.this, Material.Type.LINE));
pcPanel.add(pcLineMaterialChooser, "cell 4 4, span 3 1, growx, aligny top");
buttonPane.add(cancelButton, "cell 6 0,alignx right,aligny top");
if (toEdit != null) {
- fillEditor(toEdit);
+ fillEditor(toEdit, matHolder);
}
+ holder = matHolder;
}
/**
chooser.addPropertyChangeListener(preview);
chooser.setAcceptAllFileFilterUsed(false);
chooser.addChoosableFileFilter(new FileNameExtensionFilter("Image Files", "png", "jpg", "jpeg"));
- /*{
- @Override
- public boolean accept(final File f) {
- return f.getName().endsWith(".png") || f.getName().endsWith(".jpg");
- }
-
- @Override
- public String getDescription() {
- return "Image Files";
- }
- });*/
return chooser;
}
*
* @param preset the preset to edit
*/
- private void fillEditor(ComponentPreset preset) {
+ private void fillEditor(ComponentPreset preset, MaterialHolder holder) {
ComponentPreset.Type t = preset.getType();
mfgTextField.setText(preset.get(ComponentPreset.MANUFACTURER).getDisplayName());
- materialChooser.setModel(new MaterialModel(PresetEditorDialog.this, Material.Type.BULK));
- materialChooser.getModel().setSelectedItem(preset.get(ComponentPreset.MATERIAL));
+ setMaterial(materialChooser, preset, holder, Material.Type.BULK, ComponentPreset.MATERIAL);
switch (t) {
case BODY_TUBE:
typeCombo.setSelectedItem(trans.get(BODY_TUBE_KEY));
}
break;
case PARACHUTE:
- materialChooser.setModel(new MaterialModel(PresetEditorDialog.this, Material.Type.SURFACE));
- materialChooser.getModel().setSelectedItem(preset.get(ComponentPreset.MATERIAL));
+ setMaterial(materialChooser, preset, holder, Material.Type.SURFACE, ComponentPreset.MATERIAL);
typeCombo.setSelectedItem(trans.get(PARACHUTE_KEY));
pcDescTextField.setText(preset.get(ComponentPreset.DESCRIPTION));
if (preset.has(ComponentPreset.LINE_COUNT)) {
pcImage = new ImageIcon(byteArrayToImage(preset.get(ComponentPreset.IMAGE)));
pcImageBtn.setIcon(pcImage);
}
- pcLineMaterialChooser.getModel().setSelectedItem(preset.get(ComponentPreset.LINE_MATERIAL));
+ setMaterial(pcLineMaterialChooser, preset, holder, Material.Type.LINE, ComponentPreset.LINE_MATERIAL);
+// pcLineMaterialChooser.setModel(new MaterialModel(PresetEditorDialog.this, Material.Type.LINE));
+
+// pcLineMaterialChooser.getModel().setSelectedItem(preset.get(ComponentPreset.LINE_MATERIAL));
break;
case STREAMER:
- materialChooser.setModel(new MaterialModel(PresetEditorDialog.this, Material.Type.SURFACE));
- materialChooser.getModel().setSelectedItem(preset.get(ComponentPreset.MATERIAL));
+ setMaterial(materialChooser, preset, holder, Material.Type.SURFACE, ComponentPreset.MATERIAL);
typeCombo.setSelectedItem(trans.get(STREAMER_KEY));
stDescTextField.setText(preset.get(ComponentPreset.DESCRIPTION));
if (preset.has(ComponentPreset.LENGTH)) {
}
}
+ private void setMaterial(final JComboBox chooser, final ComponentPreset preset, final MaterialHolder holder,
+ final Material.Type theType, final TypedKey key) {
+ if (holder == null) {
+ chooser.setModel(new MaterialModel(PresetEditorDialog.this, theType));
+ }
+ else {
+ chooser.setModel(new MaterialModel(PresetEditorDialog.this, theType,
+ holder.asDatabase(theType)));
+ }
+ if (preset != null) {
+ chooser.getModel().setSelectedItem(preset.get(key));
+ }
+ }
+
/**
* Extract the preset data from the UI fields, create a ComponentPreset instance, and notify the listener.
*/
if (materialChooser != null && evt.getStateChange() == ItemEvent.SELECTED) {
if (item.equals(trans.get(PARACHUTE_KEY)) || item.equals(trans.get(STREAMER_KEY))) {
if (!((MaterialModel) materialChooser.getModel()).getType().equals(Material.Type.SURFACE)) {
- materialChooser.setModel(new MaterialModel(PresetEditorDialog.this, Material.Type.SURFACE));
+ setMaterial(materialChooser, null, holder, Material.Type.SURFACE, ComponentPreset.MATERIAL);
}
}
else {
if (!((MaterialModel) materialChooser.getModel()).getType().equals(Material.Type.BULK)) {
- materialChooser.setModel(new MaterialModel(PresetEditorDialog.this, Material.Type.BULK));
+ setMaterial(materialChooser, null, holder, Material.Type.BULK, ComponentPreset.MATERIAL);
}
}
}
return true;
}
}
+
+ class MaterialChooser extends JComboBox {
+
+ public MaterialChooser() {
+ }
+ public MaterialChooser(MaterialModel model) {
+ super(model);
+ }
+
+ /**
+ * Sets the data model that the <code>JComboBox</code> uses to obtain the list of items.
+ *
+ * @param aModel the <code>ComboBoxModel</code> that provides the displayed list of items
+ *
+ * @beaninfo bound: true description: Model that the combo box uses to get data to display.
+ */
+ @Override
+ public void setModel(final ComboBoxModel aModel) {
+ if (getModel() instanceof MaterialModel) {
+ MaterialModel old = (MaterialModel) getModel();
+ old.removeListener();
+ }
+ super.setModel(aModel);
+
+ }
+ }
}
*/
package net.sf.openrocket.gui.print;
-import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
/**
* Common interface for components we want to print. Used by PageFitPrintStrategy
- *
+ *
* @author Jason Blood <dyster2000@gmail.com>
*/
public class PrintableComponent extends JPanel implements Printable {
*/
private int offsetX = 0;
private int offsetY = 0;
-
+
/**
* Constructor.
*/
PrintUtilities.enableDoubleBuffering(this);
return Printable.PAGE_EXISTS;
}
-
+
/**
* Set the offset this component will be printed to the page
* @param x X offset to print at.
- * @param x Y offset to print at.
+ * @param y Y offset to print at.
*/
public void setPrintOffset(int x, int y) {
offsetX = x;
offsetY = y;
}
-
+
/**
* Get the X offset this component will be printed to the page
* @return X offset to print at.
public int getOffsetX() {
return offsetX;
}
-
+
/**
* Get the Y offset this component will be printed to the page
* @return Y offset to print at.
import java.util.HashSet;
import java.util.Map;
+import net.sf.openrocket.database.Database;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.unit.UnitGroup;
public class MaterialHolder {
private final Map<String,Material.Bulk> bulkMaterials = new HashMap<String,Material.Bulk>();
-
+
private final Map<String,Material.Surface> surfaceMaterials = new HashMap<String,Material.Surface>();
-
+
private final Map<String, Material.Line> lineMaterials = new HashMap<String,Material.Line>();
-
+
public void put( Material material ) {
switch ( material.getType() ) {
case BULK:
break;
}
}
-
+
public Material.Bulk getBulkMaterial( Material.Bulk material ) {
Material.Bulk m = bulkMaterials.get( material.getName() );
return (m==null) ? material : m;
}
-
+
public Material.Surface getSurfaceMaterial( Material.Surface material, Double thickness ) {
Material.Surface m = surfaceMaterials.get(material.getName() );
if ( m != null ) {
return m;
}
Material.Bulk bulk = bulkMaterials.get(material.getName() );
-
+
if ( bulk == null ) {
return material;
}
-
+
// Ok, now we have a thickness and a bulk material of the correct name,
// we can make our own surface material.
-
+
Material.Surface surface = new Material.Surface( convertedMaterialName, bulk.getDensity() * thickness , true);
-
+
this.put(surface);
return surface;
-
+
}
-
+
public Material.Line getLineMaterial( Material.Line material ) {
Material.Line m = lineMaterials.get( material.getName() );
return (m==null) ? material : m;
}
-
+
public int size() {
return bulkMaterials.size() + surfaceMaterials.size() + lineMaterials.size();
}
public Collection<Material> values() {
-
+
HashSet<Material> allMats = new HashSet<Material>();
allMats.addAll( bulkMaterials.values() );
allMats.addAll( surfaceMaterials.values() );
allMats.addAll( lineMaterials.values() );
-
+
return allMats;
-
+
}
+
+ public Database<Material> asDatabase(Material.Type theType) {
+ Database<Material> result = new Database<Material>();
+ switch (theType) {
+ case LINE:
+ result.addAll(lineMaterials.values());
+ break;
+ case SURFACE:
+ result.addAll(surfaceMaterials.values());
+ break;
+ case BULK:
+ default:
+ result.addAll(bulkMaterials.values());
+ }
+ return result;
+ }
}