blob: c9f61c91a9da67d07a98d76517d674a170d11d37 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.util.xml.ui;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.Factory;
import com.intellij.openapi.util.Pair;
import com.intellij.util.containers.HashMap;
import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.Map;
/**
* @author peter
*/
public class ComboTableCellEditor extends DefaultCellEditor {
private final boolean myNullable;
private final Factory<List<Pair<String, Icon>>> myDataFactory;
private Map<String, Icon> myData;
private static final Pair<String,Icon> EMPTY = Pair.create(" ", null);
public ComboTableCellEditor(Factory<List<Pair<String, Icon>>> dataFactory, final boolean nullable) {
super(new JComboBox());
myDataFactory = dataFactory;
myNullable = nullable;
setClickCountToStart(2);
JComboBox comboBox = (JComboBox)editorComponent;
comboBox.setBorder(null);
comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
ComboControl.initComboBox(comboBox, new Condition<String>() {
@Override
public boolean value(final String object) {
return myData != null && myData.containsKey(object) || myNullable && EMPTY.first == object;
}
});
}
public ComboTableCellEditor(Class<? extends Enum> anEnum, final boolean nullable) {
this(ComboControl.createEnumFactory(anEnum), nullable);
}
@Override
public Object getCellEditorValue() {
final Pair<String,Icon> cellEditorValue = (Pair<String,Icon>)super.getCellEditorValue();
return EMPTY == cellEditorValue || null == cellEditorValue ? null : cellEditorValue.first;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
final List<Pair<String, Icon>> list = myDataFactory.create();
myData = new HashMap<String,Icon>();
final JComboBox comboBox = (JComboBox)editorComponent;
comboBox.removeAllItems();
if (myNullable) {
comboBox.addItem(EMPTY);
}
for (final Pair<String, Icon> pair : list) {
myData.put(pair.first, pair.second);
comboBox.addItem(pair);
}
final Pair<Object, Icon> pair = Pair.create(value, myData.get(value));
comboBox.setEditable(true);
super.getTableCellEditorComponent(table, pair, isSelected, row, column);
comboBox.setEditable(false);
return comboBox;
}
}