implemented gui elements for locating a stage relative to another stage.

This commit is contained in:
Daniel_M_Williams 2015-06-30 17:57:14 -04:00
parent d5de1cbac4
commit 177b24a667
3 changed files with 149 additions and 8 deletions

View File

@ -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;
}

View 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+"]";
}
}

View File

@ -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 );