/**
 * Copyright (c) 2006 IBM Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 * 
 * Contributors: 
 *   IBM - Initial API and implementation
 */
package org.eclipse.emf.cheatsheets.actions;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.cheatsheets.ICheatSheetAction;
import org.eclipse.ui.cheatsheets.ICheatSheetManager;

import org.eclipse.emf.cheatsheets.CheatSheetsPlugin;
import org.eclipse.emf.common.util.BasicMonitor;


/**
 * <p>Action that creates a new general project in workspace.</p>
 * @since 2.2.0
 */
public class NewProjectAction extends Action implements ICheatSheetAction
{
  protected String projectName;

  /**
   * Execution of the action
   * @param params Array of parameters - index 0: projectName
   * @param manager Cheatsheet Manager
   */
  public void run(String[] params, ICheatSheetManager manager)
  {
    projectName = params[0];
    run();
  }

  /**
   * Run the action
   */
  @Override
  public void run()
  {
    if (projectName != null)
    {
      WorkspaceModifyOperation operation = new WorkspaceModifyOperation()
        {
          @Override
          protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException
          {
            createProject(projectName, monitor);
          }
        };

      try
      {
        runWithProgress(operation);
        notifyResult(ResourcesPlugin.getWorkspace().getRoot().exists(new Path(projectName)));
        return;
      }
      catch (Exception e)
      {
        CheatSheetsPlugin.INSTANCE.log(e);
      }
    }

    notifyResult(false);
  }

  /**
   * Run with progress
   * @param runnable
   * @throws InvocationTargetException
   * @throws InterruptedException
   */
  protected void runWithProgress(IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException
  {
    new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(false, false, runnable);
  }

  /**
   * Creates a new project
   * @param projectName Name of the project
   * @return Project
   * @throws CoreException 
   * @throws CoreException
   */
  protected IProject createProject(String projectName, IProgressMonitor monitor) throws CoreException
  {
    monitor.beginTask(CheatSheetsPlugin.INSTANCE.getString("_UI_CreateProject_message", new String []{ projectName }), 2);
    IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
    IProject project = workspaceRoot.getProject(projectName);
    if (!project.exists())
    {
      project.create(BasicMonitor.subProgress(monitor, 1));
    }
    project.open(BasicMonitor.subProgress(monitor, 1));
    monitor.done();
    return project;
  }
}
