[#2019] Highlight selected component in CA dialog in rocket panel

This commit is contained in:
SiboVG 2024-09-06 18:01:52 +02:00
parent 0c0ae11fbc
commit 4f7b3bb452
2 changed files with 89 additions and 23 deletions

View File

@ -50,7 +50,10 @@ import javax.swing.SwingConstants;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableModel;
import java.awt.Color; import java.awt.Color;
import java.awt.Component; import java.awt.Component;
import java.awt.Dimension; import java.awt.Dimension;
@ -112,8 +115,6 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange
this.theta = new DoubleModel(parameters, "Theta", UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI); this.theta = new DoubleModel(parameters, "Theta", UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI);
this.roll = new DoubleModel(parameters, "RollRate", UnitGroup.UNITS_ROLL); this.roll = new DoubleModel(parameters, "RollRate", UnitGroup.UNITS_ROLL);
JTable table;
//// Wind direction: //// Wind direction:
this.add(new JLabel(trans.get("ComponentAnalysisGeneralTab.lbl.winddir"))); this.add(new JLabel(trans.get("ComponentAnalysisGeneralTab.lbl.winddir")));
EditableSpinner spinner = new EditableSpinner(theta.getSpinnerModel()); EditableSpinner spinner = new EditableSpinner(theta.getSpinnerModel());
@ -200,7 +201,7 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange
// Create the Longitudinal Stability (CM vs CP) data table // Create the Longitudinal Stability (CM vs CP) data table
this.longitudeStabilityTableModel = new ColumnTableModel( this.longitudeStabilityTableModel = new CAColumnTableModel(
//// Component //// Component
new Column(trans.get("ComponentAnalysisGeneralTab.TabStability.Col.Component")) { new Column(trans.get("ComponentAnalysisGeneralTab.TabStability.Col.Component")) {
@ -267,15 +268,24 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange
public int getRowCount() { public int getRowCount() {
return stabData.size(); return stabData.size();
} }
@Override
public RocketComponent getComponentForRow(int row) {
if (row < 0 || row >= getRowCount()) {
return null;
}
Object source = stabData.get(row).source;
return source instanceof RocketComponent ? (RocketComponent) source : null;
}
}; };
table = new ColumnTable(longitudeStabilityTableModel); final JTable stabilityTable = new ColumnTable(longitudeStabilityTableModel);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); stabilityTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
this.longitudeStabilityTableModel.setColumnWidths(table.getColumnModel()); this.longitudeStabilityTableModel.setColumnWidths(stabilityTable.getColumnModel());
table.setDefaultRenderer(Object.class, new StabilityCellRenderer()); stabilityTable.setDefaultRenderer(Object.class, new StabilityCellRenderer());
JScrollPane scrollpane = new JScrollPane(table); JScrollPane scrollpane = new JScrollPane(stabilityTable);
scrollpane.setPreferredSize(new Dimension(600, 200)); scrollpane.setPreferredSize(new Dimension(600, 200));
//// Stability and Stability information //// Stability and Stability information
@ -285,7 +295,7 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange
// Create the drag data table // Create the drag data table
this.dragTableModel = new ColumnTableModel( this.dragTableModel = new CAColumnTableModel(
//// Component //// Component
new Column(trans.get("ComponentAnalysisGeneralTab.dragTableModel.Col.Component")) { new Column(trans.get("ComponentAnalysisGeneralTab.dragTableModel.Col.Component")) {
@Override @Override
@ -340,16 +350,24 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange
public int getRowCount() { public int getRowCount() {
return dragData.size(); return dragData.size();
} }
@Override
public RocketComponent getComponentForRow(int row) {
if (row < 0 || row >= getRowCount()) {
return null;
}
return dragData.get(row).getComponent();
}
}; };
table = new JTable(dragTableModel); final JTable dragTable = new JTable(dragTableModel);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); dragTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
this.dragTableModel.setColumnWidths(table.getColumnModel()); this.dragTableModel.setColumnWidths(dragTable.getColumnModel());
table.setDefaultRenderer(Object.class, new DragCellRenderer()); dragTable.setDefaultRenderer(Object.class, new DragCellRenderer());
scrollpane = new JScrollPane(table); scrollpane = new JScrollPane(dragTable);
scrollpane.setPreferredSize(new Dimension(600, 200)); scrollpane.setPreferredSize(new Dimension(600, 200));
//// Drag characteristics and Drag characteristics tooltip //// Drag characteristics and Drag characteristics tooltip
@ -360,7 +378,7 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange
// Create the roll data table // Create the roll data table
this.rollTableModel = new ColumnTableModel( this.rollTableModel = new CAColumnTableModel(
//// Component //// Component
new Column(trans.get("ComponentAnalysisGeneralTab.rollTableModel.Col.component")) { new Column(trans.get("ComponentAnalysisGeneralTab.rollTableModel.Col.component")) {
@Override @Override
@ -403,14 +421,22 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange
public int getRowCount() { public int getRowCount() {
return rollData.size(); return rollData.size();
} }
@Override
public RocketComponent getComponentForRow(int row) {
if (row < 0 || row >= getRowCount()) {
return null;
}
return rollData.get(row).getComponent();
}
}; };
table = new JTable(rollTableModel); final JTable rollTable = new JTable(rollTableModel);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); rollTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.setDefaultRenderer(Object.class, new RollDynamicsCellRenderer()); rollTable.setDefaultRenderer(Object.class, new RollDynamicsCellRenderer());
scrollpane = new JScrollPane(table); scrollpane = new JScrollPane(rollTable);
scrollpane.setPreferredSize(new Dimension(600, 200)); scrollpane.setPreferredSize(new Dimension(600, 200));
//// Roll dynamics and Roll dynamics tooltip //// Roll dynamics and Roll dynamics tooltip
@ -459,6 +485,11 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange
this.roll.addChangeListener(this); this.roll.addChangeListener(this);
this.stateChanged(null); this.stateChanged(null);
// Add listeners to highlight the selected component in the rocket panel
stabilityTable.getSelectionModel().addListSelectionListener(new CAListSelectionListener(rocketPanel, stabilityTable));
dragTable.getSelectionModel().addListSelectionListener(new CAListSelectionListener(rocketPanel, dragTable));
rollTable.getSelectionModel().addListSelectionListener(new CAListSelectionListener(rocketPanel, rollTable));
// Remove listeners when closing window // Remove listeners when closing window
parent.addWindowListener(new WindowAdapter() { parent.addWindowListener(new WindowAdapter() {
@Override @Override
@ -767,8 +798,7 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange
} }
} }
private class LongitudinalStabilityRow { private static class LongitudinalStabilityRow {
public String name; public String name;
public Object source; public Object source;
public double eachMass; public double eachMass;
@ -784,6 +814,34 @@ public class ComponentAnalysisGeneralPanel extends JPanel implements StateChange
cpx = Double.NaN; cpx = Double.NaN;
cna = Double.NaN; cna = Double.NaN;
} }
}
private abstract static class CAColumnTableModel extends ColumnTableModel {
public CAColumnTableModel(Column... columns) {
super(columns);
}
public RocketComponent getComponentForRow(int row) {
throw new RuntimeException("Not implemented");
}
}
private static class CAListSelectionListener implements ListSelectionListener {
private final RocketPanel rocketPanel;
private final JTable table;
public CAListSelectionListener(RocketPanel rocketPanel, JTable table) {
this.rocketPanel = rocketPanel;
this.table = table;
}
@Override
public void valueChanged(ListSelectionEvent e) {
TableModel model = table.getModel();
if (model instanceof CAColumnTableModel) {
RocketComponent component = ((CAColumnTableModel) model).getComponentForRow(table.getSelectedRow());
rocketPanel.setSelectedComponent(component);
}
}
} }
} }

View File

@ -541,6 +541,15 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
valueChanged((TreeSelectionEvent) null); // updates FigureParameters valueChanged((TreeSelectionEvent) null); // updates FigureParameters
} }
public void setSelectedComponent(RocketComponent component) {
if (component == null) {
selectionModel.setSelectionPath(null);
return;
}
TreePath path = ComponentTreeModel.makeTreePath(component);
selectionModel.setSelectionPath(path);
}
/** /**
* Return the angle of attack used in CP calculation. NaN signifies the default value * Return the angle of attack used in CP calculation. NaN signifies the default value
* of zero. * of zero.
@ -672,8 +681,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
if (newClick) { if (newClick) {
for (RocketComponent rocketComponent : clicked) { for (RocketComponent rocketComponent : clicked) {
if (!selectedComponents.contains(rocketComponent)) { if (!selectedComponents.contains(rocketComponent)) {
TreePath path = ComponentTreeModel.makeTreePath(rocketComponent); setSelectedComponent(rocketComponent);
selectionModel.setSelectionPath(path);
} }
} }
} }