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