org.gw4e.eclipse.launching.offline.GW4ELaunchConfigurationTab.java Source code

Java tutorial

Introduction

Here is the source code for org.gw4e.eclipse.launching.offline.GW4ELaunchConfigurationTab.java

Source

package org.gw4e.eclipse.launching.offline;

/*-
 * #%L
 * gw4e
 * $Id:$
 * $HeadURL:$
 * %%
 * Copyright (C) 2017 gw4e-project
 * %%
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 * #L%
 */

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.gw4e.eclipse.builder.BuildPolicy;
import org.gw4e.eclipse.facade.GraphWalkerContextManager;
import org.gw4e.eclipse.facade.GraphWalkerFacade;
import org.gw4e.eclipse.facade.JDTManager;
import org.gw4e.eclipse.facade.ResourceManager;
import org.gw4e.eclipse.launching.ui.ModelData;
import org.gw4e.eclipse.launching.ui.ModelPathGenerator;
import org.gw4e.eclipse.message.MessageUtil;
import org.gw4e.eclipse.preferences.PreferenceManager;

/**
 * Launch configuration tab used to specify the GraphWalker Parameters for the
 * offline command
 *
 */
public class GW4ELaunchConfigurationTab extends AbstractLaunchConfigurationTab implements LaunchingConstant {

    private Label fProjLabel;
    private Text fProjText;
    private Button fProjButton;
    private Button fModelButton;
    private Label fModelLabel;
    private Text fModelText;

    private Button fVerbosedButton;
    private Button fRemoveBlockedElementsButton;

    private Button fPrintUnvisitedButton;
    private Text fStartNodeText;

    public static String GW4E_LAUNCH_CONFIGURATION_CONTROL_ID = "gw4e.launch.configuration.control.id";

    public static String GW4E_BROWSER_BUTTON_ID_PROJECT = "gw4e.launch.configuration.browse.button.id.project";
    public static String GW4E_LAUNCH_CONFIGURATION_BUTTON_ID_PRINT_UNVISITED = "gw4e.launch.configuration.browse.button.id.printunvisited";
    public static String GW4E_LAUNCH_CONFIGURATION_BUTTON_ID_VERBOSE = "gw4e.launch.configuration.browse.button.id.verbose";
    public static String GW4E_LAUNCH_CONFIGURATION_BUTTON_ID_REMOVE_BLOCKED_ELEMENTS = "gw4e.launch.configuration.browse.button.id.remove.blocked.elements";
    public static String GW4E_LAUNCH_CONFIGURATION_BROWSER_BUTTON_ID_METHOD = "gw4e.launch.configuration.browse.button.id.model";
    public static String GW4E_LAUNCH_CONFIGURATION_TEXT_ID_START_ELEMENT = "gw4e.launch.configuration.text.id.start.element";
    public static String GW4E_LAUNCH_CONFIGURATION_TEXT_ID_GENERATOR = "gw4e.launch.configuration.text.id.generator";

    public static String GW4E_LAUNCH_CONFIGURATION_TEXT_ID_PROJECT = "gw4e.launch.configuration.text.id.project";
    public static String GW4E_LAUNCH_CONFIGURATION_TEXT_ID_MODEL = "gw4e.launch.configuration.text.id.model";
    public static String GW4E_LAUNCH_CONFIGURATION_COMBO_PATH_GENERATOR_ID_MODEL = "gw4e.launch.configuration.combo.path.generator.id.model";

