/******************************************************************************* * This file is part of logisim-evolution. * * logisim-evolution is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * logisim-evolution is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with logisim-evolution. If not, see <http://www.gnu.org/licenses/>. * * Original code by Carl Burch (http://www.cburch.com), 2011. * Subsequent modifications by : * + Haute École Spécialisée Bernoise * http://www.bfh.ch * + Haute École du paysage, d'ingénierie et d'architecture de Genève * http://hepia.hesge.ch/ * + Haute École d'Ingénierie et de Gestion du Canton de Vaud * http://www.heig-vd.ch/ * The project is currently maintained by : * + REDS Institute - HEIG-VD * Yverdon-les-Bains, Switzerland * http://reds.heig-vd.ch *******************************************************************************/ package com.cburch.logisim.analyze.gui; import java.awt.event.ItemListener; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import com.cburch.logisim.analyze.model.AnalyzerModel; import com.cburch.logisim.analyze.model.VariableList; import com.cburch.logisim.analyze.model.VariableListEvent; import com.cburch.logisim.analyze.model.VariableListListener; class OutputSelector { @SuppressWarnings("rawtypes") private class Model extends AbstractListModel implements ComboBoxModel, VariableListListener { private static final long serialVersionUID = 1L; private Object selected; public Object getElementAt(int index) { return source.get(index); } public Object getSelectedItem() { return selected; } public int getSize() { return source.size(); } public void listChanged(VariableListEvent event) { int index; String variable; Object selection; switch (event.getType()) { case VariableListEvent.ALL_REPLACED: computePrototypeValue(); fireContentsChanged(this, 0, getSize()); if (source.isEmpty()) { select.setSelectedItem(null); } else { select.setSelectedItem(source.get(0)); } break; case VariableListEvent.ADD: variable = event.getVariable(); if (prototypeValue == null || variable.length() > prototypeValue.length()) { computePrototypeValue(); } index = source.indexOf(variable); fireIntervalAdded(this, index, index); if (select.getSelectedItem() == null) { select.setSelectedItem(variable); } break; case VariableListEvent.REMOVE: variable = event.getVariable(); if (variable.equals(prototypeValue)) computePrototypeValue(); index = ((Integer) event.getData()).intValue(); fireIntervalRemoved(this, index, index); selection = select.getSelectedItem(); if (selection != null && selection.equals(variable)) { selection = source.isEmpty() ? null : source.get(0); select.setSelectedItem(selection); } break; case VariableListEvent.MOVE: fireContentsChanged(this, 0, getSize()); break; case VariableListEvent.REPLACE: variable = event.getVariable(); if (variable.equals(prototypeValue)) computePrototypeValue(); index = ((Integer) event.getData()).intValue(); fireContentsChanged(this, index, index); selection = select.getSelectedItem(); if (selection != null && selection.equals(variable)) { select.setSelectedItem(event.getSource().get(index)); } break; } } public void setSelectedItem(Object value) { selected = value; } } private VariableList source; private JLabel label = new JLabel(); @SuppressWarnings("rawtypes") private JComboBox select = new JComboBox<>(); private String prototypeValue = null; @SuppressWarnings("unchecked") public OutputSelector(AnalyzerModel model) { this.source = model.getOutputs(); Model listModel = new Model(); select.setModel(listModel); source.addVariableListListener(listModel); } public void addItemListener(ItemListener l) { select.addItemListener(l); } @SuppressWarnings("unchecked") private void computePrototypeValue() { String newValue; if (source.isEmpty()) { newValue = "xx"; } else { newValue = "xx"; for (int i = 0, n = source.size(); i < n; i++) { String candidate = source.get(i); if (candidate.length() > newValue.length()) newValue = candidate; } } if (prototypeValue == null || newValue.length() != prototypeValue.length()) { prototypeValue = newValue; select.setPrototypeDisplayValue(prototypeValue + "xx"); select.revalidate(); } } public JPanel createPanel() { JPanel ret = new JPanel(); ret.add(label); ret.add(select); return ret; } @SuppressWarnings("rawtypes") public JComboBox getComboBox() { return select; } public JLabel getLabel() { return label; } public String getSelectedOutput() { String value = (String) select.getSelectedItem(); if (value != null && !source.contains(value)) { if (source.isEmpty()) { value = null; } else { value = source.get(0); } select.setSelectedItem(value); } return value; } void localeChanged() { label.setText(Strings.get("outputSelectLabel")); } public void removeItemListener(ItemListener l) { select.removeItemListener(l); } }