Code
class PluginCellEditor extends DefaultCellEditor {
private final PluginPanel panel;
private transient PluginNode node;
protected PluginCellEditor(JComboBox comboBox) {
super(comboBox);
panel = new PluginPanel(comboBox);
}
@Override public Component getTreeCellEditorComponent(
JTree tree, Object value, boolean isSelected, boolean expanded,
boolean leaf, int row) {
this.node = panel.extractNode(value);
return panel;
}
@Override public Object getCellEditorValue() {
Object o = super.getCellEditorValue();
return Optional.ofNullable(node).map(node -> {
DefaultComboBoxModel m =
(DefaultComboBoxModel) panel.comboBox.getModel();
PluginNode n = new PluginNode(panel.pluginName.getText(), node.plugins);
n.setSelectedPluginIndex(m.getIndexOf(o));
return (Object) n;
}).orElse(o);
}
@Override public boolean isCellEditable(EventObject e) {
Object source = e.getSource();
if (!(source instanceof JTree) || !(e instanceof MouseEvent)) {
return false;
}
JTree tree = (JTree) source;
Point p = ((MouseEvent) e).getPoint();
TreePath path = tree.getPathForLocation(p.x, p.y);
if (Objects.isNull(path)) {
return false;
}
Object node = path.getLastPathComponent();
if (!(node instanceof DefaultMutableTreeNode)) {
return false;
}
Rectangle r = tree.getPathBounds(path);
if (Objects.isNull(r)) {
return false;
}
Dimension d = panel.getPreferredSize();
r.width = d.width;
if (r.contains(p)) {
showComboPopup(tree, p);
return true;
}
return delegate.isCellEditable(e);
}
private void showComboPopup(JTree tree, Point p) {
EventQueue.invokeLater(() -> {
Point pt = SwingUtilities.convertPoint(tree, p, panel);
Component o = SwingUtilities.getDeepestComponentAt(panel, pt.x, pt.y);
if (o instanceof JComboBox) {
panel.comboBox.showPopup();
} else if (Objects.nonNull(o)) {
Container c = SwingUtilities.getAncestorOfClass(
JComboBox.class, (Component) o);
if (c instanceof JComboBox) {
panel.comboBox.showPopup();
}
}
});
}
}
References
No comments:
Post a Comment