debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/newwizard/ConnectToDeviceDialog.java
branchRCL_2_4
changeset 911 81a2e70a37d7
child 953 68b6a294ab01
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/newwizard/ConnectToDeviceDialog.java	Tue Feb 09 15:35:02 2010 -0600
@@ -0,0 +1,273 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+package com.nokia.cdt.internal.debug.launch.newwizard;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import com.nokia.carbide.remoteconnections.RemoteConnectionsActivator;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectedService;
+import com.nokia.carbide.remoteconnections.interfaces.IConnection;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectionType;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectionTypeProvider;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager;
+import com.nokia.carbide.remoteconnections.interfaces.IConnectionsManager.IConnectionListener;
+import com.nokia.carbide.remoteconnections.settings.ui.SettingsWizard;
+
+/**
+ *	This dialog allows in-depth configuration of the connection settings.
+ */
+@SuppressWarnings("restriction")
+public class ConnectToDeviceDialog extends AbstractLaunchSettingsDialog implements IConnectionListener {
+	private IConnectionsManager manager;
+	private IConnectionTypeProvider typeProvider;
+	private ComboViewer viewer;
+	private Button editButton;
+	private Label descriptionLabel;
+
+	protected ConnectToDeviceDialog(Shell shell, LaunchOptionsData data) {
+		super(shell, data);
+		manager = RemoteConnectionsActivator.getConnectionsManager();
+		typeProvider = RemoteConnectionsActivator.getConnectionTypeProvider();
+	}
+	
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		final Composite composite = initDialogArea(parent, 
+				"Change connection",
+				LaunchWizardHelpIds.WIZARD_DIALOG_CHANGE_CONNECTION);
+		
+		Composite viewerGroup = new Composite(composite, SWT.NONE);
+		GridDataFactory.fillDefaults().applyTo(viewerGroup);
+		GridLayoutFactory.swtDefaults().numColumns(3).applyTo(viewerGroup);
+		
+		Label label = new Label(viewerGroup, SWT.NONE);
+		label.setText("Current connection");
+		GridDataFactory.defaultsFor(label).applyTo(label);
+		
+		viewer = new ComboViewer(viewerGroup, SWT.READ_ONLY);
+		viewer.setLabelProvider(new LabelProvider() {
+			@Override
+			public String getText(Object element) {
+				if (element instanceof IConnection)
+					return ((IConnection) element).getDisplayName();
+				
+				return "No Current connection";
+			}
+		});
+		viewer.setContentProvider(new ArrayContentProvider());
+		Combo combo = viewer.getCombo();
+		GridDataFactory.defaultsFor(combo).grab(true, false).applyTo(combo);
+		viewer.getControl().setData(UID, "combo_viewer"); //$NON-NLS-1$
+		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				if (getDialogArea() != null)
+					connectionSelected(getConnectionFromSelection(event.getSelection()));
+			}
+		});
+		manager.addConnectionListener(this);
+		
+		editButton = new Button(viewerGroup, SWT.PUSH);
+		editButton.setText("Edit...");
+		GridDataFactory.defaultsFor(editButton).applyTo(editButton);
+		editButton.setData(UID, "edit_button"); //$NON-NLS-1$
+		editButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				IConnection connection = getConnectionFromSelection(viewer.getSelection()); 
+				if (connection != null) {
+					SettingsWizard wizard = new SettingsWizard(connection, data.getService());
+					wizard.open(composite.getShell());
+				}
+			}
+		});
+
+		descriptionLabel = new Label(composite, SWT.WRAP);
+		GridDataFactory.defaultsFor(descriptionLabel).grab(false, true).applyTo(descriptionLabel);
+		composite.addControlListener(new ControlAdapter() {
+			@Override
+			public void controlResized(ControlEvent e) {
+				descriptionLabel.pack();
+			}
+		});
+		
+		setViewerInput(data.getConnection());
+
+		return composite;
+	}
+	
+	protected void validate() {
+		IStatus status = ConnectToDeviceSection.revalidate(data);
+
+		if (status.isOK()) {
+			IConnection connection = data.getConnection();
+			if (connection != null) {
+				IConnectedService connectedService = null;
+				Collection<IConnectedService> services = manager.getConnectedServices(connection);
+				if (services != null) {
+					for (IConnectedService service : services) {
+						if (service != null && service.getService().getIdentifier().equals(data.getService().getIdentifier())) {
+							connectedService = service;
+						}
+					}
+				}
+				
+				if (connectedService == null) {
+					status = error(MessageFormat.format(
+							"The selected connection does not support {0}",
+							data.getService().getDisplayName()));
+				}
+				else {
+					com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus serviceStatus = 
+						connectedService.getStatus();
+					if (!serviceStatus.getEStatus().equals(
+							com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus.EStatus.UP)) {
+						status = warning("The selected connection may not be usable for debugging:\n {0}", 
+								serviceStatus.getLongDescription());
+					}
+				}
+			}
+		}
+		updateStatus(status);
+	}
+
+	/**
+	 *	Update for a change in the connection.  We will attempt to connect to the
+	 *  device (once) to detect what TRK it is running.
+	 */
+	private void updateConnection(IConnection connection) {
+		String standardPNPMessage = ConnectToDeviceSection.getStandardPNPMessage();
+		data.setConnection(connection);
+		if (connection != null) {
+			descriptionLabel.setText(standardPNPMessage);
+		} else {
+			descriptionLabel.setText("No connections are detected or defined.  " + standardPNPMessage);
+		}
+		
+	}
+
+	public void connectionSelected(IConnection connection) {
+		updateConnection(connection);
+		validate();
+	}
+	
+	public void connectionAdded(IConnection connection) {
+		refreshUI();
+	}
+
+	public void connectionRemoved(IConnection connection) {
+		refreshUI();		
+	}
+
+	public void currentConnectionSet(IConnection connection) {
+		refreshUI();		
+	}
+
+	private Set<IConnectionType> getCompatibleConnectionTypes() {
+		HashSet<IConnectionType> types = new HashSet<IConnectionType>();
+		Collection<String> compatibleTypeIds =
+			typeProvider.getCompatibleConnectionTypeIds(data.getService());
+		for (String typeId : compatibleTypeIds) {
+			types.add(typeProvider.getConnectionType(typeId));
+		}
+		return types;
+	}
+
+	private List<IConnection> getCompatibleConnections() {
+		Set<IConnectionType> types = getCompatibleConnectionTypes();
+		
+		List<IConnection> compatibleConnections = new ArrayList<IConnection>();
+		for (IConnection connection : manager.getConnections()) {
+			if (types.contains(connection.getConnectionType()))
+				compatibleConnections.add(connection);
+		}
+		return compatibleConnections;
+	}
+	
+	private void setViewerInput(IConnection connection) {
+		List<IConnection> connections = getCompatibleConnections();
+		viewer.setInput(connections);
+		
+		if (connections.isEmpty())
+			viewer.getCombo().setEnabled(false);
+		else {
+			viewer.getCombo().setEnabled(true);
+			if (connection == null) {
+				viewer.getCombo().select(0);
+				ISelection selection = viewer.getSelection();
+				connection = getConnectionFromSelection(selection);
+				viewer.setSelection(selection);
+			}
+			else
+				viewer.setSelection(new StructuredSelection(connection));
+		}
+		editButton.setEnabled(!viewer.getSelection().isEmpty());
+		
+		// fire listener in case we selected anew or the current connection changed
+		connectionSelected(connection);
+	}
+	
+	private IConnection getConnectionFromSelection(ISelection selection) {
+		return (IConnection) ((IStructuredSelection) selection).getFirstElement();
+	}
+
+	private void refreshUI() {
+		Display.getDefault().syncExec(new Runnable() {
+			public void run() {
+				if (viewer != null && viewer.getContentProvider() != null) {
+					setViewerInput(getConnectionFromSelection(viewer.getSelection()));
+				}
+			}
+		});
+	}
+	
+	@Override
+	public boolean close() {
+		manager.addConnectionListener(this);
+		return super.close();
+	}
+}
+