Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / gui / preset / DeselectableComboBox.java
diff --git a/core/src/net/sf/openrocket/gui/preset/DeselectableComboBox.java b/core/src/net/sf/openrocket/gui/preset/DeselectableComboBox.java
new file mode 100644 (file)
index 0000000..758a850
--- /dev/null
@@ -0,0 +1,83 @@
+package net.sf.openrocket.gui.preset;
+
+import javax.swing.*;
+import javax.swing.plaf.basic.BasicComboBoxRenderer;
+import java.awt.*;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * A combo box that allows for items to be deselected.
+ */
+public class DeselectableComboBox extends JComboBox {
+
+    public DeselectableComboBox() {
+        super();
+        super.setRenderer(new DeselectedtemsRenderer());
+    }
+
+    private Set disabled_items = new HashSet();
+
+    public void addItem(Object anObject, boolean disabled) {
+        super.addItem(anObject);
+        if (disabled) {
+            disabled_items.add(getItemCount() - 1);
+        }
+    }
+
+    @Override
+    public void removeAllItems() {
+        super.removeAllItems();
+        disabled_items = new HashSet();
+    }
+
+    @Override
+    public void removeItemAt(final int anIndex) {
+        super.removeItemAt(anIndex);
+        disabled_items.remove(anIndex);
+    }
+
+    @Override
+    public void removeItem(final Object anObject) {
+        for (int i = 0; i < getItemCount(); i++) {
+            if (getItemAt(i) == anObject) {
+                disabled_items.remove(i);
+            }
+        }
+        super.removeItem(anObject);
+    }
+
+    @Override
+    public void setSelectedIndex(int index) {
+        if (!disabled_items.contains(index)) {
+            super.setSelectedIndex(index);
+        }
+    }
+
+    private class DeselectedtemsRenderer extends BasicComboBoxRenderer {
+
+        @Override
+        public Component getListCellRendererComponent(JList list,
+                                                      Object value,
+                                                      int index,
+                                                      boolean isSelected,
+                                                      boolean cellHasFocus) {
+
+            if (isSelected) {
+                setBackground(list.getSelectionBackground());
+                setForeground(list.getSelectionForeground());
+            }
+            else {
+                setBackground(list.getBackground());
+                setForeground(list.getForeground());
+            }
+            if (disabled_items.contains(index)) {
+                setBackground(list.getBackground());
+                setForeground(UIManager.getColor("Label.disabledForeground"));
+            }
+            setFont(list.getFont());
+            setText((value == null) ? "" : value.toString());
+            return this;
+        }
+    }
+}