/*******************************************************************************
 * Copyright (c) 2004 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
 *******************************************************************************/
package org.eclipse.wst.common.ui.internal.search.dialogs;

import org.eclipse.core.resources.IResource;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.IWorkingSetSelectionDialog;
import org.eclipse.wst.common.core.search.scope.ProjectSearchScope;
import org.eclipse.wst.common.core.search.scope.SearchScope;
import org.eclipse.wst.common.core.search.scope.WorkingSetSearchScope;
import org.eclipse.wst.common.core.search.scope.WorkspaceSearchScope;
import org.eclipse.wst.common.ui.internal.UIPlugin;

public class ScopedComponentSearchListDialog extends ComponentSearchListDialog
{
  protected final static String DEFAULT_NAME_FIELD_TITLE = UIPlugin.getString("_UI_LABEL_COMPONENT_NAME");
  protected final static String DEFAULT_LIST_TITLE = UIPlugin.getString("_UI_LABEL_MATCHING_COMPONENTS");
  public static final String SCOPE_SPECIFIED_FILE = UIPlugin.getString("_UI_LABEL_SPECIFIED_FILE");
  public static final String SCOPE_ENCLOSING_PROJECT = UIPlugin.getString("_UI_LABEL_ENCLOSING_PROJECT");
  public static final String SCOPE_WORKSPACE = UIPlugin.getString("_UI_LABEL_WORKSPACE");
  public static final String SCOPE_CURRENT_RESOURCE = UIPlugin.getString("_UI_LABEL_CURRENT_RESOURCE");
  public static final String SCOPE_WORKING_SETS = UIPlugin.getString("_UI_LABEL_WORKING_SETS");
  
  private String currentSearchScope = SCOPE_CURRENT_RESOURCE;
  protected Button chooseButton;
  protected Button[] radioButton = new Button[4];
  protected String filterLabel;
  protected String listTitle;
  protected IResource currentResource;
  protected Composite selectWorkingSetsGroup;
  protected Text workingSetsText;
  
  protected static String valueForWorkingSetsText;
  
  // working sets currently chosen by the user
  private static IWorkingSet[] workingSets;

  public ScopedComponentSearchListDialog(Shell shell, String dialogTitle, ComponentSearchListDialogConfiguration configuration)
  {
    super(shell, dialogTitle, configuration);
  }
  
  public void setFilterLabel(String filterLabel)
  {
    this.filterLabel = filterLabel;
  }
  
  public void setListTitle(String listTitle)
  {
    this.listTitle = listTitle;
  }  

