package org.geogebra.desktop.gui.view.spreadsheet; import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultCellEditor; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JTable; import org.geogebra.common.kernel.StringTemplate; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoList; /** * Cell editor for GeoBoolean. * * @author G.Sturr 2010-6-4 * */ public class MyCellEditorList extends DefaultCellEditor implements ActionListener { private static final long serialVersionUID = 1L; private GeoList editGeo; private JComboBox comboBox; private DefaultComboBoxModel model; public MyCellEditorList() { super(new JComboBox()); comboBox = (JComboBox) editorComponent; comboBox.setRenderer(new MyListCellRenderer()); model = new DefaultComboBoxModel(); comboBox.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { try { editGeo.setSelectedIndex(comboBox.getSelectedIndex(), false); editGeo.updateCascade(); editGeo.getKernel().notifyRepaint(); editGeo.getKernel().storeUndoInfo(); } catch (Exception ex) { ex.printStackTrace(); } } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { comboBox.removeActionListener(this); editGeo = (GeoList) value; model.removeAllElements(); for (int i = 0; i < editGeo.size(); i++) { model.addElement(editGeo.get(i)); } comboBox.setModel(model); comboBox.setSelectedIndex(editGeo.getSelectedIndex()); comboBox.addActionListener(this); return editorComponent; } @Override public Object getCellEditorValue() { return editGeo; } public boolean isEditing() { return false; } // ====================================================== // ComboBox Cell Renderer // ====================================================== /** * Custom cell renderer that displays GeoElement descriptions. */ static private class MyListCellRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) { setBackground(Color.WHITE); JLabel lbl = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, hasFocus); lbl.setHorizontalAlignment(LEFT); if (value != null) { GeoElement geo = (GeoElement) value; if (geo.isGeoText()) { setText(geo.toValueString(StringTemplate.defaultTemplate)); } else { setText(geo.getLabel(StringTemplate.defaultTemplate)); } } else { setText(" "); } return lbl; } } }