blob: c3da79a1e69960fb40260bf6b552c07b967b68fa [file] [log] [blame]
/*
* 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 org.netbeans.modules.gsf.codecoverage;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import org.netbeans.api.project.Project;
import org.netbeans.modules.gsf.codecoverage.api.CoverageProvider;
import org.openide.awt.Actions;
import org.openide.util.ContextAwareAction;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.util.actions.Presenter;
// TODO - ShowMenu extends AbstractAction implements DynamicMenuContent {
// See ShowMenu.java in mercurial for simpler way to do this
public final class CoverageAction extends AbstractAction implements ContextAwareAction {
private static final int ACTION_TOGGLE_COLLECT = 1;
private static final int ACTION_TOGGLE_AGGREGATION = 2;
private static final int ACTION_CLEAR_RESULTS = 3;
private static final int ACTION_SHOW_REPORT = 4;
private static final int ACTION_TOGGLE_EDITORBAR = 5;
private final Action configureAction;
private final Action[] extraActions;
public CoverageAction(Action configureAction, Action[] extraActions) {
super();
this.configureAction = configureAction;
this.extraActions = extraActions;
}
@Override
public void actionPerformed(ActionEvent e) {
assert false : "Action should never be called without a context";
}
@Override
public Action createContextAwareInstance(Lookup actionContext) {
return new ContextAction(actionContext, configureAction, extraActions);
}
/**
* Create the submenu.
*/
private static JMenu createMenu(Project project, Action configureAction, Action[] extraActions) {
return new LazyMenu(project, configureAction, extraActions);
}
/**
* Build up a nested menu of migration tasks for the given project
*/
static void buildMenu(JMenu menu, Project project, Action configureAction, Action[] extraActions) {
boolean enabled = true;
if (configureAction != null && configureAction.isEnabled()) {
enabled = false;
JMenuItem menuitem
= new JMenuItem((String) configureAction.getValue(Action.NAME));
menuitem.addActionListener(configureAction);
menu.add(menuitem);
menu.addSeparator();
// Disable all the other actions
enabled = false;
}
CoverageManagerImpl manager = CoverageManagerImpl.getInstance();
boolean selected = manager.isEnabled(project);
JMenuItem menuitem = new JCheckBoxMenuItem(NbBundle.getMessage(CoverageAction.class, "LBL_CollectCoverageAction"), selected);
menuitem.addActionListener(new CoverageItemHandler(project, ACTION_TOGGLE_COLLECT));
if (!enabled) {
menuitem.setEnabled(false);
}
menu.add(menuitem);
CoverageProvider provider = CoverageManagerImpl.getProvider(project);
if (provider == null) {
return;
}
boolean on = provider.isEnabled();
if (provider.supportsAggregation()) {
menu.addSeparator();
boolean aggregating = manager.isAggregating(project);
menuitem = new JCheckBoxMenuItem(NbBundle.getMessage(CoverageAction.class, "LBL_AggregateResults"), aggregating);
menuitem.addActionListener(new CoverageItemHandler(project, ACTION_TOGGLE_AGGREGATION));
if (!enabled || !on) {
menuitem.setEnabled(false);
}
menu.add(menuitem);
}
menuitem = new JMenuItem(NbBundle.getMessage(CoverageAction.class, "LBL_ClearResultsAction"));
menuitem.addActionListener(new CoverageItemHandler(project, ACTION_CLEAR_RESULTS));
if (!enabled || !on) {
menuitem.setEnabled(false);
}
menu.add(menuitem);
menu.addSeparator();
menuitem = new JMenuItem(NbBundle.getMessage(CoverageAction.class,
"LBL_ShowReportAction"));
menuitem.addActionListener(new CoverageItemHandler(project, ACTION_SHOW_REPORT));
//menuitem.setToolTipText(target.getDescription());
if (!enabled || !on) {
menuitem.setEnabled(false);
}
menu.add(menuitem);
menu.addSeparator();
menuitem = new JCheckBoxMenuItem(NbBundle.getMessage(CoverageAction.class, "LBL_ShowEditorBar"),
manager.getShowEditorBar());
menuitem.addActionListener(new CoverageItemHandler(project, ACTION_TOGGLE_EDITORBAR));
if (!enabled || !on) {
menuitem.setEnabled(false);
}
menu.add(menuitem);
menu.add(menuitem);
if (extraActions != null && extraActions.length > 0) {
menu.addSeparator();
for (Action action : extraActions) {
String name = (String) action.getValue(Action.NAME);
// JDK6 only - Action.SELECTED_KEY
//Boolean sel = (Boolean) action.getValue(Action.SELECTED_KEY);
String SELECTED_KEY = "SwingSelectedKey";
Boolean sel = (Boolean) action.getValue(SELECTED_KEY);
if (sel != null) { // NOI18N
menuitem = new JCheckBoxMenuItem(name, sel);
} else {
menuitem = new JMenuItem(name);
}
menuitem.addActionListener(configureAction);
if (!enabled || !on) {
menuitem.setEnabled(false);
}
menu.add(menuitem);
}
}
}
/**
* The particular instance of this action for a given project.
*/
private static final class ContextAction extends AbstractAction implements Presenter.Popup {
private final Project project;
private final Action configureAction;
private final Action[] extraActions;
public ContextAction(Lookup lkp, Action configureAction, Action[] extraActions) {
super(NbBundle.getMessage(CoverageAction.class, "LBL_CodeCoverage"));
this.configureAction = configureAction;
this.extraActions = extraActions;
Collection<? extends Project> apcs = lkp.lookupAll(Project.class);
if (apcs.size() == 1) {
project = apcs.iterator().next();
} else {
project = null;
}
super.setEnabled(project != null);
}
@Override
public void actionPerformed(ActionEvent e) {
assert false : "Action should not be called directly";
}
@Override
public JMenuItem getPopupPresenter() {
if (project != null) {
return createMenu(project, configureAction, extraActions);
} else {
return new Actions.MenuItem(this, false);
}
}
@Override
public void setEnabled(boolean b) {
assert false : "No modifications to enablement status permitted";
}
}
private static final class LazyMenu extends JMenu {
private final Project project;
private boolean initialized = false;
private final Action configureAction;
private final Action[] extraActions;
public LazyMenu(Project project, Action configureAction, Action[] extraActions) {
super(NbBundle.getMessage(CoverageAction.class, "LBL_CodeCoverage"));
this.project = project;
this.configureAction = configureAction;
this.extraActions = extraActions;
}
@Override
public JPopupMenu getPopupMenu() {
if (!initialized) {
initialized = true;
super.removeAll();
buildMenu(this, project, configureAction, extraActions);
}
return super.getPopupMenu();
}
}
/**
* Action handler for a menu item representing one target.
*/
private static final class CoverageItemHandler implements ActionListener {
private final Project project;
private final int action;
public CoverageItemHandler(Project project, int action) {
this.project = project;
this.action = action;
}
@Override
public void actionPerformed(ActionEvent ev) {
CoverageManagerImpl manager = CoverageManagerImpl.getInstance();
switch (action) {
case ACTION_TOGGLE_COLLECT: {
boolean enabled = ((JCheckBoxMenuItem) ev.getSource()).isSelected();
manager.setEnabled(project, enabled);
break;
}
case ACTION_TOGGLE_AGGREGATION: {
boolean enabled = ((JCheckBoxMenuItem) ev.getSource()).isSelected();
manager.setAggregating(project, enabled);
break;
}
case ACTION_SHOW_REPORT: {
manager.showReport(project);
break;
}
case ACTION_CLEAR_RESULTS: {
manager.clear(project);
break;
}
case ACTION_TOGGLE_EDITORBAR: {
boolean enabled = ((JCheckBoxMenuItem) ev.getSource()).isSelected();
manager.setShowEditorBar(enabled);
break;
}
}
}
}
}