/*
* #%L
* gitools-ui-platform
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.core.actions;
import com.alee.global.StyleConstants;
import com.alee.laf.button.WebButton;
import com.alee.laf.toolbar.ToolbarStyle;
import com.alee.laf.toolbar.WebToolBar;
import com.alee.managers.language.data.TooltipWay;
import com.alee.managers.tooltip.TooltipManager;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class ActionSetUtils {
public static JToolBar createToolBar(ActionSet actionSet) {
WebToolBar toolBar = new WebToolBar(JToolBar.HORIZONTAL);
toolBar.setFloatable(false);
toolBar.setToolbarStyle(ToolbarStyle.attached);
return createToolBar(toolBar, actionSet);
}
private static JToolBar createToolBar(JToolBar toolBar, ActionSet actionSet) {
for (BaseAction a : actionSet.getActions()) {
if (a instanceof SeparatorAction) {
toolBar.addSeparator();
} else if (a instanceof IPanelAction) {
toolBar.add(((IPanelAction) a).getPanel());
} else {
toolBar.add(createActionButton(a));
}
}
return toolBar;
}
public static JComponent createActionButton(BaseAction a) {
WebButton button = WebButton.createIconWebButton(a.getSmallIcon(), StyleConstants.smallRound, true);
button.setAction(a);
button.addActionListener(new TrackingListener("ToolBar", a));
button.setHideActionText(true);
TooltipManager.setTooltip(button, a.getDesc(), TooltipWay.down, 0);
button.setFocusable(false);
button.setRequestFocusEnabled(false);
return button;
}
public static JPopupMenu createPopupMenu(ActionSet actionSet) {
JPopupMenu popupMenu = new JPopupMenu();
for (BaseAction a : actionSet.getActions()) {
if (a instanceof SeparatorAction) {
popupMenu.addSeparator();
} else if (a instanceof PopupSectionTitleAction) {
popupMenu.add(createHeader(a));
} else {
popupMenu.add(createPopupMenuItem(a));
}
}
return popupMenu;
}
private static JMenuItem createPopupMenuItem(BaseAction a) {
JMenuItem item = new JMenuItem(a) {
public void setToolTipText(String text) {
// Ignore! Actions (e.g. undo/redo) set this when changing
// their text due to changing enabled state.
}
};
item.addActionListener(new TrackingListener("PopupMenu", a));
item.setAccelerator(null);
return item;
}
private static JLabel createHeader(BaseAction a) {
JLabel label = new JLabel(a.getName());
label.setFont(label.getFont().deriveFont(10f));
label.setForeground(Color.gray);
label.setHorizontalAlignment(SwingConstants.RIGHT);
label.setHorizontalTextPosition(SwingConstants.RIGHT);
label.setBorder(BorderFactory.createEmptyBorder(5,0,0,10));
label.setSize(new Dimension(125, 14));
return label;
}
public static JMenuBar createMenuBar(ActionSet actionSet) {
JMenuBar menuBar = new JMenuBar();
for (BaseAction a : actionSet.getActions()) {
menuBar.add(createMenu(a));
}
return menuBar;
}
private static JMenu createMenu(BaseAction action) {
if (action instanceof DynamicActionSet) {
return ((DynamicActionSet) action).createJMenu();
}
JMenu menu = new JMenu(action);
List<BaseAction> actions = ((ActionSet) action).getActions();
for (BaseAction a : actions) {
if (a instanceof SeparatorAction) {
menu.addSeparator();
} else if (a instanceof ActionSet) {
menu.add(createMenu(a));
} else {
JMenuItem item = new JMenuItem(a);
item.addActionListener(new TrackingListener("MainMenu", a));
menu.add(item);
}
}
return menu;
}
private static class TrackingListener implements ActionListener {
private String source;
private BaseAction action;
public TrackingListener(String source, BaseAction action) {
super();
this.source = source;
this.action = action;
}
@Override
public void actionPerformed(ActionEvent e) {
action.track("action", source);
}
}
}