/*******************************************************************************
 * Copyright (c) 2000, 2008 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * IBM Corporation - initial API and implementation
 * yyyymmdd bug      Email and other contact information
 * -------- -------- -----------------------------------------------------------
 * 20080324   220983 trungha@ca.ibm.com - Trung Ha
 *******************************************************************************/

package org.eclipse.jst.ws.internal.ui.dialog;

import java.util.Vector;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jst.ws.internal.common.Filter;
import org.eclipse.jst.ws.internal.common.ResourceUtils;
import org.eclipse.jst.ws.internal.ui.WSUIPluginMessages;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
import org.eclipse.ui.dialogs.SelectionDialog;


/**
* Contains utility methods for launching various common dialogs.
*/
public final class DialogUtils
{

  /**
  * Raises a dialog for browsing containers.
  * @param parentShell The parent shell, optionally null.
  * @param initialPathname The initial selection.
  * @return The selected container or null if the dialog
  * is cancelled, or there is no selection, or the selection
  * is not a project or a folder.
  */
  public static String browseContainers ( Shell parentShell, String initialPathname )
  {
    String selectedPathname = null;
    IPath initialPath = new Path(initialPathname);
    IResource initialResource = ResourceUtils.getWorkspaceRoot().findMember(initialPath);
    if (initialResource == null)
    {
      if (initialPath.segmentCount() == 1)
      {
        initialResource = ResourceUtils.getWorkspaceRoot().getProject(initialPath.segment(0));
      }
      else if (initialPath.segmentCount() > 1)
      {
        initialResource = ResourceUtils.getWorkspaceRoot().getFolder(initialPath);
      }
    }
    else
    {
      if (initialResource.getType() == IResource.FILE)
      {
        initialResource = initialResource.getParent();
      }
    }
    ContainerSelectionDialog dialog = new ContainerSelectionDialog(parentShell,(IContainer)initialResource,true,null);
    dialog.open();
    Object[] result = dialog.getResult();
    if (result != null && result.length > 0)
    {
      if (result[0] instanceof IPath)
      {
        IPath path = (IPath)result[0];
        selectedPathname = path.toString();
      }
    }
    return selectedPathname;
  }

  /**
  * Raises a dialog for browsing resources.
  * @param parentShell The parent shell, optionally null.
  * @param topResource The resource under which to browse.
  * If null, all resources in the workspace are browsed.
  * @param initialSelection The initial selection, or null for none.
  * If the initial selection is not null and exists in the set of
  * resources found by the browser, that resource is selected by default.
  * @param filter The resource filter object.
  * @return The selected resource.
  */
  public static IResource browseResources ( Shell parentShell, IResource topResource, IResource initialSelection, Filter filter)
  {
    ResourceSelectionDialog rds = new ResourceSelectionDialog(parentShell,topResource,initialSelection,filter);
    rds.setMultipleSelectionEnabled(false);
    if (rds.open() == Dialog.OK)
    {
      IResource[] resources = rds.getResult();
      if (resources != null && resources.length > 0)
      {
        return resources[0];
      }
    }
    return null;
  }

  /**
  * <b>Implementation remains TBD.</b><br>
  * Raises a dialog for browsing classes on a project's class path.
  * @param parentShell The parent shell, optionally null.
  * @param project The project.
  * @return The qualified name of the selected java class.
  */
  public static String browseClasses ( Shell parentShell, IProject project )
  {
    return browseClasses(parentShell, project, (IRunnableContext)null);
  }

  public static String browseClasses ( Shell parentShell, IProject project, IWizardContainer container)
  {
    return browseClasses(parentShell, project, (IRunnableContext)container);
  }

  /**
  * Raises a dialog for browsing classes on a project's class path.
  * @param parentShell The parent shell, optionally null.
  * @param project The project.
  * @param container The container of the launching wizard.
  * @return The qualified name of the selected java class.
  */
  public static String browseClasses ( Shell parentShell, 
                                       IProject project, 
                                       IRunnableContext ctxt) 
  {
    return browseClasses(parentShell, new IResource[] {project}, ctxt);
  }
  
  public static String browseClasses(Shell parentShell, IResource[] resources, IRunnableContext ctxt)
  {
    IType itype = browseClassesAsIType(parentShell, resources, ctxt);
    if (itype != null)
      return itype.getFullyQualifiedName();
    else
      return null;
  }
  
  public static IType browseClassesAsIType(Shell parentShell, IResource[] resources, IRunnableContext ctxt)
  {
	Vector javaElements = new Vector();
	for (int i = 0; i < resources.length; i++)
	{
	  IJavaElement javaElement = JavaCore.create(resources[i]);
	  if (javaElement != null)
	    javaElements.add(javaElement);
	}
	IJavaElement[] elements = (IJavaElement[])javaElements.toArray(new IJavaElement[0]);
	
    IJavaSearchScope scope = SearchEngine.createJavaSearchScope(elements);
    scope.setIncludesClasspaths(true);
    scope.setIncludesBinaries(true);

    //Creating and opening a TypeSelectionDialog
    try
	{
      // We want to show every class when the dialog is opened, so throw in this String
      String filterStringToSelectEverything = "* "; //$NON-NLS-1$
      
      SelectionDialog dialog = JavaUI.createTypeDialog(parentShell, ctxt, scope, IJavaElementSearchConstants.CONSIDER_CLASSES, false, filterStringToSelectEverything); 
      dialog.setTitle(WSUIPluginMessages.DIALOG_TITLE_CLASS_BROWSE);
      dialog.setMessage(WSUIPluginMessages.LABEL_CLASS_BROWSE);    
      dialog.open();

      //Getting the result and returning it
      Object[] results = dialog.getResult();
      if (results != null && results.length > 0)
      {
        if (results[0] instanceof IType)
        {
          return (IType)results[0];
        }
      }
    }
    catch (JavaModelException jme)
	{
    }
    return null;
  }

  /**
  * Raises a dialog for browsing interfaces on a project's class path.
  * @param parentShell The parent shell, optionally null.
  * @param project The project.
  * @param container The container of the launching wizard.
  * @return The qualified name of the selected java interface.
  */
  public static String browseInterfaces( Shell parentShell, 
                                         IProject project, 
                                         IWizardContainer container) 
  									    
  {
    String interfaceName = null;

    //Limiting search scope to the project
    IResource[] resources = new IResource[1];
    resources[0]=project;
	IJavaElement[] elements = new IJavaElement[1];
	elements[0] = JavaCore.create(resources[0]);
    IJavaSearchScope scope = SearchEngine.createJavaSearchScope(elements);
    scope.setIncludesClasspaths(true);
    scope.setIncludesBinaries(true);

    //Creating and opening a TypeSelectionDialog
    try
	{
    	SelectionDialog dialog = JavaUI.createTypeDialog(parentShell, container, scope, IJavaElementSearchConstants.CONSIDER_TYPES, false);
    	dialog.setTitle(WSUIPluginMessages.DIALOG_TITLE_INTERFACE_BROWSE);
    	dialog.setMessage(WSUIPluginMessages.DIALOG_TITLE_INTERFACE_BROWSE);    
    	dialog.open();

    	//Getting the result and returning it
    	Object[] results = dialog.getResult();
    	if (results != null && results.length > 0)
    	{
    		if (results[0] instanceof IType)
    		{
    			IType resultInterface = (IType)results[0];
    			interfaceName = resultInterface.getFullyQualifiedName();
    		}
    	}
    }
    catch (JavaModelException jme)
	{
    }
    
    return interfaceName;
  } 
}
