/*******************************************************************************
 * 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.jst.ws.internal.creation.ui.widgets.test;

import java.util.List;
import java.util.Vector;

import org.eclipse.jst.ws.internal.consumption.ui.widgets.test.WSDLTestLaunchCommand;
import org.eclipse.jst.ws.internal.data.TypeRuntimeServer;
import org.eclipse.jst.ws.internal.ui.common.UIUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.wst.command.env.core.common.Environment;
import org.eclipse.wst.command.env.core.common.MessageUtils;
import org.eclipse.wst.command.env.core.common.Status;
import org.eclipse.wst.command.env.core.selection.SelectionList;
import org.eclipse.wst.command.env.ui.widgets.SimpleWidgetDataContributor;
import org.eclipse.wst.command.env.ui.widgets.WidgetDataEvents;


public class ServiceTestWidget extends SimpleWidgetDataContributor
{
  private String pluginId_ = "org.eclipse.jst.ws.consumption.ui";
  private String createPluginId_ = "org.eclipse.jst.ws.creation.ui";

  private Combo testTypeCombo_;
  /*CONTEXT_ID PSTP0001 for the Test Type Combo box of the Service Test Page*/
  private final String INFOPOP_PSTP_COMBOBOX_TEST = "PSTP0001";
  private final String TOOLTIP_PSTP_COMBOBOX_TEST = "TOOLTIP_PSTP_COMBOBOX_TEST";

  private Button launchButton_;
  /*CONTEXT_ID PSTP0002 for the launch button of the Service Test Page*/
  private final String INFOPOP_PSTP_LAUNCH_BUTTON = "PSTP0002";
  private final String TOOLTIP_PSTP_LAUNCH_BUTTON = "TOOLTIP_PSTP_LAUNCH_BUTTON";
  
  private SelectionList facilities_;
  
  public WidgetDataEvents addControls( Composite parent, Listener statusListener )
  {
    MessageUtils msgUtils = new MessageUtils( pluginId_ + ".plugin", this );
    UIUtils      uiUtils  = new UIUtils(msgUtils, createPluginId_ );
        
    Composite testComposite = uiUtils.createComposite( parent, 3, 0, 0 );
    
    testTypeCombo_ = uiUtils.createCombo( testComposite, "LABEL_TEST_TYPES",
                                          TOOLTIP_PSTP_COMBOBOX_TEST,
                                          INFOPOP_PSTP_COMBOBOX_TEST,
                                          SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY );
    
    launchButton_ = uiUtils.createPushButton( testComposite, "BUTTON_LAUNCH_SERVICE_TEST",
                                          TOOLTIP_PSTP_LAUNCH_BUTTON,
                                          INFOPOP_PSTP_LAUNCH_BUTTON );
    launchButton_.addSelectionListener( new SelectionAdapter()
                                        {
                                          public void widgetSelected( SelectionEvent event )
                                          {
                                            handleLaunchButton();
                                          }
                                        });
    
     
    return this;
  }
  
  private TypeRuntimeServer serviceids;
  private String serverProject;
  private String wsdlURI;
  private String launchedServiceTestName = "";
  private Environment env;
  private List endpoints;
  
  private void handleLaunchButton()
  {
  	
  	String testID = testTypeCombo_.getText();
  	launchedServiceTestName = testID;
  	WSDLTestLaunchCommand wtlc = new WSDLTestLaunchCommand();
  	wtlc.setTestID(testID);
  	wtlc.setServiceTypeRuntimeServer(serviceids);
  	wtlc.setServerProject(serverProject);
  	wtlc.setWsdlURI(wsdlURI);
  	wtlc.setExternalBrowser(true);
  	wtlc.setEndpoint(endpoints);
  	Status status = wtlc.execute(env);
  }
  
  public void setServiceTestFacilities( SelectionList facilities )
  {
    facilities_ = facilities;
    testTypeCombo_.setItems( facilities.getList() );
    testTypeCombo_.select( facilities.getIndex() );
  }
  
  public SelectionList getServiceTestFacilities()
  {
    facilities_.setIndex( testTypeCombo_.getSelectionIndex() );
    return facilities_;
  }

  public String getTestID()
  {
  	return testTypeCombo_.getText();
  }
  
  public void setWsdlURI(String wsdlURI)
  {
  	this.wsdlURI = wsdlURI;
  }
    
  public void setServerProject(String serverProject)
  {
    this.serverProject = serverProject;
  }

  public void setServiceTypeRuntimeServer(TypeRuntimeServer serviceids)
  {
    this.serviceids = serviceids;
  }
  
  public String getLaunchedServiceTestName()
  {
    return launchedServiceTestName;
  }

  public void setEnvironment(Environment env)
  {
  	this.env = env;
  }

  public void setEndpoint(String endpoint)
  {
    if (endpoint != null && endpoint.length() > 0)
    {
      Vector v = new Vector();
      v.add(endpoint);
      setEndpoints(v);
    }
  }
  
  public void setEndpoints(List endpoints)
  {
    this.endpoints = endpoints;
  }
}
