private IJavaProject chooseJavaProject() {
    IJavaProject[] projects;
    try {
      projects = JavaCore.create(getWorkspaceRoot()).getJavaProjects();
    } catch (JavaModelException e) {
      EasybLaunchActivator.getDefault().getLog().log(e.getStatus());
      projects = new IJavaProject[0];
    }

    ILabelProvider labelProvider =
        new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
    ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), labelProvider);
    dialog.setTitle("Projects");
    dialog.setMessage("Please choose a project");
    dialog.setElements(projects);

    IJavaProject javaProject = getJavaProject();
    if (javaProject != null) {
      dialog.setInitialSelections(new Object[] {javaProject});
    }
    if (dialog.open() == Window.OK) {
      return (IJavaProject) dialog.getFirstResult();
    }
    return null;
  }
  @Override
  public void performApply(ILaunchConfigurationWorkingCopy config) {
    config.setAttribute(
        IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME,
        StringUtils.trimToEmpty(txtProject.getText()));

    try {
      List<String> stories = getStoriesFullPaths();
      config.setAttribute(ILaunchConstants.LAUNCH_ATTR_STORIES_FULL_PATH, stories);
    } catch (CoreException cex) {
      EasybLaunchActivator.Log(
          "Unable apply configuration due to exception while retrieving story locations", cex);
      setErrorMessage(
          "Unable apply configuration due to exception while retrieving story locations");
    }

    if (container != null) {
      config.setAttribute(
          ILaunchConstants.LAUNCH_ATTR_CONTAINER_HANDLE, container.getHandleIdentifier());
    }

    if (storyFile != null) {
      config.setAttribute(
          ILaunchConstants.LAUNCH_ATTR_STORY_PATH,
          storyFile.getProjectRelativePath().toPortableString());
    }

    config.setAttribute(
        ILaunchConstants.LAUNCH_ATTR_IS_SINGLE_STORY, btnRadioSingleStory.getSelection());
  }
  @Override
  public void setDefaults(ILaunchConfigurationWorkingCopy config) {

    IProject proj = EasybLaunchActivator.getDefault().getSelectedProject();

    if (proj != null) {
      config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, proj.getName());
    }
  }
  @Override
  public void initializeFrom(ILaunchConfiguration config) {

    try {
      txtProject.setText(
          config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""));
    } catch (CoreException ce) {
      EasybLaunchActivator.Log("Unable to set project name for launch", ce);
      setErrorMessage("Unable to set project from configuration");
    }

    initialiseStoriesfromConfiguration(config);
  }
  private IFile chooseStory() {
    try {
      IJavaProject javaProject = getJavaProject();
      IFile[] files = BehaviourSearch.findStoryFiles(javaProject.getResource());

      BehaviourElementSelectorDialog dialog = new BehaviourElementSelectorDialog(getShell(), files);

      dialog.setTitle("Stories");
      dialog.setMessage("Choose a story");

      if (dialog.open() == Window.OK) {
        Object element = dialog.getFirstResult();
        return (IFile) element;
      }
    } catch (CoreException cex) {
      EasybLaunchActivator.Log("Unable to locate storys for story browse", cex);
      setErrorMessage("Unable to locate storys for story browse");
    }

    return null;
  }
  protected void initialiseStoriesfromConfiguration(ILaunchConfiguration config) {

    try {
      String containerHandle =
          config.getAttribute(ILaunchConstants.LAUNCH_ATTR_CONTAINER_HANDLE, "");

      if (!StringUtils.isBlank(containerHandle)) {
        container = JavaCore.create(containerHandle);
        txtMultiStories.setText(container.getElementName());
      }

    } catch (CoreException ce) {
      EasybLaunchActivator.Log("Unable to set project,resource or package name for launch", ce);
      setErrorMessage("Unable to set project,folder or package for stories from configuration");
    }

    try {
      String storyProjectPath = config.getAttribute(ILaunchConstants.LAUNCH_ATTR_STORY_PATH, "");

      IPath path = null;
      if (!StringUtils.isBlank(storyProjectPath)) {
        path = Path.fromPortableString(storyProjectPath);
      }

      IJavaProject javaProject = getJavaProject();

      if (javaProject != null) {
        IProject project = javaProject.getProject();
        if (project.findMember(path) instanceof IFile) {
          storyFile = (IFile) project.findMember(path);
        } else {
          setErrorMessage("Unable to locate " + storyProjectPath + " in project");
        }
      } else {
        setErrorMessage("No project has been set for story");
      }

      if (storyFile != null) {
        txtStory.setText(storyFile.getName());
      } else if (!StringUtils.isBlank(storyProjectPath)) {
        txtStory.setText(storyProjectPath);
      }

    } catch (CoreException ce) {
      EasybLaunchActivator.Log("Unable to set story for launch", ce);
      setErrorMessage("Unable to set story for launch");
    }

    try {
      boolean isSingleStory =
          config.getAttribute(ILaunchConstants.LAUNCH_ATTR_IS_SINGLE_STORY, true);
      setEnableSingleStory(isSingleStory);
      setEnableProject(isSingleStory);
      setEnableMultiStory(!isSingleStory);

      btnRadioSingleStory.setSelection(isSingleStory);
      btnRadioMultiStory.setSelection(!isSingleStory);

    } catch (CoreException ce) {
      EasybLaunchActivator.Log("Unable to set single or multi story radio buttons", ce);
      setErrorMessage("Unable to set single or multi story radio buttons");
    }
  }