/** * Copied from "TristateCheckBox Revisited" (2007-05-25) * By Dr. Heinz M. Kabutz * http://www.javaspecialists.co.za/archive/Issue145.html */ package net.vhati.modmanager.ui.tree; import java.awt.event.ItemEvent; import javax.swing.JToggleButton.ToggleButtonModel; public class TristateButtonModel extends ToggleButtonModel { private TristateState state = TristateState.DESELECTED; public TristateButtonModel( TristateState state ) { setState( state ); } public TristateButtonModel() { this( TristateState.DESELECTED ); } public void setIndeterminate() { setState( TristateState.INDETERMINATE ); } public boolean isIndeterminate() { return ( state == TristateState.INDETERMINATE ); } @Override public void setEnabled( boolean enabled ) { super.setEnabled(enabled); // Restore state display. displayState(); } @Override public void setSelected( boolean selected ) { setState( selected ? TristateState.SELECTED : TristateState.DESELECTED ); } @Override public void setArmed( boolean b ) { } @Override public void setPressed( boolean b ) { } public void iterateState() { setState( state.next() ); } public void setState( TristateState state ) { this.state = state; displayState(); if ( state == TristateState.INDETERMINATE && isEnabled() ) { // Send ChangeEvent. fireStateChanged(); // Send ItemEvent. int indeterminate = 3; fireItemStateChanged(new ItemEvent( this, ItemEvent.ITEM_STATE_CHANGED, this, indeterminate )); } } private void displayState() { super.setSelected( state != TristateState.DESELECTED ); super.setArmed( state == TristateState.INDETERMINATE ); super.setPressed( state == TristateState.INDETERMINATE ); } public TristateState getState() { return state; } public static enum TristateState { SELECTED { public TristateState next() { return INDETERMINATE; } }, INDETERMINATE { public TristateState next() { return DESELECTED; } }, DESELECTED { public TristateState next() { return SELECTED; } }; public abstract TristateState next(); } }