Merge pull request #1834 from SiboVG/issue-1831

[#1831] Don't highlight sustainer stage at startup
This commit is contained in:
Sibo Van Gool 2022-11-18 19:09:06 +01:00 committed by GitHub
commit d8f721a420
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 74 additions and 29 deletions

View File

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

View File

@ -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.
*/

View File

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