ca.mcgill.sable.soot.ui.AbstractOptionsDialog.java Source code

Java tutorial

Introduction

Here is the source code for ca.mcgill.sable.soot.ui.AbstractOptionsDialog.java

Source

/* Soot - a J*va Optimization Framework
 * Copyright (C) 2003 Jennifer Lhotak
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

package ca.mcgill.sable.soot.ui;

import java.util.*;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.*;

import ca.mcgill.sable.soot.SootPlugin;
import ca.mcgill.sable.soot.launching.SavedConfigManager;
import ca.mcgill.sable.soot.launching.SootSavedConfiguration;
import ca.mcgill.sable.soot.testing.*;

public abstract class AbstractOptionsDialog extends TitleAreaDialog implements ISelectionChangedListener {

    private SashForm sashForm;
    private TreeViewer treeViewer;
    private Composite pageContainer;
    private HashMap config;
    private String configName;
    private HashMap editMap;
    private boolean canRun = true;
    private HashMap radioGroups;
    private ArrayList enableGroups;
    private HashMap eclipseDefList;
    private HashMap defList;
    private CheckboxTableViewer tableViewer;
    private Button addButton;
    private Button removeButton;
    private String sootMainClass;
    private String sootMainProject;

    /**
     * Constructor for AbstractOptionsDialog.
     * @param parentShell
     */
    public AbstractOptionsDialog(Shell parentShell) {
        super(parentShell);
        this.setShellStyle(SWT.RESIZE);
    }

    public void addToEclipseDefList(String key, Object val) {
        if (getEclipseDefList() == null) {
            setEclipseDefList(new HashMap());
        }
        getEclipseDefList().put(key, val);

        addToDefList(key, val);

    }

    public void addToDefList(String key, Object val) {
        if (getDefList() == null) {
            setDefList(new HashMap());
        }
        getDefList().put(key, val);

    }

    public boolean isInDefList(String key) {
        if (getDefList().containsKey(key))
            return true;
        else
            return false;
    }

    public boolean getBoolDef(String key) {
        Boolean temp = (Boolean) getDefList().get(key);
        return temp.booleanValue();
    }

    public String getStringDef(String key) {

        return (String) getDefList().get(key);
    }

    public String getArrayDef(String key) {
        String res = "";
        if (getDefList().get(key) instanceof ArrayList) {

            ArrayList list = (ArrayList) getDefList().get(key);
            Iterator it = list.iterator();
            while (it.hasNext()) {
                if (res.equals("")) {
                    res = res + (String) it.next();
                } else {
                    res = res + "\r\n" + (String) it.next();
                }
            }
        } else {
            res = (String) getDefList().get(key);
        }
        return res;
    }

    // This sets the title in the shell that displays the
    // options dialog box
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(Messages.getString("AbstractOptionsDialog.Soot_Options")); //$NON-NLS-1$
    }

    public boolean isEnableButton(String alias) {
        if (alias.equals("enabled"))
            return true;
        return false;
    }

    public void handleWidgetSelected(SelectionEvent e) {

        if (getRadioGroups() != null) {
            Iterator it = getRadioGroups().keySet().iterator();
            while (it.hasNext()) {
                Integer key = (Integer) it.next();
                if (getRadioGroups().get(key) == null)
                    break;
                ArrayList buttons = (ArrayList) getRadioGroups().get(key);
                Iterator itButtons = buttons.iterator();
                while (itButtons.hasNext()) {
                    if (((BooleanOptionWidget) itButtons.next()).getButton().equals(e.getSource())) {
                        switchButtons(buttons, (Button) e.getSource());
                    }
                }
            }
        }

        updateAllEnableGroups();

    }

    public void updateEnableGroup(Button button) {
        if (getEnableGroups() == null)
            return;
        Iterator it = getEnableGroups().iterator();
        while (it.hasNext()) {
            EnableGroup eGroup = (EnableGroup) it.next();
            if (eGroup.getLeader().getButton().equals(button)) {
                // group found
                eGroup.changeControlState(eGroup.getLeader().getButton().getSelection());
                if (eGroup.getControls() != null) {
                    Iterator itCon = eGroup.getControls().iterator();
                    while (itCon.hasNext()) {
                        Object obj = itCon.next();
                        if (obj instanceof BooleanOptionWidget) {
                            updateEnableGroup(((BooleanOptionWidget) obj).getButton());
                        }
                    }
                }
            }
        }
    }

    public void switchButtons(ArrayList buttons, Button change) {
        if (change.getSelection()) {
            Iterator it = buttons.iterator();
            while (it.hasNext()) {
                BooleanOptionWidget nextWidget = (BooleanOptionWidget) it.next();
                if (nextWidget.getButton().equals(change)) {
                    nextWidget.getButton().setSelection(true);
                } else {
                    nextWidget.getButton().setSelection(false);
                }
            }
        } else {
            Iterator it = buttons.iterator();
            while (it.hasNext()) {
                BooleanOptionWidget defWidget = (BooleanOptionWidget) it.next();
                if (defWidget.getData().isDefaultVal()) {
                    defWidget.getButton().setSelection(true);
                } else {
                    defWidget.getButton().setSelection(false);
                }
            }
        }
    }

    protected void makeNewEnableGroup(String phaseAlias) {
        if (getEnableGroups() == null) {
            setEnableGroups(new ArrayList());
        }

        EnableGroup eGroup = new EnableGroup();
        eGroup.setPhaseAlias(phaseAlias);

        getEnableGroups().add(eGroup);
    }

    protected void makeNewEnableGroup(String phaseAlias, String subPhaseAlias) {
        if (getEnableGroups() == null) {
            setEnableGroups(new ArrayList());
        }

        EnableGroup eGroup = new EnableGroup();
        eGroup.setPhaseAlias(phaseAlias);
        eGroup.setSubPhaseAlias(subPhaseAlias);

        getEnableGroups().add(eGroup);
    }

    protected void addToEnableGroup(String phaseAlias, ISootOptionWidget widget, String alias) {
        EnableGroup eGroup = findEnableGroup(phaseAlias);
        if (widget instanceof BooleanOptionWidget) {
            // could be leader
            if (isEnableButton(alias)) {
                eGroup.setLeader(((BooleanOptionWidget) widget));
            } else {
                eGroup.addControl(widget);
            }
        } else {
            eGroup.addControl(widget);
        }
    }

    private EnableGroup findEnableGroup(String phaseAlias) {
        Iterator it = getEnableGroups().iterator();
        while (it.hasNext()) {
            EnableGroup next = (EnableGroup) it.next();
            if (next.getPhaseAlias().equals(phaseAlias) && (next.getSubPhaseAlias() == null))
                return next;
        }
        return null;
    }

    protected void addToEnableGroup(String phaseAlias, String subPhaseAlias, ISootOptionWidget widget,
            String alias) {
        EnableGroup eGroup = findEnableGroup(phaseAlias, subPhaseAlias);
        if (widget instanceof BooleanOptionWidget) {
            // could be leader

            if (isEnableButton(alias)) {
                eGroup.setLeader(((BooleanOptionWidget) widget));
                addToEnableGroup(phaseAlias, widget, "");
            } else {
                eGroup.addControl(widget);
            }
        } else {
            eGroup.addControl(widget);
        }
    }

    private EnableGroup findEnableGroup(String phaseAlias, String subPhaseAlias) {
        Iterator it = getEnableGroups().iterator();
        while (it.hasNext()) {
            EnableGroup next = (EnableGroup) it.next();
            if (next.getSubPhaseAlias() == null)
                continue;
            if (next.getPhaseAlias().equals(phaseAlias) && next.getSubPhaseAlias().equals(subPhaseAlias))
                return next;
        }
        return null;
    }

    protected void updateAllEnableGroups() {
        if (getEnableGroups() == null)
            return;
        Iterator it = getEnableGroups().iterator();

        while (it.hasNext()) {
            EnableGroup eGroup = (EnableGroup) it.next();
            if (eGroup.isPhaseOptType()) {
                if (eGroup.getLeader() == null) {
                    continue;
                }
                if (eGroup.getLeader().getButton().getSelection() && eGroup.getLeader().getButton().isEnabled()) {
                    eGroup.changeControlState(true);
                } else {
                    eGroup.changeControlState(false);
                }
            }
        }

        it = getEnableGroups().iterator();

        while (it.hasNext()) {
            EnableGroup eGroup = (EnableGroup) it.next();
            if (!eGroup.isPhaseOptType()) {
                if (eGroup.getLeader() == null) {
                    continue;
                }
                if (eGroup.getLeader().getButton().getSelection() && eGroup.getLeader().getButton().isEnabled()) {
                    eGroup.changeControlState(true);
                } else {
                    eGroup.changeControlState(false);
                }
            }
        }
    }

    private void printEnableGroups() {
        if (getEnableGroups() == null)
            return;
        Iterator it = getEnableGroups().iterator();
        while (it.hasNext()) {
            EnableGroup eGroup = (EnableGroup) it.next();
            System.out.println(eGroup);
        }
    }

    /**
     * creates a sash form - one side for a selection tree 
     * and the other for the options 
     */
    protected Control createDialogArea(Composite parent) {
        GridData gd;

        Composite dialogComp = (Composite) super.createDialogArea(parent);
        Composite topComp = new Composite(dialogComp, SWT.NONE);

        gd = new GridData(GridData.FILL_BOTH);
        topComp.setLayoutData(gd);
        GridLayout topLayout = new GridLayout();
        topComp.setLayout(topLayout);

        // Set the things that TitleAreaDialog takes care of

        setTitle(Messages.getString("AbstractOptionsDialog.Soot_Launching_Options")); //$NON-NLS-1$ 
        setMessage(""); //$NON-NLS-1$

        // Create the SashForm that contains the selection area on the left,
        // and the edit area on the right
        setSashForm(new SashForm(topComp, SWT.NONE));
        getSashForm().setOrientation(SWT.HORIZONTAL);

        gd = new GridData(GridData.FILL_BOTH);
        getSashForm().setLayoutData(gd);

        Composite selection = createSelectionArea(getSashForm());

        setPageContainer(createEditArea(getSashForm()));

        initializePageContainer();

        // set general as first page
        Control[] pages = getPageContainer().getChildren();
        ((StackLayout) getPageContainer().getLayout()).topControl = pages[0];
        getPageContainer().layout();

        try {
            getSashForm().setWeights(new int[] { 30, 70 });
        } catch (Exception e1) {
            System.out.println(e1.getMessage());
        }

        Label separator = new Label(topComp, SWT.HORIZONTAL | SWT.SEPARATOR);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        separator.setLayoutData(gd);

        dialogComp.layout(true);

        return dialogComp;
    }

    // creates buttons Run and Close for a runnable dialog and
    // buttons Save and Close for a savable one   
    protected void createButtonsForButtonBar(Composite parent) {
        if (isCanRun()) {
            createButton(parent, 1, Messages.getString("AbstractOptionsDialog.Run"), true); //$NON-NLS-1$
            createButton(parent, 2, Messages.getString("AbstractOptionsDialog.Close"), false); //$NON-NLS-1$
        } else {
            createButton(parent, 0, Messages.getString("AbstractOptionsDialog.Save"), true); //$NON-NLS-1$
            createButton(parent, 2, Messages.getString("AbstractOptionsDialog.Close"), false); //$NON-NLS-1$
        }
    }

    protected void buttonPressed(int i) {
        switch (i) {
        case 0: {
            handleSaving();
            break;
        }
        case 1: {
            okPressed();
            break;
        }
        case 2: {
            cancelPressed();
            break;
        }
        }

    }

    protected abstract HashMap savePressed();

    private void handleSaving() {

        saveConfigToMap(this.getConfigName());

        SavedConfigManager scm = new SavedConfigManager();
        scm.setEditMap(getEditMap());
        scm.handleEdits();

        super.okPressed();

    }

    private void saveConfigToMap(String name) {

        SootSavedConfiguration newConfig = new SootSavedConfiguration(name, savePressed());

        newConfig.setEclipseDefs(getEclipseDefList());
        if (getEditMap() == null) {
            setEditMap(new HashMap());
        }

        getEditMap().put(name, newConfig.toSaveArray());

    }

    protected abstract void initializePageContainer();

    protected abstract SootOption getInitialInput();

    /**
     * initialize area containing options as a stack layout
     */
    private Composite createEditArea(Composite parent) {
        Composite editArea = new Composite(parent, SWT.NONE);
        StackLayout layout = new StackLayout();
        editArea.setLayout(layout);
        return editArea;
    }

    /**
     * creates the tree of options sections
     */
    private Composite createSelectionArea(Composite parent) {
        Composite comp = new Composite(parent, SWT.NONE);
        setSelectionArea(comp);

        GridLayout layout = new GridLayout();

        layout.numColumns = 3;
        layout.marginHeight = 0;
        layout.marginWidth = 5;

        comp.setLayout(layout);

        GridData gd = new GridData();

        TreeViewer tree = new TreeViewer(comp);
        gd = new GridData(GridData.FILL_BOTH);
        gd.horizontalSpan = 3;
        gd.widthHint = 0;
        tree.getControl().setLayoutData(gd);

        tree.setContentProvider(new SootOptionsContentProvider());
        tree.setLabelProvider(new SootOptionsLabelProvider());
        tree.setInput(getInitialInput());

        setTreeViewer(tree);

        tree.addSelectionChangedListener(this);

        tree.getControl().addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                handleKeyPressed(e);
            }
        });

        return comp;
    }

    /*
     *  (non-Javadoc)
     * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
     */
    public void selectionChanged(SelectionChangedEvent event) {
        IStructuredSelection selection = (IStructuredSelection) event.getSelection();
        if (!selection.isEmpty()) {
            Object elem = selection.getFirstElement();
            if (elem instanceof SootOption) {
                SootOption sel = (SootOption) elem;
                Control[] children = getPageContainer().getChildren();
                String childTitle = null;
                for (int i = 0; i < children.length; i++) {

                    if (children[i] instanceof Composite) {
                        if (children[i] instanceof Group) {
                            childTitle = (String) ((Group) children[i]).getData("id");

                        }
                        if (childTitle.compareTo(sel.getAlias()) == 0) {
                            ((StackLayout) getPageContainer().getLayout()).topControl = children[i];
                            getPageContainer().layout();

                        } else {
                            children[i].setVisible(false);
                        }
                    }
                }
            }
        }
    }

    public void addOtherBranches(SootOption root) {
        SootOption sootMainClassBranch = new SootOption("Soot Main Class", "sootMainClass");
        root.addChild(sootMainClassBranch);
    }

    public void addOtherPages(Composite parent) {
        Composite mainClassChild = sootMainClassCreate(parent);
    }

    private Composite sootMainClassCreate(Composite parent) {

        Group editGroupSootMainClass = new Group(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        editGroupSootMainClass.setLayout(layout);

        editGroupSootMainClass.setText("Soot Main Class Manager");

        editGroupSootMainClass.setData("id", "sootMainClass");

        {
            //main class widget
            String desc = "Specify main class to run.";
            Label descLabel = new Label(editGroupSootMainClass, SWT.WRAP);
            descLabel.setText(desc);

            String defKey = "sootMainClass";
            String defaultString;

            if (isInDefList(defKey)) {
                defaultString = getStringDef(defKey);
            } else {
                defaultString = "";
            }
            setSootMainClassWidget(
                    new StringOptionWidget(editGroupSootMainClass, SWT.NONE, new OptionData("Soot Main Class", "",
                            "", "sootMainClass", "\nUses specified main class to run Soot.", defaultString)));
        }
        {
            //main project widget
            String desc = "Specify the Java project which the main class resides in.";
            Label descLabel = new Label(editGroupSootMainClass, SWT.WRAP);
            descLabel.setText(desc);

            String defKey = "sootMainProject";
            String defaultString;

            if (isInDefList(defKey)) {
                defaultString = getStringDef(defKey);
                if (defaultString == null)
                    defaultString = "";
            } else {
                defaultString = "";
            }
            setSootMainProjectWidget(
                    new StringOptionWidget(editGroupSootMainClass, SWT.NONE, new OptionData("Soot Main Project", "",
                            "", "sootMainProject", "\nThe Java project holding the main class.", defaultString)));
        }

        return editGroupSootMainClass;
    }

    private StringOptionWidget sootMainClassWidget, sootMainProjectWidget;

    private void setPageContainer(Composite comp) {
        pageContainer = comp;
    }

    protected Composite getPageContainer() {
        return pageContainer;
    }

    /**
     * Returns the sashForm.
     * @return SashForm
     */
    private SashForm getSashForm() {
        return sashForm;
    }

    /**
     * Sets the sashForm.
     * @param sashForm The sashForm to set
     */
    private void setSashForm(SashForm sashForm) {
        this.sashForm = sashForm;
    }

    protected void handleKeyPressed(KeyEvent event) {
    }

    private Composite selectionArea;

    private void setSelectionArea(Composite comp) {
        selectionArea = comp;
    }

    private Composite getSelectionArea() {
        return selectionArea;
    }

    private void setTreeViewer(TreeViewer tree) {
        treeViewer = tree;
    }

    private TreeViewer getTreeViewer() {
        return treeViewer;
    }

    /**
     * Returns the defList.
     * @return HashMap
     */
    public HashMap getDefList() {
        return defList;
    }

    /**
     * Sets the defList.
     * @param defList The defList to set
     */
    public void setDefList(HashMap defList) {
        this.defList = defList;
    }

    /**
     * Returns the config.
     * @return HashMap
     */
    public HashMap getConfig() {
        return config;
    }

    /**
     * Sets the config.
     * @param config The config to set
     */
    public void setConfig(HashMap config) {
        this.config = config;
    }

    /**
     * Returns the configName.
     * @return String
     */
    public String getConfigName() {
        return configName;
    }

    /**
     * Sets the configName.
     * @param configName The configName to set
     */
    public void setConfigName(String configName) {
        this.configName = configName;
    }

    /**
     * Returns the eclipseDefList.
     * @return HashMap
     */
    public HashMap getEclipseDefList() {
        return eclipseDefList;
    }

    /**
     * Sets the eclipseDefList.
     * @param eclipseDefList The eclipseDefList to set
     */
    public void setEclipseDefList(HashMap eclipseDefList) {
        this.eclipseDefList = eclipseDefList;
    }

    /**
     * Returns the editMap.
     * @return HashMap
     */
    public HashMap getEditMap() {
        return editMap;
    }

    /**
     * Sets the editMap.
     * @param editMap The editMap to set
     */
    public void setEditMap(HashMap editMap) {
        this.editMap = editMap;
    }

    /**
     * Returns the canRun.
     * @return boolean
     */
    public boolean isCanRun() {
        return canRun;
    }

    /**
     * Sets the canRun.
     * @param canRun The canRun to set
     */
    public void setCanRun(boolean canRun) {
        this.canRun = canRun;
    }

    /**
     * @return
     */
    public HashMap getRadioGroups() {
        return radioGroups;
    }

    /**
     * @param map
     */
    public void setRadioGroups(HashMap map) {
        radioGroups = map;
    }

    /**
     * @return
     */
    public ArrayList getEnableGroups() {
        return enableGroups;
    }

    /**
     * @param map
     */
    public void setEnableGroups(ArrayList list) {
        enableGroups = list;
    }

    /**
     * @return
     */
    public Button getAddButton() {
        return addButton;
    }

    /**
     * @return
     */
    public Button getRemoveButton() {
        return removeButton;
    }

    /**
     * @param button
     */
    public void setAddButton(Button button) {
        addButton = button;
    }

    /**
     * @param button
     */
    public void setRemoveButton(Button button) {
        removeButton = button;
    }

    /**
     * @return
     */
    public CheckboxTableViewer getTableViewer() {
        return tableViewer;
    }

    /**
     * @param viewer
     */
    public void setTableViewer(CheckboxTableViewer viewer) {
        tableViewer = viewer;
    }

    /**
     * @return
     */
    public StringOptionWidget getSootMainClassWidget() {
        return sootMainClassWidget;
    }

    /**
     * @param widget
     */
    public void setSootMainClassWidget(StringOptionWidget widget) {
        sootMainClassWidget = widget;
    }

    /**
     * @return
     */
    public StringOptionWidget getSootMainProjectWidget() {
        return sootMainProjectWidget;
    }

    /**
     * @param widget
     */
    public void setSootMainProjectWidget(StringOptionWidget widget) {
        sootMainProjectWidget = widget;
    }

    /**
     * @return
     */
    public String getSootMainClass() {
        if (sootMainProject != null && sootMainProject.length() > 0) {
            return sootMainProject + ":" + sootMainClass;
        } else {
            return sootMainClass;
        }
    }

    /**
     * @param string
     */
    public void setSootMainClass(String string) {
        sootMainClass = string;
    }

    /**
     * @param projectName
     * @return 
     */
    public boolean setSootMainProject(String projectName) {
        if (projectName == null || projectName.length() == 0) {
            sootMainProject = null;
            return true;
        }
        IProject project = SootPlugin.getWorkspace().getRoot().getProject(projectName);
        try {
            if (project.exists() && project.isOpen() && project.hasNature("org.eclipse.jdt.core.javanature")) {
                sootMainProject = projectName;
            }
        } catch (CoreException e) {
            e.printStackTrace();
        }
        return sootMainProject != null;
    }

}