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) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
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.EnumModel;
|
||||
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.StyledLabel;
|
||||
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"));
|
||||
motherPanel.add( relativeStageLabel);
|
||||
parallelEnabledModel.addEnableComponent( relativeStageLabel, true);
|
||||
// may need to implement a new ComponentComboModel or something
|
||||
IntegerModel relToStageModel = new IntegerModel( stage, "RelativeToStage",0);
|
||||
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 );
|
||||
ComboBoxModel<Stage> relativeStageModel = new StageSelectModel( stage );
|
||||
JComboBox<Stage> relToCombo = new JComboBox<Stage>( relativeStageModel );
|
||||
motherPanel.add( relToCombo , "growx, wrap");
|
||||
parallelEnabledModel.addEnableComponent( relToCombo, true );
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user