/*******************************************************************************
 * Copyright (c) 2002-2005 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 - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsi.ui.internal.wizards;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.wst.wsi.ui.internal.WSIUIPlugin;
import org.eclipse.wst.wsi.ui.internal.dialogs.SelectSingleFileDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

/**
 * Wizard page that allows the user to specify the location of the 
 * WSDL document for the Web service.
 * 
 * @author David Lauzon, IBM
 * @author Lawrence Mandel, IBM
 */

public class ValidationWizardWSDLPage extends WizardPage implements SelectionListener
{

  IStructuredSelection selection;

  protected boolean wsdlinvalid = false;
  /**
   * Access to the includeWSDL flag.  
   */
  protected Button includeWSDLButton;

  /**
   * Access to the wsdl document group.
   */
  protected Group documentGroup;
  protected Text documentLocationText;
  protected Combo fileField;
  /**
   * Constructor.
   * 
   * @param selection: selection in the Resource Navigator view.
   */
  public ValidationWizardWSDLPage(IStructuredSelection selection)
  {
    super("ValidationWizardWSDLPage");
    this.selection = selection;
    this.setTitle(WSIUIPlugin.getResourceString("_UI_WIZARD_V_SELECT_WSDL_FILENAME_HEADING"));
    this.setDescription(WSIUIPlugin.getResourceString("_UI_WIZARD_V_SELECT_WSDL_FILENAME_EXPL"));
  }

  /**
   * Always returns true.
   */
  public boolean isPageComplete()
  {
    if (includeWSDLFile())
    {

      if (fileField.getText() == null || fileField.getText().equals("") || wsdlinvalid)
      {
        return false;
      }
    }
    return true;
  }

  /*
   * Creates the top level control for this page under the given parent
   * composite. Implementors are responsible for ensuring that the created
   * control can be accessed via getControl
   * 
   * @param parent - the parent composite
   */
  public void createControl(Composite parent)
  {
    Composite base = new Composite(parent, SWT.NONE);
    base.setLayout(new GridLayout());
    GridData data;

    // add includeWSDL flag
    includeWSDLButton = new Button(base, SWT.CHECK);
    includeWSDLButton.setText(WSIUIPlugin.getResourceString("_UI_WIZARD_V_INCLUDE_WSDL_BUTTON"));
    data = new GridData();
    data.horizontalAlignment = GridData.FILL;
    includeWSDLButton.setLayoutData(data);
    includeWSDLButton.addSelectionListener(this);
    includeWSDLButton.setSelection(false);

    // create a WSDL document group
    documentGroup = new Group(base, SWT.SHADOW_ETCHED_IN);
    data = new GridData();
    data.horizontalAlignment = GridData.FILL;
    data.grabExcessHorizontalSpace = true;
    documentGroup.setLayoutData(data);
    GridLayout layout = new GridLayout();
    layout.numColumns = 1;
    documentGroup.setLayout(layout);
    documentGroup.setVisible(false);

    createDocumentGroupContents(documentGroup);

    setControl(base);
  }

