/* * Copyright 2000-2006 JetBrains s.r.o. * * Licensed 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 jetbrains.communicator.idea.actions; import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.project.Project; import com.intellij.util.ui.JBUI; import jetbrains.communicator.util.icons.CompositeIcon; import javax.swing.*; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * @author Kir */ public class DropDownButton extends JButton { private boolean myForcePressed; private final ActionGroup myActionGroup; public DropDownButton(ActionGroup actionGroup, Icon buttonIcon) { if (actionGroup == null) { actionGroup = new DefaultActionGroup(); } myActionGroup = actionGroup; CompositeIcon icon = new CompositeIcon(); icon.addIcon(buttonIcon); if (hasSeveralActions()) { icon.addIcon(AllIcons.General.ComboArrow); setModel(new MyButtonModel()); } setIcon(icon); setMargin(JBUI.emptyInsets()); setHorizontalAlignment(JButton.LEFT); setFocusable(false); addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { if (hasSeveralActions()) { showPopup(); } else { AnAction[] children = myActionGroup.getChildren(null); if (children.length > 0 && canExecute(children[0])) { children[0].actionPerformed(null); } } } } ); } private boolean canExecute(AnAction action1) { Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(this)); return !(action1 instanceof BaseAction) || ((BaseAction) action1).getCommand(BaseAction.getContainer(project)).isEnabled(); } private boolean hasSeveralActions() { return myActionGroup.getChildren(null).length > 1; } public void showPopup() { ActionPopupMenu menu = ActionManager.getInstance().createActionPopupMenu("POPUP", myActionGroup); JPopupMenu menuComponent = menu.getComponent(); menuComponent.addPopupMenuListener( new PopupMenuListener() { public void popupMenuWillBecomeVisible(PopupMenuEvent e) {} public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { myForcePressed = false; repaint(); } public void popupMenuCanceled(PopupMenuEvent e) {} } ); repaint(); myForcePressed = true; menuComponent.show(this, 0, getHeight()); } public static JComponent wrap(final DropDownButton optionsButton) { JPanel panel = new JPanel() { public Dimension getPreferredSize() { Dimension preferredSize = optionsButton.getPreferredSize(); preferredSize.height += 2; return preferredSize; } public Dimension getMinimumSize() { return getPreferredSize(); } public void doLayout() { super.doLayout(); optionsButton.setLocation(0, 2); optionsButton.setSize(getWidth(), getHeight() - 4); } }; panel.setLayout(null); panel.add(optionsButton); return panel; } protected class MyButtonModel extends DefaultButtonModel { public boolean isPressed() { return myForcePressed || super.isPressed(); } public boolean isArmed() { return myForcePressed || super.isArmed(); } } }