blob: cafd9b6fd708f714adcd9c007e952132c58742f3 [file] [log] [blame]
/*
* Copyright 2000-2009 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 com.intellij.ui.tabs.impl;
import com.intellij.ide.DataManager;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.ex.ActionUtil;
import com.intellij.openapi.keymap.KeymapUtil;
import com.intellij.openapi.ui.popup.IconButton;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Pass;
import com.intellij.ui.InplaceButton;
import com.intellij.ui.tabs.TabInfo;
import com.intellij.util.ui.TimedDeadzone;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
class ActionButton extends IconButton implements ActionListener {
private final InplaceButton myButton;
private Presentation myPrevPresentation;
private final AnAction myAction;
private final String myPlace;
private final TabInfo myTabInfo;
private final JBTabsImpl myTabs;
private boolean myAutoHide;
private boolean myToShow;
public ActionButton(JBTabsImpl tabs, TabInfo tabInfo, AnAction action, String place, Pass<MouseEvent> pass, TimedDeadzone.Length deadzone) {
super(null, action.getTemplatePresentation().getIcon());
myTabs = tabs;
myTabInfo = tabInfo;
myAction = action;
myPlace = place;
myButton = new InplaceButton(this, this, pass, deadzone) {
@Override
protected void doRepaintComponent(Component c) {
repaintComponent(c);
}
};
myButton.setVisible(false);
}
public InplaceButton getComponent() {
return myButton;
}
protected void repaintComponent(Component c) {
c.repaint();
}
public void setMouseDeadZone(TimedDeadzone.Length deadZone) {
myButton.setMouseDeadzone(deadZone);
}
public boolean update() {
AnActionEvent event = createAnEvent(null, 0);
if (event == null) return false;
myAction.update(event);
Presentation p = event.getPresentation();
boolean changed = !areEqual(p, myPrevPresentation);
setIcons(p.getIcon(), p.getDisabledIcon(), p.getHoveredIcon());
if (changed) {
myButton.setIcons(this);
String tooltipText = KeymapUtil.createTooltipText(p.getText(), myAction);
myButton.setToolTipText(tooltipText.length() > 0 ? tooltipText : null);
myButton.setVisible(p.isEnabled() && p.isVisible());
}
myPrevPresentation = p;
return changed;
}
private static boolean areEqual(Presentation p1, Presentation p2) {
if (p1 == null || p2 == null) return false;
return Comparing.equal(p1.getText(), p2.getText())
&& Comparing.equal(p1.getIcon(), p2.getIcon())
&& Comparing.equal(p1.getHoveredIcon(), p2.getHoveredIcon())
&& p1.isEnabled() == p2.isEnabled()
&& p1.isVisible() == p2.isVisible();
}
public void actionPerformed(final ActionEvent e) {
AnActionEvent event = createAnEvent(null, e.getModifiers());
if (event != null && ActionUtil.lastUpdateAndCheckDumb(myAction, event, true)) {
ActionUtil.performActionDumbAware(myAction, event);
}
}
@Nullable
private AnActionEvent createAnEvent(InputEvent e, final int modifiers) {
Presentation presentation = myAction.getTemplatePresentation().clone();
DataContext context = DataManager.getInstance().getDataContext(myTabInfo.getComponent());
return new AnActionEvent(e, context, myPlace != null ? myPlace : ActionPlaces.UNKNOWN, presentation, myTabs.myActionManager, modifiers);
}
public void setAutoHide(final boolean autoHide) {
myAutoHide = autoHide;
if (!myToShow) {
toggleShowActions(false);
}
}
public void toggleShowActions(boolean show) {
if (myAutoHide) {
myButton.setPainting(show);
} else {
myButton.setPainting(true);
}
myToShow = show;
}
}