  protected Control createDialogArea(Composite parent)
  {
    //super.setFilterLabel(filterLabel != null ? filterLabel : DEFAULT_NAME_FIELD_TITLE);
    //setListLabelText(listTitle != null ? listTitle : DEFAULT_LIST_TITLE);
    super.createDialogArea(parent);
    // We use the Composite topComposite to create additional widgets
    GridLayout layout = new GridLayout();
    layout.marginWidth = 0;
    bottomComposite.setLayout(layout);
    Group group = new Group(bottomComposite, SWT.NONE);
    GridLayout gridLayout = new GridLayout(3, false);
    // gridLayout.marginWidth = 0;
    // gridLayout.marginLeft = 2;
    group.setLayout(gridLayout);
    group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    group.setText(UIPlugin.getString("_UI_LABEL_SEARCH_SCOPE"));
    ScopeChangeListener scopeChangeListener = new ScopeChangeListener();
    radioButton[0] = new Button(group, SWT.RADIO);
    radioButton[0].setText(SCOPE_WORKSPACE);
    radioButton[1] = new Button(group, SWT.RADIO);
    radioButton[1].setText(SCOPE_ENCLOSING_PROJECT);
    radioButton[2] = new Button(group, SWT.RADIO);
    radioButton[2].setText(SCOPE_CURRENT_RESOURCE);
    radioButton[3] = new Button(group, SWT.RADIO);
    radioButton[3].setText(SCOPE_WORKING_SETS);
    for (int i = 0; i < radioButton.length; i++)
    {
      if (radioButton[i].getText().equals(currentSearchScope))
      {
        radioButton[i].setSelection(true);
      }
      radioButton[i].addSelectionListener(scopeChangeListener);
    }
    
    selectWorkingSetsGroup = new Composite(group, SWT.NONE);
	GridData gd = new GridData(GridData.FILL_HORIZONTAL);
    gd.horizontalSpan = 2;
    selectWorkingSetsGroup.setLayoutData(gd);
    GridLayout workingSetGroupLayout = new GridLayout(2, false);
    workingSetGroupLayout.marginWidth = 0;
    workingSetGroupLayout.marginHeight = 0;
    selectWorkingSetsGroup.setLayout(workingSetGroupLayout);
    
    workingSetsText = new Text(selectWorkingSetsGroup, SWT.BORDER | SWT.READ_ONLY);
    workingSetsText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    if (valueForWorkingSetsText != null )
    	workingSetsText.setText(valueForWorkingSetsText);
    
    chooseButton = new Button(selectWorkingSetsGroup, SWT.NONE);
    chooseButton.setText(UIPlugin.getString("_UI_LABEL_CHOOSE"));
    chooseButton.addSelectionListener(new SelectionAdapter() {
		public void widgetSelected(SelectionEvent e) {
			Shell shell = getShell();
			IWorkingSetSelectionDialog dialog = PlatformUI.getWorkbench().getWorkingSetManager().createWorkingSetSelectionDialog(shell, true);
			if ( dialog.open() == Window.OK){
				workingSets = dialog.getSelection();
				valueForWorkingSetsText = "";
				for (int i = 0; i < workingSets.length; i++){
					valueForWorkingSetsText += workingSets[i].getLabel();
					// if not the last item, we add a comma
					if ( i != workingSets.length - 1) 
						valueForWorkingSetsText += ", ";
				}
				workingSetsText.setText(valueForWorkingSetsText);
			}
			// Set working sets radio button enabled, disable other buttons
			radioButton[2].setSelection(false);
			radioButton[1].setSelection(false);
			radioButton[0].setSelection(false);
			radioButton[3].setSelection(true);

			scopeChangeHandler(radioButton[3]);
		}
    });

    return parent;
  } /*
     * Returns the selected search scope.
     */

  public String getSearchScope()
  {
    return currentSearchScope;
  }

private void scopeChangeHandler(Button b) {	  
	  if ((b.getStyle() & SWT.RADIO) != 0)
	  {
		  currentSearchScope = b.getText();
		  
		  // TODO (cs) need to do some work to make the default search scope
		  // more well defined, currently the default behaviour is to pass a null
		  // argument in to populateMasterComponentList but we should provide
		  // getters/setters to allow the default to be controlled          
		  SearchScope scope = null;
		  if (currentSearchScope == SCOPE_ENCLOSING_PROJECT &&
				  currentResource != null) { 
			  scope = new ProjectSearchScope(currentResource.getFullPath());
		  } 
		  else if (currentSearchScope == SCOPE_WORKSPACE){
			  scope = new WorkspaceSearchScope();
		  }
		  else if (currentSearchScope == SCOPE_WORKING_SETS){
			  
			  // Constructs the working sets scope from the working sets the user
			  // selected
			  WorkingSetSearchScope workingSetsScope = new WorkingSetSearchScope();
			  for (int i = 0; i < workingSets.length; i++){
				  workingSetsScope.addAWorkingSetToScope(workingSets[i].getElements());
			  }			  
			  scope = workingSetsScope;
		  }
		  
		  populateMasterComponentList(scope);
		  refreshTableViewer(getProcessedFilterString());
		  // Select the first matching component. Though we should be
		  // smarter here
		  // and determine if there was a selection before the scope
		  // switch (and if
		  // the component is still available.
		  Table table = componentTableViewer.getTable();
		  TableItem items[] = table.getItems();
		  if (items.length > 0)
		  {
			  TableItem select[] = new TableItem[1];
			  select[0] = items[0];
			  table.setSelection(select);
		  }
		  updateCanFinish();
	  }
  }

private class ScopeChangeListener extends SelectionAdapter
  {
    public void widgetSelected(SelectionEvent e)
    {
      if (e.widget instanceof Button)
      {
    	Button b = (Button) e.widget;
        scopeChangeHandler(b);
      }
    }
  }

  public IResource getCurrentResource()
  {
    return currentResource;
  }

  public void setCurrentResource(IResource currentResource)
  {
    this.currentResource = currentResource;
  }
}