Merge pull request #1834 from SiboVG/issue-1831
[#1831] Don't highlight sustainer stage at startup
This commit is contained in:
commit
d8f721a420
@ -1,6 +1,8 @@
|
||||
package net.sf.openrocket.gui.main;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.Window;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.KeyEvent;
|
||||
@ -20,7 +22,25 @@ import java.util.Arrays;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import javax.swing.*;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JMenu;
|
||||
import javax.swing.JMenuBar;
|
||||
import javax.swing.JMenuItem;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JPopupMenu;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.JSplitPane;
|
||||
import javax.swing.JTabbedPane;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.KeyStroke;
|
||||
import javax.swing.ListSelectionModel;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.border.BevelBorder;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.tree.DefaultTreeSelectionModel;
|
||||
@ -259,11 +279,13 @@ public class BasicFrame extends JFrame {
|
||||
if( componentSelectionModel.isSelectionEmpty() ){
|
||||
final Rocket rocket = document.getRocket();
|
||||
if( rocket != null ) {
|
||||
final AxialStage topStage = (AxialStage) rocket.getChild(0);
|
||||
final RocketComponent topStage = rocket.getChild(0);
|
||||
if (topStage != null) {
|
||||
final TreePath selectionPath = new TreePath(topStage);
|
||||
componentSelectionModel.setSelectionPath(selectionPath);
|
||||
tree.setSelectionRow(1);
|
||||
// Don't select children components at startup (so override the default behavior with this new selection)
|
||||
rocketpanel.getFigure().setSelection(new RocketComponent[] { topStage });
|
||||
log.debug("... Setting Initial Selection: " + tree.getSelectionPath() );
|
||||
}
|
||||
}
|
||||
|
@ -69,36 +69,30 @@ public class DesignPanel extends JSplitPane {
|
||||
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_KEY), null);
|
||||
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_N, SHORTCUT_KEY), null);
|
||||
|
||||
// Visually select all child components of a stage/rocket/podset when it is selected
|
||||
// Highlight all child components of a stage/rocket/podset when it is selected
|
||||
tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
|
||||
@Override
|
||||
public void valueChanged(TreeSelectionEvent e) {
|
||||
if (tree == null || tree.getSelectionPaths() == null || tree.getSelectionPaths().length == 0
|
||||
|| parent.getRocketPanel() == null) return;
|
||||
|
||||
// Get all the components that need to be selected = currently selected components + children of stages/boosters/podsets
|
||||
List<RocketComponent> children = new ArrayList<>(Arrays.asList(parent.getRocketPanel().getFigure().getSelection()));
|
||||
for (TreePath p : tree.getSelectionPaths()) {
|
||||
if (p != null) {
|
||||
RocketComponent c = (RocketComponent) p.getLastPathComponent();
|
||||
if (c instanceof AxialStage || c instanceof Rocket || c instanceof PodSet) {
|
||||
Iterator<RocketComponent> iter = c.iterator(false);
|
||||
while (iter.hasNext()) {
|
||||
RocketComponent child = iter.next();
|
||||
children.add(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Select all the child components
|
||||
if (parent.getRocketPanel().getFigure() != null && parent.getRocketPanel().getFigure3d() != null) {
|
||||
parent.getRocketPanel().getFigure().setSelection(children.toArray(new RocketComponent[0]));
|
||||
parent.getRocketPanel().getFigure3d().setSelection(children.toArray(new RocketComponent[0]));
|
||||
}
|
||||
highlightAssemblyChildren(tree, parent);
|
||||
}
|
||||
});
|
||||
|
||||
// Add a mouse listener for when the sustainer is selected at startup, to ensure that its children are highlighted.
|
||||
// This is necessary because we force the children to not be highlighted when the tree is first created, and
|
||||
// re-clicking the sustainer would not fire a change event in the tree (which normally highlights the children).
|
||||
MouseAdapter mouseAdapter = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
if (tree.getSelectionPath() != null &&
|
||||
tree.getSelectionPath().getLastPathComponent() == document.getRocket().getChild(0)) {
|
||||
highlightAssemblyChildren(tree, parent);
|
||||
}
|
||||
// Delete the listener again. We only need it at start-up, i.e. when the first click is registered.
|
||||
tree.removeMouseListener(this);
|
||||
}
|
||||
};
|
||||
tree.addMouseListener(mouseAdapter);
|
||||
|
||||
// Double-click opens config dialog
|
||||
MouseListener ml = new MouseAdapter() {
|
||||
@Override
|
||||
@ -234,6 +228,37 @@ public class DesignPanel extends JSplitPane {
|
||||
this.setRightComponent(panel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Highlight all child components of a stage/rocket/podset when it is selected
|
||||
* @param tree the tree in which the component selection took place
|
||||
* @param parent the parent frame to highlight the components in
|
||||
*/
|
||||
private static void highlightAssemblyChildren(ComponentTree tree, BasicFrame parent) {
|
||||
if (tree == null || tree.getSelectionPaths() == null || tree.getSelectionPaths().length == 0
|
||||
|| parent.getRocketPanel() == null) return;
|
||||
|
||||
// Get all the components that need to be selected = currently selected components + children of stages/boosters/podsets
|
||||
List<RocketComponent> children = new ArrayList<>(Arrays.asList(parent.getRocketPanel().getFigure().getSelection()));
|
||||
for (TreePath p : tree.getSelectionPaths()) {
|
||||
if (p != null) {
|
||||
RocketComponent c = (RocketComponent) p.getLastPathComponent();
|
||||
if (c instanceof AxialStage || c instanceof Rocket || c instanceof PodSet) {
|
||||
Iterator<RocketComponent> iter = c.iterator(false);
|
||||
while (iter.hasNext()) {
|
||||
RocketComponent child = iter.next();
|
||||
children.add(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Select all the child components
|
||||
if (parent.getRocketPanel().getFigure() != null && parent.getRocketPanel().getFigure3d() != null) {
|
||||
parent.getRocketPanel().getFigure().setSelection(children.toArray(new RocketComponent[0]));
|
||||
parent.getRocketPanel().getFigure3d().setSelection(children.toArray(new RocketComponent[0]));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Focus on the component tree.
|
||||
*/
|
||||
|
@ -5,7 +5,6 @@ import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.Point;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.InputEvent;
|
||||
@ -16,7 +15,6 @@ import java.util.EventListener;
|
||||
import java.util.EventObject;
|
||||
import java.util.List;
|
||||
import java.util.LinkedList;
|
||||
import java.util.TimerTask;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
|
Loading…
x
Reference in New Issue
Block a user