/* * 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 ro.nextreports.designer.util; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.AbstractButton; import javax.swing.JButton; import javax.swing.JPopupMenu; import javax.swing.JToolBar; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; /** * @author Decebal Suiu */ public class DropDownButton extends JButton implements ChangeListener, PopupMenuListener, ActionListener, PropertyChangeListener { private final JButton mainButton = this; private final JButton arrowButton = new JButton(ImageUtil.getImageIcon("dropdown")); private boolean popupVisible = false; private JPopupMenu popupMenu; public DropDownButton() { mainButton.getModel().addChangeListener(this); arrowButton.getModel().addChangeListener(this); arrowButton.addActionListener(this); mainButton.addPropertyChangeListener("enabled", this); // NOI18N getPopupMenu().addContainerListener(new MenuContainerListener()); } public void propertyChange(PropertyChangeEvent event) { arrowButton.setEnabled(mainButton.isEnabled()); } public void stateChanged(ChangeEvent event) { if (event.getSource() == mainButton.getModel()) { if (popupVisible && !mainButton.getModel().isRollover()) { mainButton.getModel().setRollover(true); return; } arrowButton.getModel().setRollover(mainButton.getModel().isRollover()); arrowButton.setSelected(mainButton.getModel().isArmed() && mainButton.getModel().isPressed()); } else { if (popupVisible && !arrowButton.getModel().isSelected()) { arrowButton.getModel().setSelected(true); return; } mainButton.getModel().setRollover(arrowButton.getModel().isRollover()); } } public void actionPerformed(ActionEvent event) { JPopupMenu popup = getPopupMenu(); popup.addPopupMenuListener(this); popup.show(mainButton, 0, mainButton.getHeight()); } public void popupMenuWillBecomeVisible(PopupMenuEvent event) { popupVisible = true; mainButton.getModel().setRollover(true); arrowButton.getModel().setSelected(true); } public void popupMenuWillBecomeInvisible(PopupMenuEvent event) { popupVisible = false; mainButton.getModel().setRollover(false); arrowButton.getModel().setSelected(false); ((JPopupMenu) event.getSource()).removePopupMenuListener(this); } public void popupMenuCanceled(PopupMenuEvent event) { popupVisible = false; } public JPopupMenu getPopupMenu() { if (popupMenu == null) { popupMenu = new JPopupMenu(); } return popupMenu; } public JButton addToToolBar(JToolBar toolbar) { toolbar.add(mainButton); toolbar.add(arrowButton); return mainButton; } public class MenuContainerListener implements ContainerListener { MenuActionListener menuActionListener; public MenuContainerListener() { menuActionListener = new MenuActionListener(); } public void componentAdded(ContainerEvent e) { ((AbstractButton) e.getChild()).addActionListener(menuActionListener); } public void componentRemoved(ContainerEvent e) { ((AbstractButton) e.getChild()).removeActionListener(menuActionListener); } } private class MenuActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { getPopupMenu().insert(mainButton.getAction(), 0); AbstractButton source = (AbstractButton) e.getSource(); getPopupMenu().remove(source); mainButton.setAction(source.getAction()); // mainButton.setText(""); // reset text } } }