blob: e3496b8dd654ef346daaa8938356199ab628fd2f [file] [log] [blame]
/*
* Copyright 2000-2014 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.openapi.actionSystem.impl;
import com.intellij.ide.DataManager;
import com.intellij.ide.impl.DataManagerImpl;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.ex.ActionManagerEx;
import com.intellij.openapi.actionSystem.ex.ActionUtil;
import com.intellij.openapi.application.ModalityState;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
/**
* extended by fabrique
*/
public class ButtonToolbarImpl extends JPanel {
private final DataManager myDataManager;
private final String myPlace;
private final PresentationFactory myPresentationFactory;
private final ArrayList<ActionJButton> myActions = new ArrayList<ActionJButton>();
public ButtonToolbarImpl(final String place,
@NotNull ActionGroup actionGroup,
DataManager dataManager,
ActionManagerEx actionManager) {
super(new GridBagLayout());
myPlace = place;
myPresentationFactory = new PresentationFactory();
myDataManager = dataManager;
initButtons(actionGroup);
updateActions();
//
actionManager.addTimerListener(500, new WeakTimerListener(actionManager, new MyTimerListener()));
enableEvents(MouseEvent.MOUSE_MOTION_EVENT_MASK | MouseEvent.MOUSE_EVENT_MASK);
}
private void initButtons(@NotNull ActionGroup actionGroup) {
final AnAction[] actions = actionGroup.getChildren(null);
if (actions.length > 0) {
int gridx = 0;
add(// left strut
Box.createHorizontalGlue(),
new GridBagConstraints(gridx++, 0, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
new Insets(8, 0, 0, 0), 0, 0));
if (actions.length > 0) {
JPanel buttonsPanel = createButtons(actions);
//noinspection UnusedAssignment
add(buttonsPanel,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE,
new Insets(8, 0, 0, 0), 0, 0));
}
}
}
private JPanel createButtons(AnAction[] actions) {
JPanel buttonsPanel = new JPanel(new GridLayout(1, actions.length, 5, 0));
for (final AnAction action : actions) {
ActionJButton button = new ActionJButton(action);
myActions.add(button);
buttonsPanel.add(button);
}
return buttonsPanel;
}
public JComponent getComponent() {
return this;
}
private class ActionJButton extends JButton {
private final AnAction myAction;
public ActionJButton(final AnAction action) {
super(action.getTemplatePresentation().getText());
myAction = action;
setMnemonic(action.getTemplatePresentation().getMnemonic());
setDisplayedMnemonicIndex(action.getTemplatePresentation().getDisplayedMnemonicIndex());
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
AnActionEvent event = new AnActionEvent(
null,
((DataManagerImpl)myDataManager).getDataContextTest(ButtonToolbarImpl.this),
myPlace,
myPresentationFactory.getPresentation(action),
ActionManager.getInstance(),
e.getModifiers()
);
if (ActionUtil.lastUpdateAndCheckDumb(action, event, false)) {
ActionUtil.performActionDumbAware(action, event);
}
}
});
}
public void updateAction(final DataContext dataContext) {
AnActionEvent event = new AnActionEvent(
null,
dataContext,
myPlace,
myPresentationFactory.getPresentation(myAction),
ActionManager.getInstance(),
0
);
event.setInjectedContext(myAction.isInInjectedContext());
myAction.update(event);
setVisible(event.getPresentation().isVisible());
setEnabled(event.getPresentation().isEnabled());
}
}
private final class MyTimerListener implements TimerListener {
public ModalityState getModalityState() {
return ModalityState.stateForComponent(ButtonToolbarImpl.this);
}
public void run() {
if (!isShowing()) {
return;
}
Window mywindow = SwingUtilities.windowForComponent(ButtonToolbarImpl.this);
if (mywindow != null && !mywindow.isActive()) return;
// do not update when a popup menu is shown (if popup menu contains action which is also in the toolbar, it should not be enabled/disabled)
final MenuSelectionManager menuSelectionManager = MenuSelectionManager.defaultManager();
final MenuElement[] selectedPath = menuSelectionManager.getSelectedPath();
if (selectedPath.length > 0) {
return;
}
// don't update toolbar if there is currently active modal dialog
final Window window = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow();
if (window instanceof Dialog) {
final Dialog dialog = (Dialog)window;
if (dialog.isModal() && !SwingUtilities.isDescendingFrom(ButtonToolbarImpl.this, dialog)) {
return;
}
}
updateActions();
}
}
public void updateActions() {
final DataContext dataContext = ((DataManagerImpl)myDataManager).getDataContextTest(this);
for (ActionJButton action : myActions) {
action.updateAction(dataContext);
}
repaint();
}
}