From a9442986241f52128a878096de4eba8724c49640 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Thu, 22 Dec 2022 22:25:21 +0100 Subject: [PATCH] Add horizontal separator in view type combobox between 2D and 3D viewtypes --- .../gui/scalefigure/RocketPanel.java | 73 +++++++++---------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java index 7b1971655..2709b9509 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java @@ -2,6 +2,7 @@ package net.sf.openrocket.gui.scalefigure; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.Point; @@ -91,10 +92,12 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change private static final Translator trans = Application.getTranslator(); private static final Logger log = LoggerFactory.getLogger(RocketPanel.class); + private static final String VIEW_TYPE_SEPARATOR = "__SEPARATOR__"; // Dummy string to indicate a horizontal separator item in the view type combobox public enum VIEW_TYPE { SideView(false, RocketFigure.VIEW_SIDE), TopView(false, RocketFigure.VIEW_TOP), BackView(false, RocketFigure.VIEW_BACK), + SEPARATOR(false, -248), // Horizontal combobox separator dummy item Figure3D(true, RocketFigure3d.TYPE_FIGURE), Unfinished(true, RocketFigure3d.TYPE_UNFINISHED), Finished(true, RocketFigure3d.TYPE_FINISHED); @@ -109,6 +112,9 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change @Override public String toString() { + if (type == -248) { + return VIEW_TYPE_SEPARATOR; + } return trans.get("RocketPanel.FigTypeAct." + super.toString()); } @@ -313,8 +319,12 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change @Override public void setSelectedItem(Object o) { - super.setSelectedItem(o); VIEW_TYPE v = (VIEW_TYPE) o; + if (v == VIEW_TYPE.SEPARATOR) { + return; + } + + super.setSelectedItem(o); if (v.is3d) { figure3d.setType(v.type); go3D(); @@ -326,7 +336,9 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change } }; ribbon.add(new JLabel(trans.get("RocketPanel.lbl.ViewType")), "cell 0 0"); - ribbon.add(new JComboBox(cm), "cell 0 1"); + final JComboBox viewSelector = new JComboBox(cm); + viewSelector.setRenderer(new SeparatorComboBoxRenderer(viewSelector.getRenderer())); + ribbon.add(viewSelector, "cell 0 1"); // Zoom level selector scaleSelector = new ScaleSelector(scrollPane); @@ -1063,40 +1075,27 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change figure3d.setSelection(components); } - // /** - // * An Action that shows whether the figure type is the - // type - // * given in the constructor. - // * - // * @author Sampo Niskanen - // */ - // private class FigureTypeAction extends AbstractAction implements - // StateChangeListener { - // private static final long serialVersionUID = 1L; - // private final VIEW_TYPE type; - // - // public FigureTypeAction(VIEW_TYPE type) { - // this.type = type; - // stateChanged(null); - // figure.addChangeListener(this); - // } - // - // @Override - // public void actionPerformed(ActionEvent e) { - // boolean state = (Boolean) getValue(Action.SELECTED_KEY); - // if (state == true) { - // // This view has been selected - // figure.setType(type); - // go2D(); - // updateExtras(); - // } - // stateChanged(null); - // } - // - // @Override - // public void stateChanged(EventObject e) { - // putValue(Action.SELECTED_KEY, figure.getType() == type && !is3d); - // } - // } + /** + * Custom combobox renderer that supports the display of horizontal separators between items. + * ComboBox objects with the text {@link VIEW_TYPE_SEPARATOR} objects in the combobox are replaced by a separator object. + */ + private static class SeparatorComboBoxRenderer extends JLabel implements ListCellRenderer { + private final JSeparator separator; + private final ListCellRenderer defaultRenderer; + + public SeparatorComboBoxRenderer(ListCellRenderer defaultRenderer) { + this.defaultRenderer = defaultRenderer; + this.separator = new JSeparator(JSeparator.HORIZONTAL); + } + + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean isSelected, boolean cellHasFocus) { + String str = (value == null) ? "" : value.toString(); + if (VIEW_TYPE_SEPARATOR.equals(str)) { + return separator; + }; + return defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + } + } }