Package de.tobject.findbugs.classify

Source Code of de.tobject.findbugs.classify.SeverityClassificationPulldownAction

/*
* Created on Feb 8, 2005
*/
package de.tobject.findbugs.classify;

import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuAdapter;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowPulldownDelegate2;

import de.tobject.findbugs.reporter.MarkerUtil;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugProperty;

/**
* Pulldown menu action for classifying warning severity.
*
* @author David Hovemeyer
*/
public class SeverityClassificationPulldownAction implements IWorkbenchWindowPulldownDelegate2 {

    private Menu menu;

    private MenuItem[] severityItemList;

    private BugInstance bugInstance;

    private static final String[] SEVERITY_LABEL_LIST = { "1 (Least Severe)", "2", "3", "4", "5 (Most Severe)" };

    /*
     * (non-Javadoc)
     *
     * @see
     * org.eclipse.ui.IWorkbenchWindowPulldownDelegate2#getMenu(org.eclipse.
     * swt.widgets.Menu)
     */
    public Menu getMenu(Menu parent) {
        return null;
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.eclipse.ui.IWorkbenchWindowPulldownDelegate#getMenu(org.eclipse.swt
     * .widgets.Control)
     */
    public Menu getMenu(Control parent) {
        if (menu == null) {
            menu = new Menu(parent);
            fillMenu();
        }
        return menu;
    }

    /**
     * Fill the drop-down menu. We allow the user to choose a severity from 1
     * (least severe) to 5 (most severe). Default is 3.
     */
    private void fillMenu() {
        // Create a selection listener to handle when the
        // user selects a warning severity.
        SelectionListener menuItemSelectionListener = new SelectionAdapter() {
            /*
             * (non-Javadoc)
             *
             * @see
             * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
             * .swt.events.SelectionEvent)
             */
            @Override
            public void widgetSelected(SelectionEvent e) {
                Widget w = e.widget;
                int index;
                for (index = 0; index < severityItemList.length; ++index) {
                    if (w == severityItemList[index]) {
                        break;
                    }
                }

                if (index < severityItemList.length) {
                    if (bugInstance != null) {
                        bugInstance.setProperty(BugProperty.SEVERITY, String.valueOf(index + 1));
                    }
                }
            }
        };

        severityItemList = new MenuItem[SEVERITY_LABEL_LIST.length];
        for (int i = 0; i < SEVERITY_LABEL_LIST.length; ++i) {
            MenuItem menuItem = new MenuItem(menu, SWT.RADIO);
            menuItem.setText(SEVERITY_LABEL_LIST[i]);
            menuItem.addSelectionListener(menuItemSelectionListener);

            severityItemList[i] = menuItem;
        }

        // Keep menu in sync with current BugInstance.
        menu.addMenuListener(new MenuAdapter() {
            /*
             * (non-Javadoc)
             *
             * @see
             * org.eclipse.swt.events.MenuAdapter#menuShown(org.eclipse.swt.
             * events.MenuEvent)
             */
            @Override
            public void menuShown(MenuEvent e) {
                syncMenu();
            }
        });
    }

    /**
     * Synchronize the menu with the current BugInstance.
     */
    private void syncMenu() {
        if (bugInstance != null) {
            BugProperty severityProperty = bugInstance.lookupProperty(BugProperty.SEVERITY);
            if (severityProperty != null) {
                try {
                    int severity = severityProperty.getValueAsInt();
                    if (severity > 0 && severity <= severityItemList.length) {
                        selectSeverity(severity);
                        return;
                    }
                } catch (NumberFormatException e) {
                    // Ignore: we'll allow the user to select a valid severity
                }
            }

            // We didn't get a valid severity from the BugInstance.
            // So, leave the menu items enabled but cleared, so
            // the user can select a severity.
            resetMenuItems(true);
        } else {
            // No BugInstance - disable all menu items.
            resetMenuItems(false);
        }
    }

    /**
     * Set the menu to given severity level.
     *
     * @param severity
     *            the severity level (1..5)
     */
    private void selectSeverity(int severity) {
        // Severity is 1-based, but the menu item list is 0-based
        int index = severity - 1;

        for (int i = 0; i < severityItemList.length; ++i) {
            MenuItem menuItem = severityItemList[i];
            menuItem.setEnabled(true);
            menuItem.setSelection(i == index);
        }
    }

    /**
     * Reset menu items so they are unchecked.
     *
     * @param enable
     *            true if menu items should be enabled, false if they should be
     *            disabled
     */
    private void resetMenuItems(boolean enable) {
        for (int i = 0; i < severityItemList.length; ++i) {
            MenuItem menuItem = severityItemList[i];
            menuItem.setEnabled(enable);
            menuItem.setSelection(false);
        }
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
     */
    public void dispose() {
        if (menu != null) {
            menu.dispose();
            menu = null;
        }
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.
     * IWorkbenchWindow)
     */
    public void init(IWorkbenchWindow window) {
        // noop
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
     */
    public void run(IAction action) {
        // TODO: open classification dialog
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action
     * .IAction, org.eclipse.jface.viewers.ISelection)
     */
    public void selectionChanged(IAction action, ISelection selection) {
        bugInstance = null;
        // TODO learn to deal with ALL elements
        IMarker marker = MarkerUtil.getMarkerFromSingleSelection(selection);
        if (marker == null) {
            return;
        }
        bugInstance = MarkerUtil.findBugInstanceForMarker(marker);
    }

}
TOP

Related Classes of de.tobject.findbugs.classify.SeverityClassificationPulldownAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.