implemented gui elements for locating a stage relative to another stage.
This commit is contained in:
parent
d5de1cbac4
commit
177b24a667
@ -164,6 +164,10 @@ public class Stage extends ComponentAssembly implements FlightConfigurableCompon
|
|||||||
*/
|
*/
|
||||||
public void setRelativeToStage(final int _relTo) {
|
public void setRelativeToStage(final int _relTo) {
|
||||||
mutex.verify();
|
mutex.verify();
|
||||||
|
if ((_relTo < 0) || (_relTo >= this.getRocket().getStageCount())) {
|
||||||
|
log.error("attempt to position this stage relative to a non-existent stage number. Ignoring.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.stageRelativeTo = _relTo;
|
this.stageRelativeTo = _relTo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
142
swing/src/net/sf/openrocket/gui/adaptors/StageSelectModel.java
Normal file
142
swing/src/net/sf/openrocket/gui/adaptors/StageSelectModel.java
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
package net.sf.openrocket.gui.adaptors;
|
||||||
|
|
||||||
|
import java.util.EventObject;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import javax.swing.AbstractListModel;
|
||||||
|
import javax.swing.ComboBoxModel;
|
||||||
|
import javax.swing.event.ListDataListener;
|
||||||
|
|
||||||
|
import org.jfree.util.Log;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||||
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
|
import net.sf.openrocket.rocketcomponent.Stage;
|
||||||
|
import net.sf.openrocket.util.ArrayList;
|
||||||
|
import net.sf.openrocket.util.ChangeSource;
|
||||||
|
import net.sf.openrocket.util.Reflection;
|
||||||
|
import net.sf.openrocket.util.StateChangeListener;
|
||||||
|
|
||||||
|
public class StageSelectModel extends AbstractListModel<Stage> implements ComboBoxModel<Stage>, StateChangeListener {
|
||||||
|
private static final long serialVersionUID = 1311302134934033684L;
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(StageSelectModel.class);
|
||||||
|
|
||||||
|
protected final String nullText;//?
|
||||||
|
|
||||||
|
protected Stage sourceStage = null;
|
||||||
|
protected ArrayList<Stage> displayValues = new ArrayList<Stage>();
|
||||||
|
protected Stage selectedStage = null;
|
||||||
|
protected int selectedStageIndex=-1; // index of stage in rocket, as returned by stage.getStageNumber();
|
||||||
|
|
||||||
|
//@SuppressWarnings("unchecked")
|
||||||
|
public StageSelectModel( final Stage _stage, String nullText) {
|
||||||
|
this.sourceStage = _stage;
|
||||||
|
this.nullText = nullText;
|
||||||
|
|
||||||
|
populateDisplayValues();
|
||||||
|
|
||||||
|
stateChanged(null); // Update current value
|
||||||
|
this.sourceStage.addChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StageSelectModel( final Stage _stage ){
|
||||||
|
this( _stage, "(no stage selected)");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void populateDisplayValues(){
|
||||||
|
Rocket rocket = this.sourceStage.getRocket();
|
||||||
|
|
||||||
|
this.displayValues.clear();
|
||||||
|
Iterator<RocketComponent> stageIter = rocket.getChildren().iterator();
|
||||||
|
while( stageIter.hasNext() ){
|
||||||
|
RocketComponent curComp = stageIter.next();
|
||||||
|
if( curComp instanceof Stage ){
|
||||||
|
Stage curStage = (Stage)curComp;
|
||||||
|
if( curStage.equals( this.sourceStage )){
|
||||||
|
continue;
|
||||||
|
}else{
|
||||||
|
displayValues.add( curStage );
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
throw new IllegalStateException("Rocket has a child which is something other than a Stage: "+curComp.getClass().getCanonicalName()+"(called: "+curComp.getName()+")");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSize() {
|
||||||
|
return this.displayValues.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stage getElementAt(int index) {
|
||||||
|
return this.displayValues.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSelectedItem(Object newItem) {
|
||||||
|
if (newItem == null) {
|
||||||
|
// Clear selection - huh?
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newItem instanceof String) {
|
||||||
|
log.error("setStage to string? huh? (unexpected value type");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( newItem instanceof Stage ){
|
||||||
|
Stage nextStage = (Stage) newItem;
|
||||||
|
int nextStageIndex = nextStage.getStageNumber();
|
||||||
|
|
||||||
|
if (nextStage.equals(this.selectedStage)){
|
||||||
|
return; // i.e. no change
|
||||||
|
}
|
||||||
|
|
||||||
|
this.selectedStage = nextStage;
|
||||||
|
this.selectedStageIndex = nextStageIndex;
|
||||||
|
this.sourceStage.setRelativeToStage(nextStageIndex);
|
||||||
|
|
||||||
|
// DEVEL
|
||||||
|
int nextDisplayIndex = this.displayValues.indexOf(newItem);
|
||||||
|
log.error("DEVEL success. set stage number to: "+nextDisplayIndex+" @"+nextStageIndex);
|
||||||
|
log.error("DEVEL success. set stage number to: "+nextStage.getName()+" ="+nextStage.toString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stage getSelectedItem() {
|
||||||
|
return this.selectedStage;
|
||||||
|
//return "StageSelectModel["+this.selectedIndex+": "+this.displayValues.get(this.selectedIndex).getName()+"]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stateChanged(EventObject eo) {
|
||||||
|
if(( null == this.sourceStage)||(null==this.selectedStage)){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int sourceRelToIndex = this.sourceStage.getRelativeToStage();
|
||||||
|
int selectedRelIndex = this.selectedStage.getStageNumber();
|
||||||
|
if ( selectedRelIndex != sourceRelToIndex){
|
||||||
|
this.selectedStage = (Stage)sourceStage.getRocket().getChild(sourceRelToIndex);
|
||||||
|
|
||||||
|
// I don't think this is required -- we're not changing the list, just the selected item.
|
||||||
|
//this.fireContentsChanged(this, 0, values.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "StageSelectModel["+this.selectedStage.getName()+" @"+this.selectedStageIndex+"]";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -23,6 +23,7 @@ import net.sf.openrocket.gui.adaptors.BooleanModel;
|
|||||||
import net.sf.openrocket.gui.adaptors.DoubleModel;
|
import net.sf.openrocket.gui.adaptors.DoubleModel;
|
||||||
import net.sf.openrocket.gui.adaptors.EnumModel;
|
import net.sf.openrocket.gui.adaptors.EnumModel;
|
||||||
import net.sf.openrocket.gui.adaptors.IntegerModel;
|
import net.sf.openrocket.gui.adaptors.IntegerModel;
|
||||||
|
import net.sf.openrocket.gui.adaptors.StageSelectModel;
|
||||||
import net.sf.openrocket.gui.components.BasicSlider;
|
import net.sf.openrocket.gui.components.BasicSlider;
|
||||||
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.UnitSelector;
|
||||||
@ -127,14 +128,8 @@ public class StageConfig extends RocketComponentConfig {
|
|||||||
JLabel relativeStageLabel = new JLabel(trans.get("RocketCompCfg.outside.componentname"));
|
JLabel relativeStageLabel = new JLabel(trans.get("RocketCompCfg.outside.componentname"));
|
||||||
motherPanel.add( relativeStageLabel);
|
motherPanel.add( relativeStageLabel);
|
||||||
parallelEnabledModel.addEnableComponent( relativeStageLabel, true);
|
parallelEnabledModel.addEnableComponent( relativeStageLabel, true);
|
||||||
// may need to implement a new ComponentComboModel or something
|
ComboBoxModel<Stage> relativeStageModel = new StageSelectModel( stage );
|
||||||
IntegerModel relToStageModel = new IntegerModel( stage, "RelativeToStage",0);
|
JComboBox<Stage> relToCombo = new JComboBox<Stage>( relativeStageModel );
|
||||||
List<RocketComponent> stageList = stage.getParent().getChildren();
|
|
||||||
RocketComponent[] forCombo = new RocketComponent[stageList.size()];
|
|
||||||
forCombo = stageList.toArray(forCombo);
|
|
||||||
DefaultComboBoxModel<RocketComponent> relativeStageComboModel = new DefaultComboBoxModel<RocketComponent>( forCombo );
|
|
||||||
ComboBoxModel<RocketComponent> relativeStageCombo = relativeStageComboModel;
|
|
||||||
JComboBox<?> relToCombo = new JComboBox<RocketComponent>( relativeStageCombo );
|
|
||||||
motherPanel.add( relToCombo , "growx, wrap");
|
motherPanel.add( relToCombo , "growx, wrap");
|
||||||
parallelEnabledModel.addEnableComponent( relToCombo, true );
|
parallelEnabledModel.addEnableComponent( relToCombo, true );
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user