blob: 282e728e0afd62f333ff39a1a354c85b3ac9f2ce [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.pivot.wtk;
import java.util.Iterator;
import org.apache.pivot.collections.Group;
import org.apache.pivot.collections.HashSet;
import org.apache.pivot.util.ImmutableIterator;
import org.apache.pivot.util.ListenerList;
/**
* Class representing a toggle button group.
*/
public class ButtonGroup implements Group<Button>, Iterable<Button> {
private static class ButtonGroupListenerList extends WTKListenerList<ButtonGroupListener>
implements ButtonGroupListener {
@Override
public void buttonAdded(ButtonGroup buttonGroup, Button button) {
for (ButtonGroupListener listener : this) {
listener.buttonAdded(buttonGroup, button);
}
}
@Override
public void buttonRemoved(ButtonGroup buttonGroup, Button button) {
for (ButtonGroupListener listener : this) {
listener.buttonRemoved(buttonGroup, button);
}
}
@Override
public void selectionChanged(ButtonGroup buttonGroup, Button previousSelection) {
for (ButtonGroupListener listener : this) {
listener.selectionChanged(buttonGroup, previousSelection);
}
}
}
private HashSet<Button> buttons = new HashSet<>();
private Button selection = null;
private ButtonGroupListenerList buttonGroupListeners = new ButtonGroupListenerList();
@Override
public boolean add(Button button) {
boolean added = false;
if (!contains(button)) {
buttons.add(button);
added = true;
if (button.isSelected()) {
if (selection == null) {
selection = button;
} else {
button.setSelected(false);
}
}
button.setButtonGroup(this);
buttonGroupListeners.buttonAdded(this, button);
}
return added;
}
@Override
public boolean remove(Button button) {
boolean removed = false;
if (contains(button)) {
buttons.remove(button);
removed = true;
if (button.isSelected()) {
selection = null;
}
button.setButtonGroup(null);
buttonGroupListeners.buttonRemoved(this, button);
}
return removed;
}
@Override
public boolean contains(Button button) {
return buttons.contains(button);
}
public Button getSelection() {
return selection;
}
public void setSelection(Button selection) {
if (selection != null && selection.getButtonGroup() != this) {
throw new IllegalArgumentException();
}
Button previousSelection = this.selection;
if (previousSelection != selection) {
this.selection = selection;
if (previousSelection != null) {
previousSelection.setSelected(false);
}
if (selection != null) {
selection.setSelected(true);
}
buttonGroupListeners.selectionChanged(this, previousSelection);
}
}
@Override
public Iterator<Button> iterator() {
return new ImmutableIterator<>(buttons.iterator());
}
public ListenerList<ButtonGroupListener> getButtonGroupListeners() {
return buttonGroupListeners;
}
}