001    /*
002     * Copyright 2002-2004 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.binding.value.swing;
017    
018    import java.beans.PropertyChangeEvent;
019    import java.beans.PropertyChangeListener;
020    
021    import javax.swing.DefaultButtonModel;
022    
023    import org.springframework.binding.value.ValueModel;
024    
025    /**
026     * Adapts a value model to a ButtonModel 
027     * 
028     * @author Oliver Hutchison
029     */
030    public class SelectableButtonModelAdapter extends DefaultButtonModel implements PropertyChangeListener {
031        private final ValueModel valueModel;
032    
033        public SelectableButtonModelAdapter(ValueModel valueModel) {
034            this.valueModel = valueModel;
035            this.valueModel.addValueChangeListener(this);
036            propertyChange(null);
037        }
038    
039        public void propertyChange(PropertyChangeEvent e) {
040            Boolean selected = (Boolean)valueModel.getValue();      
041            setSelected(selected == null ? false : selected.booleanValue());
042        }
043    
044        public void setPressed(boolean pressed) {
045            if ((isPressed() == pressed) || !isEnabled()) {
046                return;
047            } else if (! pressed && isArmed()) {
048                setSelected(!this.isSelected());
049            }
050            super.setPressed(pressed);
051        }
052    
053        public void setSelected(boolean selected) {
054            if (isSelected() == selected) {
055                return;
056            }
057            super.setSelected(selected);
058            valueModel.setValue(Boolean.valueOf(isSelected()));
059        }
060    }