  protected Control createDocumentGroupContents(Composite documentGroup)
  {
    //radio buttons' container
    Composite basePanel = new Composite(documentGroup, SWT.NONE);
    GridLayout layout = new GridLayout();
    layout.numColumns = 2;
    layout.makeColumnsEqualWidth = false;
    layout.marginWidth = 0;
    basePanel.setLayout(layout);
    GridData data = new GridData();
    data.horizontalAlignment = GridData.FILL;
    data.grabExcessHorizontalSpace = true;
    basePanel.setLayoutData(data);

    Composite group1 = new Composite(basePanel, SWT.NONE);
    group1.setFont(getFont());
    layout = new GridLayout();
    layout.numColumns = 1;
    group1.setLayout(layout);
    data = new GridData();
    data.verticalAlignment = GridData.FILL;
    data.horizontalAlignment = GridData.FILL;
    group1.setLayoutData(data);

    Label documentLabel = new Label(group1, SWT.LEFT);
    documentLabel.setText(WSIUIPlugin.getResourceString("_UI_WIZARD_V_INCLUDE_WSDL_LABEL"));
    data = new GridData();
    data.horizontalAlignment = GridData.FILL;
    documentLabel.setLayoutData(data);
    /**
	 * Label label = new Label(basePanel, SWT.LEFT); data = new GridData();
	 * data.horizontalAlignment = GridData.FILL; data.horizontalSpan = 1;
	 * label.setLayoutData(data);
	 */
    fileField = new Combo(group1, SWT.DROP_DOWN);
    String[] wsdllocations = ((ValidationWizard) getWizard()).getWSDLLocations();
    if(wsdllocations != null)
    {
      int numlocs = wsdllocations.length;
      for(int i = 0; i < numlocs; i++)
      {
      	fileField.add(wsdllocations[i]);
      }
    }
    data = new GridData();
    data.horizontalAlignment = GridData.FILL;
    data.grabExcessHorizontalSpace = true;
    data.verticalAlignment = GridData.FILL;
    data.grabExcessVerticalSpace = true;
    data.widthHint = 30;
    fileField.setLayoutData(data);
    fileField.addModifyListener(new FileFieldListener());

    Label wsdlLabel = new Label(group1, SWT.LEFT);
    wsdlLabel.setText(WSIUIPlugin.getResourceString("_UI_WIZARD_V_VALID_WSDL_LABEL"));
    data = new GridData();
    data.horizontalAlignment = GridData.FILL;
    documentLabel.setLayoutData(data);

    // documentLocationText = new Text(documentGroup, SWT.SINGLE | SWT.BORDER);
    // data = new GridData();
    // data.horizontalAlignment = GridData.FILL;
    // data.grabExcessHorizontalSpace = true;
    // data.widthHint = 30;
    // documentLocationText.setLayoutData(data);

    Composite group = new Composite(basePanel, SWT.NONE);
    group.setFont(getFont());
    layout = new GridLayout();
    layout.numColumns = 1;
    group.setLayout(layout);
    data = new GridData();
    data.verticalAlignment = GridData.FILL;
    data.horizontalAlignment = GridData.FILL;
    group.setLayoutData(data);

    Button workspaceButton = new Button(group, SWT.PUSH);
    workspaceButton.setText(WSIUIPlugin.getResourceString("_UI_WIZARD_V_WORKBENCH_BUTTON"));
    data = new GridData();
    data.horizontalAlignment = GridData.FILL;
    workspaceButton.setLayoutData(data);
    workspaceButton.addSelectionListener(new WorkspaceButtonListener());

    Button browseButton = new Button(group, SWT.PUSH);
    browseButton.setText(WSIUIPlugin.getResourceString("_UI_WIZARD_V_BROWSE_BUTTON"));
    data = new GridData();
    data.horizontalAlignment = GridData.FILL;
    browseButton.setLayoutData(data);
    browseButton.addSelectionListener(new BrowseButtonListener());

    // Button searchUDDIButton = new Button(group, SWT.PUSH);
    // searchUDDIButton.setText(WSIUIPlugin.getResourceString("_UI_WIZARD_V_SEARCH_UDDI_BUTTON"));
    // data = new GridData();
    // data.horizontalAlignment = GridData.FILL;
    // searchUDDIButton.setLayoutData(data);
    // searchUDDIButton.addSelectionListener(new SearchUDDIButtonListener());

    return documentGroup;
  }

  public boolean includeWSDLFile()
  {
    return includeWSDLButton.getSelection();
  }

  public String getWSDLFile()
  {
    return fileField.getText();
  }

  /**
   * Always return true.
   */
  public boolean performFinish()
  {
    return true;
  }

  /**
   * Sent when default selection occurs in the control.
   * 
   * @param e -
   *            an event containing information about the selection
   */
  public void widgetDefaultSelected(SelectionEvent e)
  {}

  /**
   * Handles the includeWSDL checkbox. Sent when selection occurs in the
   * control.
   * 
   * @param e -
   *            an event containing information about the selection
   */
  public void widgetSelected(SelectionEvent e)
  {
    if (e.widget == includeWSDLButton)
    {
      if (includeWSDLButton.getSelection())
      {
        documentGroup.setVisible(true);
      }
      else
      {
        documentGroup.setVisible(false);
      }
      getContainer().updateButtons();
    }
  }

  public void setWSDLInvalid()
  {
    wsdlinvalid = true;
  }

  /**
   * Add value to the list box
   */
  class WorkspaceButtonListener implements SelectionListener
  {
    public void widgetDefaultSelected(SelectionEvent e)
    {}

    public void widgetSelected(SelectionEvent e)
    {
      SelectSingleFileDialog dialog = new SelectSingleFileDialog(getShell(), selection, false);
      dialog.addFilterExtensions(new String[] { ".wsdl" });
      int result = dialog.open();

      if (result == Window.OK)
      {
        IFile currentIFile = dialog.getFile();
        if (currentIFile != null)
        {
          fileField.add(currentIFile.getLocation().toString(), 0);
          fileField.select(0);
        }
      }
    }
  }

  /**
   * Add value to the list box
   */
  class BrowseButtonListener implements SelectionListener
  {
    public void widgetDefaultSelected(SelectionEvent e)
    {}

    public void widgetSelected(SelectionEvent e)
    {
      FileDialog dialog = new FileDialog(getShell());
      dialog.setFilterExtensions(new String[] { "*.wsdl" });
      String selection = dialog.open();
      if (selection != null)
      {
        fileField.add(selection, 0);
        fileField.select(0);
      }
    }
  }

  /**
   * Add value to the list box
   */
  // class SearchUDDIButtonListener implements SelectionListener
  // {
  //  public void widgetDefaultSelected(SelectionEvent e)
  //  {}
  //
  //  public void widgetSelected(SelectionEvent e)
  //  {
  //    String title = "Information";
  //    String message = "The chosen operation is not currently available.";
  //    MessageDialog.openInformation(Display.getDefault().getActiveShell(), title, message);
  //  }
  //}

  /**
   * Add value to the file field.
   */
  class FileFieldListener implements ModifyListener
  {

    /*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
	 */
    public void modifyText(ModifyEvent e)
    {
      wsdlinvalid = false;
      getContainer().updateButtons();

    }

  }

}
