/*
* RapidMiner
*
* Copyright (C) 2001-2014 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.gui.tools.components;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import com.rapidminer.gui.tools.ArrowButton;
import com.rapidminer.gui.tools.ViewToolBar;
import com.vlsolutions.swing.toolbars.VLToolBar;
/**
*
* @author Dominik Halfkann
*/
public abstract class PlainArrowDropDownButton extends JButton {
private static final long serialVersionUID = -5987392204641149649L;
private final PopupMenuListener popupMenuListener = new PopupMenuListener() {
public void popupMenuWillBecomeVisible(PopupMenuEvent e){
popupVisible = true;
arrowButton.getModel().setSelected(true);
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e){
popupVisible = false;
arrowButton.getModel().setSelected(false);
((JPopupMenu)e.getSource()).removePopupMenuListener(this); // act as good programmer :)
}
public void popupMenuCanceled(PopupMenuEvent e){
popupVisible = false;
}
};
private final ChangeListener changeListener = new ChangeListener() {
public void stateChanged(ChangeEvent e){
if(popupVisible && !arrowButton.getModel().isSelected()){
arrowButton.getModel().setSelected(true);
return;
}
}
};
public static class DropDownArrowButton extends ArrowButton {
private static final long serialVersionUID = -398619111521186260L;
public DropDownArrowButton() {
super(SwingConstants.SOUTH);
}
}
private final ArrowButton arrowButton = new DropDownArrowButton();
private boolean popupVisible = false;
public PlainArrowDropDownButton(Action action){
super(action);
arrowButton.getModel().addChangeListener(changeListener);
arrowButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae){
JPopupMenu popup = getPopupMenu();
popup.addPopupMenuListener(popupMenuListener);
popup.show(arrowButton, 0, arrowButton.getHeight());
}
});
arrowButton.setMargin(new Insets(0, 0, 0, 0));
}
protected abstract JPopupMenu getPopupMenu();
public void add(Action action) {
getPopupMenu().add(action);
}
public void add(JMenuItem item) {
getPopupMenu().add(item);
}
public JButton addToToolBar(JToolBar toolbar){
toolbar.add(arrowButton);
return arrowButton;
}
public JButton addToToolBar(VLToolBar toolbar) {
toolbar.add(arrowButton);
return arrowButton;
}
public JButton addToToolBar(ViewToolBar toolbar, int alignment) {
toolbar.add(arrowButton, alignment);
return arrowButton;
}
public JButton getDropDownArrowButton() {
return arrowButton;
}
// factory methods
public static PlainArrowDropDownButton makeDropDownButton(Action mainAction, Action ... actions) {
final JPopupMenu menu = new JPopupMenu();
for (Action action : actions) {
menu.add(action);
}
return new PlainArrowDropDownButton(mainAction) {
private static final long serialVersionUID = -7359018188605409766L;
@Override
protected JPopupMenu getPopupMenu() {
return menu;
}
};
}
public static PlainArrowDropDownButton makeDropDownButton(Action action) {
final JPopupMenu menu = new JPopupMenu();
return new PlainArrowDropDownButton(action) {
private static final long serialVersionUID = -7359018188605409766L;
@Override
protected JPopupMenu getPopupMenu() {
return menu;
}
};
}
}