    private Composite parent_1;
    GridData gd;
    private Composite composite;
    private Composite composite_1;
    private Button hintButton;
    private Button filterGraphmlButton;
    private Composite composite_2;
    private Composite composite_3;
    private Label lblPathGenerator;
    private Combo combo;
    private ComboViewer comboViewer;
    private Label lblNewLabel_1;
    private ModelPathGenerator mpg;

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.
     * swt.widgets.Composite)
     */
    /**
     * @wbp.parser.entryPoint
     */
    @Override
    public void createControl(Composite p) {
        parent_1 = new Composite(p, SWT.NONE);
        setControl(parent_1);

        GridLayout gl_parent_1 = new GridLayout();
        gl_parent_1.numColumns = 3;
        parent_1.setLayout(gl_parent_1);

        createAllSections(parent_1);

        Dialog.applyDialogFont(parent_1);
        new Label(parent_1, SWT.NONE);

        validatePage();
        updateLaunchConfigurationDialog();
        updateConfigState();
    }

    /**
     * Create the element that allow to select a project See the GraphWalker
     * offline command for more information
     */
    private void createProjectSection(Composite parent) {
        fProjLabel = new Label(parent, SWT.NONE);
        fProjLabel.setText(MessageUtil.getString("label_project"));
        GridData gd = new GridData();
        gd.horizontalIndent = 25;
        fProjLabel.setLayoutData(gd);

        fProjText = new Text(parent, SWT.SINGLE | SWT.BORDER);
        fProjText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fProjText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent evt) {
                validatePage();
                updateConfigState();

            }
        });
        fProjText.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID, GW4E_LAUNCH_CONFIGURATION_TEXT_ID_PROJECT);

    }

    /**
     * Create the element that allow to select a model file See the GraphWalker
     * offline command for more information
     */
    private void createModelSection(Composite parent) {

        composite_2 = new Composite(parent_1, SWT.NONE);
        composite_2.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
        composite_2.setLayout(new GridLayout(1, false));

        fProjButton = new Button(composite_2, SWT.PUSH);
        fProjButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        fProjButton.setText(MessageUtil.getString("label_browse"));
        fProjButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                handleProjectButtonSelected();
                updateConfigState();
            }
        });
        fProjButton.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID, GW4E_BROWSER_BUTTON_ID_PROJECT);
        setButtonGridData(fProjButton);
        fModelLabel = new Label(parent, SWT.NONE);
        GridData gd = new GridData();
        gd.horizontalIndent = 25;
        fModelLabel.setLayoutData(gd);
        fModelLabel.setText(MessageUtil.getString("GraphModel"));

        fModelText = new Text(parent, SWT.SINGLE | SWT.BORDER);
        fModelText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fModelText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent evt) {
                validatePage();
                updateConfigState();
                try {
                    if (fModelText.getText() != null && (fModelText.getText().trim().length() > 0)) {
                        Display display = Display.getCurrent();
                        Runnable longJob = new Runnable() {
                            public void run() {
                                display.syncExec(new Runnable() {
                                    public void run() {
                                        try {
                                            refreshStartElement();
                                            //
                                            IFile file = (IFile) ResourceManager
                                                    .getResource(new Path(fModelText.getText()).toString());
                                            refreshComboViewer(file);
                                            mpg.refresh(file);
                                        } catch (Exception e) {
                                            ResourceManager.logException(e);
                                        }
                                    }
                                });
                                display.wake();
                            }
                        };
                        BusyIndicator.showWhile(display, longJob);
                    }
                } catch (Exception e) {
                    ResourceManager.logException(e);
                }
                fModelText.setFocus();
            }
        });
        fModelText.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID, GW4E_LAUNCH_CONFIGURATION_TEXT_ID_MODEL);

        fModelButton = new Button(parent, SWT.PUSH);
        fModelButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
        fModelButton.setEnabled(fProjText.getText().length() > 0);
        fModelButton.setText(MessageUtil.getString("model_browse"));
        fModelButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                handleBrowseModelButtonSelected();
                updateConfigState();
            }
        });
        fModelButton.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID,
                GW4E_LAUNCH_CONFIGURATION_BROWSER_BUTTON_ID_METHOD);
        setButtonGridData(fModelButton);

        lblPathGenerator = new Label(parent, SWT.NONE);
        lblPathGenerator.setText("New Label");
        gd = new GridData();
        gd.horizontalIndent = 25;
        lblPathGenerator.setLayoutData(gd);
        lblPathGenerator.setText(MessageUtil.getString("path_generator"));

        comboViewer = new ComboViewer(parent, SWT.READ_ONLY);
        combo = comboViewer.getCombo();
        combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

        comboViewer.setContentProvider(ArrayContentProvider.getInstance());
        comboViewer.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof BuildPolicy) {
                    BuildPolicy bp = (BuildPolicy) element;
                    return bp.getPathGenerator();
                }
                return super.getText(element);
            }
        });
        comboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                updateConfigState();
            }
        });
        combo.setData(GW4ELaunchConfigurationTab.GW4E_LAUNCH_CONFIGURATION_CONTROL_ID,
                GW4ELaunchConfigurationTab.GW4E_LAUNCH_CONFIGURATION_COMBO_PATH_GENERATOR_ID_MODEL);

        Label lblFiller = new Label(parent, SWT.NONE);

    }

    private void refreshComboViewer(IFile file) {
        ModelData md = new ModelData(file);
        comboViewer.setInput(md.getPolicies());
    }

    private void refreshStartElement() {
        Path path = null;
        String element = null;
        try {
            path = new Path(fModelText.getText());
            IResource resource = ResourceManager.getResource(path.toString());
            if (resource == null) {
                element = "";
            } else {
                File f = ResourceManager.toFile(path);
                element = GraphWalkerFacade.getNextElement(f.getAbsolutePath());
                if (element == null) {
                    element = "";
                }
            }
            fStartNodeText.setText(element);
        } catch (Exception e) {
            ResourceManager.logException(e);
            fStartNodeText.setText("");
        }
    }

    /**
     * Create the element that allow to select the options See the GraphWalker
     * offline command for more information
     */
    private void createOptionSection(Composite parent) {

        Label fPrintUnvisitedLabel = new Label(parent, SWT.NONE);
        fPrintUnvisitedLabel.setText(MessageUtil.getString("launching_print_unvisited"));
        GridData gd = new GridData();
        gd.horizontalIndent = 25;
        fPrintUnvisitedLabel.setLayoutData(gd);

        fPrintUnvisitedButton = new Button(parent, SWT.CHECK);
        fPrintUnvisitedButton.setEnabled(true);
        fPrintUnvisitedButton.setText("");
        gd = new GridData();
        gd.horizontalSpan = 2;
        fPrintUnvisitedButton.setLayoutData(gd);
        fPrintUnvisitedButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                updateConfigState();
            }
        });
        fPrintUnvisitedButton.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID,
                GW4E_LAUNCH_CONFIGURATION_BUTTON_ID_PRINT_UNVISITED);

        Label fVerbodeLabel = new Label(parent, SWT.NONE);
        fVerbodeLabel.setText(MessageUtil.getString("launching_verbose"));
        gd = new GridData();
        gd.horizontalIndent = 25;
        fVerbodeLabel.setLayoutData(gd);

        fVerbosedButton = new Button(parent, SWT.CHECK);
        fVerbosedButton.setEnabled(true);
        fVerbosedButton.setText("");
        gd = new GridData();
        gd.horizontalSpan = 2;
        fVerbosedButton.setLayoutData(gd);
        fVerbosedButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                updateConfigState();
            }
        });
        fVerbosedButton.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID, GW4E_LAUNCH_CONFIGURATION_BUTTON_ID_VERBOSE);

        Label fRemoveBlockedElementsLabel = new Label(parent, SWT.NONE);
        fRemoveBlockedElementsLabel.setText("Remove Blocked Element(s)");
        gd = new GridData();
        gd.horizontalIndent = 25;
        fRemoveBlockedElementsLabel.setLayoutData(gd);

        fRemoveBlockedElementsButton = new Button(parent, SWT.CHECK);
        fRemoveBlockedElementsButton.setEnabled(true);
        fRemoveBlockedElementsButton.setSelection(true);
        fRemoveBlockedElementsButton.setText("");
        gd = new GridData();
        gd.horizontalSpan = 2;
        fRemoveBlockedElementsButton.setLayoutData(gd);
        fRemoveBlockedElementsButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                updateConfigState();
            }
        });
        fRemoveBlockedElementsButton.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID,
                GW4E_LAUNCH_CONFIGURATION_BUTTON_ID_REMOVE_BLOCKED_ELEMENTS);
    }

    /**
     * Create the element that allow to select a start element See the
     * GraphWalker offline command for more information
     */
    private void createStartElementSection(Composite parent) {

        Label fGeneratorLabel = new Label(parent, SWT.NONE);
        fGeneratorLabel.setText("Start Element");
        gd = new GridData();
        gd.horizontalSpan = 1;
        gd.horizontalIndent = 25;
        fGeneratorLabel.setLayoutData(gd);

        fStartNodeText = new Text(parent, SWT.SINGLE | SWT.BORDER);
        fStartNodeText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        fStartNodeText.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(ModifyEvent evt) {
                validatePage();
                updateConfigState();
                fStartNodeText.setFocus();
            }
        });
        fStartNodeText.setData(GW4E_LAUNCH_CONFIGURATION_CONTROL_ID,
                GW4E_LAUNCH_CONFIGURATION_TEXT_ID_START_ELEMENT);
    }

    private void createBuildPoliciesGeneratorSection(Composite parent) {
        composite = new Composite(parent_1, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
        GridLayout gl_composite = new GridLayout(1, false);
        gl_composite.marginWidth = 0;
        composite.setLayout(gl_composite);

        Button fRefreshButton = new Button(composite, SWT.PUSH);
        fRefreshButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        fRefreshButton.setEnabled(true);
        fRefreshButton.setText(MessageUtil.getString("refresh"));
        fRefreshButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent evt) {
                refreshStartElement();
            }
        });

        lblNewLabel_1 = new Label(parent_1, SWT.NONE);
        lblNewLabel_1.setText(MessageUtil.getString("additionalGraphModels"));
        gd = new GridData();
        gd.horizontalIndent = 25;
        lblNewLabel_1.setLayoutData(gd);

        mpg = new ModelPathGenerator(parent_1, SWT.NONE, new Listener() {
            @Override
            public void handleEvent(Event event) {
                updateConfigState();
            }
        });
        mpg.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        GridLayout gridLayout = (GridLayout) mpg.getLayout();
        gridLayout.marginWidth = 0;

        composite_1 = new Composite(parent_1, SWT.NONE);
        composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1));
        composite_1.setLayout(new GridLayout(1, false));

        hintButton = new Button(composite_1, SWT.CHECK);
        hintButton.setText(MessageUtil.getString("hint"));

        filterGraphmlButton = new Button(composite_1, SWT.CHECK);
        filterGraphmlButton.setText(MessageUtil.getString("filter_graphml_file"));
        Label fDummyGeneratorLabel = new Label(parent, SWT.NONE);
        GridData gd_1 = new GridData();
        gd_1.horizontalSpan = 1;
        fDummyGeneratorLabel.setLayoutData(gd_1);

        mpg.setButtons(hintButton, filterGraphmlButton);

        composite_3 = new Composite(parent_1, SWT.NONE);
        GridLayout gl_composite_3 = new GridLayout(1, false);
        gl_composite_3.marginWidth = 0;
        composite_3.setLayout(gl_composite_3);
        composite_3.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
    }

    /**
     * Create the complete UI allowing to enter GraphWalker "offline" command
     * parameters
     */
    private void createAllSections(Composite parent) {
        createProjectSection(parent);
        createModelSection(parent);
        createOptionSection(parent);
        createStartElementSection(parent);
        createBuildPoliciesGeneratorSection(parent);
    }

    public boolean isValid(ILaunchConfiguration launchConfig) {
        return validatePage();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
     */
    @Override
    public String getName() {
        return MessageUtil.getString("graphwalkerName");
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.
     * debug.core.ILaunchConfiguration)
     */
    @Override
    public void initializeFrom(ILaunchConfiguration config) {
        try {
            mpg.initialize(getModels(config));
            fProjText.setText(config.getAttribute(CONFIG_PROJECT, ""));
            fModelText.setText(getMainModel(config));
            fPrintUnvisitedButton
                    .setSelection(Boolean.parseBoolean(config.getAttribute(CONFIG_UNVISITED_ELEMENT, "false")));
            fVerbosedButton.setSelection(Boolean.parseBoolean(config.getAttribute(CONFIG_VERBOSE, "false")));
            fStartNodeText.setText(config.getAttribute(CONFIG_LAUNCH_STARTNODE, ""));
            fRemoveBlockedElementsButton.setSelection(
                    new Boolean(config.getAttribute(CONFIG_LAUNCH_REMOVE_BLOCKED_ELEMENT_CONFIGURATION, "true")));
            BuildPolicy bp = getMainPathGenerators(config);
            if (bp != null) {
                comboViewer.setSelection(new StructuredSelection(bp), true);
            }
        } catch (CoreException e) {
            ResourceManager.logException(e);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.
     * debug.core.ILaunchConfigurationWorkingCopy)
     */
    @Override
    public void performApply(ILaunchConfigurationWorkingCopy config) {
        config.setAttribute(CONFIG_PROJECT, fProjText.getText());
        config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText());
        try {
            setModels(config);
        } catch (CoreException e) {
            ResourceManager.logException(e);
        }
        config.setAttribute(CONFIG_UNVISITED_ELEMENT, this.fPrintUnvisitedButton.getSelection() + "");
        config.setAttribute(CONFIG_VERBOSE, this.fVerbosedButton.getSelection() + "");
        config.setAttribute(CONFIG_LAUNCH_STARTNODE, this.fStartNodeText.getText() + "");
        config.setAttribute(CONFIG_LAUNCH_REMOVE_BLOCKED_ELEMENT_CONFIGURATION,
                this.fRemoveBlockedElementsButton.getSelection() + "");
    }

    private String getMainModel(ILaunchConfiguration config) throws CoreException {
        String ret = config.getAttribute(CONFIG_GRAPH_MODEL_PATHS, "");
        StringTokenizer st = new StringTokenizer(ret, ";");
        if (st.hasMoreTokens())
            return st.nextToken();
        return "";
    }

    private ModelData[] getModels(ILaunchConfiguration config) throws CoreException {
        List<ModelData> temp = new ArrayList<ModelData>();
        String paths = config.getAttribute(CONFIG_GRAPH_MODEL_PATHS, "");

        if (paths == null || paths.trim().length() == 0)
            return new ModelData[0];
        StringTokenizer st = new StringTokenizer(paths, ";");
        st.nextToken(); // the main model path
        st.nextToken(); // main model : Always "1"
        st.nextToken(); // the main path generator
        while (st.hasMoreTokens()) {
            String path = st.nextToken();
            IFile file = (IFile) ResourceManager.getResource(new Path(path).toString());
            if (file == null)
                continue;
            ModelData data = new ModelData(file);
            boolean selected = st.nextToken().equalsIgnoreCase("1");
            String pathGenerator = st.nextToken();
            data.setSelected(selected);
            data.setSelectedPolicy(pathGenerator);
            temp.add(data);
        }
        ModelData[] ret = new ModelData[temp.size()];
        temp.toArray(ret);
        return ret;
    }

    private BuildPolicy getMainPathGenerators(ILaunchConfiguration config) throws CoreException {
        String paths = config.getAttribute(CONFIG_GRAPH_MODEL_PATHS, "");
        if (paths == null || paths.trim().length() == 0)
            return null;
        StringTokenizer stFirst = new StringTokenizer(paths, ";");
        stFirst.nextToken(); // the main model path
        stFirst.nextToken(); // main model : Always "1"
        String generators = stFirst.nextToken(); // the main path generator
        if (generators == null || generators.trim().length() == 0)
            return null;
        StringTokenizer st = new StringTokenizer(generators, ";");
        if (st.hasMoreTokens()) {
            String path = st.nextToken();
            if (path == null || path.trim().length() == 0)
                return null;
            String model = getMainModel(config);
            IFile file = (IFile) ResourceManager.getResource(new Path(model).toString());
            if (file == null)
                return null;
            ModelData md = new ModelData(file);
            BuildPolicy[] policies = md.getPolicies();
            for (BuildPolicy buildPolicy : policies) {
                if (path.trim().equals(buildPolicy.getPathGenerator())) {
                    return buildPolicy;
                }
            }
            if (policies.length > 0)
                return policies[0];
        }
        return null;
    }

    private void setModels(ILaunchConfigurationWorkingCopy config) throws CoreException {
        StringBuffer sb = new StringBuffer();
        // Main 
        if (fModelText.getText() == null || fModelText.getText().trim().length() == 0) {
            sb.append("").append(";");
        } else {
            sb.append((fModelText.getText().trim())).append(";");
        }
        sb.append("1").append(";");
        IStructuredSelection selection = (IStructuredSelection) comboViewer.getSelection();
        if (selection == null || selection.getFirstElement() == null) {
            sb.append("?").append(";");
        } else {
            sb.append(((BuildPolicy) selection.getFirstElement()).getPathGenerator()).append(";");
        }
        // Others
        ModelData[] others = mpg.getModel();
        for (int i = 0; i < others.length; i++) {
            sb.append(others[i].getFullPath()).append(";");
            if (others[i].isSelected()) {
                sb.append("1").append(";");
            } else {
                sb.append("0").append(";");
            }
            sb.append(others[i].getSelectedPolicy()).append(";");
        }
        config.setAttribute(CONFIG_GRAPH_MODEL_PATHS, sb.toString());
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.
     * debug.core.ILaunchConfigurationWorkingCopy)
     */
    @Override
    public void setDefaults(ILaunchConfigurationWorkingCopy config) {
        config.setAttribute(CONFIG_PROJECT, "");
        config.setAttribute(CONFIG_GRAPH_MODEL_PATHS, "");
        config.setAttribute(CONFIG_UNVISITED_ELEMENT, "false");
        config.setAttribute(CONFIG_VERBOSE, "false");
        config.setAttribute(CONFIG_LAUNCH_STARTNODE, "");
        config.setAttribute(CONFIG_LAUNCH_REMOVE_BLOCKED_ELEMENT_CONFIGURATION, "true");

    }

    /**
     * @return
     */
    private boolean validatePage() {

        setErrorMessage(null);
        setMessage(null);

        String projectName = fProjText.getText().trim();
        if (projectName.length() == 0) {
            setErrorMessage(MessageUtil.getString("error_projectnotdefined"));
            return false;
        }

        if (!ResourceManager.validProjectPath(projectName)) {
            setErrorMessage(MessageUtil.getString("invalidProjectName") + " " + projectName);
            return false;
        }

        if (!ResourceManager.projectExists(projectName)) {
            setErrorMessage(MessageUtil.getString("error_projectnotexists"));
            return false;
        }
        IProject project = ResourceManager.getProject(projectName);
        try {
            if (!project.hasNature(JavaCore.NATURE_ID)) {
                setErrorMessage("error_notJavaProject");
                return false;
            }
            String modelName = fModelText.getText().trim();
            if (modelName.length() == 0) {
                setErrorMessage(MessageUtil.getString("error_modelNamenotdefined"));
                return false;
            }

            if (!(modelName.startsWith("/" + projectName + "/"))) {
                setErrorMessage(MessageUtil.getString("error_file_not_found_in_project"));
                return false;
            }
            boolean fileExists = ResourceManager.resourcePathExists(modelName);
            if (!fileExists) {
                setErrorMessage(MessageUtil.getString("error_graphmodel_not_found"));
                return false;
            }

            String mpgError = mpg.validate();
            if (mpgError != null) {
                setErrorMessage(mpgError);
                return false;
            }

            IStructuredSelection selection = (IStructuredSelection) comboViewer.getSelection();
            if (selection == null) {
                setErrorMessage(MessageUtil.getString("empty_path_generator"));
                return false;
            }
            if (selection.getFirstElement() == null) {
                setErrorMessage(MessageUtil.getString("empty_path_generator"));
                return false;
            }
            String s = ((BuildPolicy) (selection.getFirstElement())).getPathGenerator();
            if (s == null || s.trim().length() == 0) {
                setErrorMessage(MessageUtil.getString("empty_path_generator"));
                return false;
            }
            if (!GraphWalkerFacade.parsePathGenerator(s.trim())) {
                setErrorMessage(MessageUtil.getString("invalid_path_generator"));
                return false;
            }
        } catch (CoreException e) {
            ResourceManager.logException(e);
        }

        return true;
    }

    /**
     * A helper method to size the button
     * 
     * @param button
     * @return
     */
    public static int getButtonWidthHint(Button button) {
        button.setFont(JFaceResources.getDialogFont());
        PixelConverter converter = new PixelConverter(button);
        int widthHint = converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
    }

    /**
     * A helper method to customize the button
     * 
     * @param button
     */
    private void setButtonGridData(Button button) {
        if (gd instanceof GridData) {
            ((GridData) gd).widthHint = getButtonWidthHint(button);
            ((GridData) gd).horizontalAlignment = GridData.FILL;
        }
    }

    /**
     * A helper method to provide the selected java project
     */
    private IJavaProject getJavaProject() {
        String projectName = fProjText.getText().trim();
        if (projectName.length() < 1) {
            return null;
        }
        return JDTManager.getJavaModel().getJavaProject(projectName);
    }

    /**
     * Here is what happen when the button is selected (Selection of a project)
     */
    private void handleProjectButtonSelected() {
        IJavaProject project = GraphWalkerContextManager.chooseGW4EProject(getJavaProject());
        if (project == null) {
            return;
        }

        String projectName = project.getElementName();
        fProjText.setText(projectName);
    }

    /**
     * Here is what happen when the button is selected (Selection of a model
     * file)
     */
    private void handleBrowseModelButtonSelected() {
        IFile resource = GraphWalkerContextManager.chooseGraphWalkerModel(fProjText.getText());
        if (resource == null) {
            return;
        }

        String elementName = resource.getFullPath().toString();
        fModelText.setText(elementName);
    }

    /**
     * Check what kind of model file has been chosen We can have here a graphml
     * modle file or a gw3 model file
     */
    private boolean isGW3SelectedFile() {
        IResource resource = ResourceManager.getResource(fModelText.getText());
        return PreferenceManager.isGW3ModelFile((IFile) resource);
    }

    /**
     * Update the state of the UI
     */
    private void updateConfigState() {

        setDirty(true);
        updateLaunchConfigurationDialog();

        fProjText.setEnabled(true);
        fProjLabel.setEnabled(true);
        fProjButton.setEnabled(true);
        fModelLabel.setEnabled(false);
        fModelText.setEnabled(false);
        fModelButton.setEnabled(false);
        fPrintUnvisitedButton.setEnabled(false);
        fVerbosedButton.setEnabled(false);
        fStartNodeText.setEnabled(false);

        if (fProjText.getText().trim().length() > 0) {
            fModelLabel.setEnabled(true);
            fModelText.setEnabled(true);
            fModelButton.setEnabled(true);
        }

        if (fModelText.getText().trim().length() > 0) {
            fVerbosedButton.setEnabled(true);
            fPrintUnvisitedButton.setEnabled(true);
            if (isGW3SelectedFile()) {
                fStartNodeText.setEnabled(false);
            } else {
                fStartNodeText.setEnabled(true);
                fStartNodeText.setFocus();
            }
        }
    }
}