20 package net.sf.gridarta.gui.utils.tristate;
22 import java.awt.event.ActionEvent;
23 import java.awt.event.MouseAdapter;
24 import java.awt.event.MouseEvent;
25 import java.awt.event.MouseListener;
26 import javax.swing.AbstractAction;
27 import javax.swing.Action;
28 import javax.swing.ActionMap;
29 import javax.swing.ButtonModel;
30 import javax.swing.Icon;
31 import javax.swing.JCheckBox;
32 import javax.swing.SwingUtilities;
33 import javax.swing.event.ChangeListener;
34 import javax.swing.plaf.ActionMapUIResource;
35 import org.jetbrains.annotations.NotNull;
36 import org.jetbrains.annotations.Nullable;
55 private final ChangeListener
enableListener = e -> setFocusable(getModel().isEnabled());
82 private TristateCheckBox(@NotNull
final String text, @Nullable
final Icon icon, @NotNull
final ButtonModel buttonModel) {
86 final MouseListener mouseAdapter =
new MouseAdapter() {
89 public void mousePressed(@NotNull
final MouseEvent e) {
94 addMouseListener(mouseAdapter);
95 final ActionMap actions =
new ActionMapUIResource();
96 final Action action =
new AbstractAction() {
104 public void actionPerformed(@NotNull
final ActionEvent e) {
110 protected AbstractAction clone() {
112 return (AbstractAction) super.clone();
113 }
catch (
final CloneNotSupportedException ex) {
114 throw new AssertionError(ex);
119 actions.put(
"pressed", action);
120 actions.put(
"released",
null);
122 SwingUtilities.replaceUIActionMap(
this, actions);
126 public final void setModel(@NotNull
final ButtonModel newModel) {
127 final ButtonModel oldModel = getModel();
132 super.setModel(newModel);
144 if (!getModel().isEnabled()) {
153 fireActionPerformed(
new ActionEvent(
this, ActionEvent.ACTION_PERFORMED, getText(), System.currentTimeMillis(), modifiers));