package krasa.grepconsole.gui.table.column; import com.intellij.util.ui.ColumnInfo; import org.apache.commons.beanutils.PropertyUtils; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; import java.util.List; public class JavaBeanColumnInfo<Item, Value> extends ColumnInfo<Item, Value> { private String maxStringValue = null; private String tooltipText = null; private String preferedStringValue = null; private int additionalWidth = 0; private String propertyName; private int width = -1; private List<ValueChangedListener<Item, Value>> valueChangedListeners; public JavaBeanColumnInfo(String name, String propertyName) { super(name); this.propertyName = propertyName; } public JavaBeanColumnInfo tooltipText(final String tooltipText) { this.tooltipText = tooltipText; return this; } @Nullable @Override public String getTooltipText() { if (tooltipText == null) { return getName(); } return tooltipText; } @Nullable @Override public String getMaxStringValue() { return maxStringValue; } @Nullable @Override public String getPreferredStringValue() { return preferedStringValue; } @Override public int getAdditionalWidth() { return additionalWidth; } @Override public int getWidth(JTable table) { return width; } @Nullable @Override public Value valueOf(Item item) { return getProperty(item); } @Override public void setValue(Item item, Value value) { setPropertyValue(item, value); if (valueChangedListeners != null) { for (ValueChangedListener<Item, Value> lister : valueChangedListeners) { lister.onValueChanged(item, value); } } } @Override public boolean isCellEditable(Item item) { return true; } protected void setPropertyValue(Item item, Value value) { try { PropertyUtils.setProperty(item, propertyName, value); } catch (Exception e) { throw new RuntimeException(e); } } protected Value getProperty(Item item) { try { return (Value) PropertyUtils.getProperty(item, propertyName); } catch (Exception e) { throw new RuntimeException(e); } } public JavaBeanColumnInfo width(final int width) { this.width = width; return this; } public JavaBeanColumnInfo additionalWidth(final int additionalWidth) { this.additionalWidth = additionalWidth; return this; } public JavaBeanColumnInfo propertyName(final String propertyName) { this.propertyName = propertyName; return this; } public JavaBeanColumnInfo preferedStringValue(final String preferedStringValue) { this.preferedStringValue = preferedStringValue; return this; } public JavaBeanColumnInfo maxStringValue(final String maxStringValue) { this.maxStringValue = maxStringValue; return this; } @Override public String toString() { return "JavaBeanColumnInfo{" + "tooltipText='" + tooltipText + '\'' + "} " + super.toString(); } public boolean addListener(ValueChangedListener<Item, Value> listener) { if (valueChangedListeners == null) { valueChangedListeners = new ArrayList<>(); } return valueChangedListeners.add(listener); } public boolean removeListener(ValueChangedListener<Item, Value> o) { if (valueChangedListeners != null) { return valueChangedListeners.remove(o); } return false; } }