com.nokia.cdt.internal.debug.launch.newwizard.ConnectToDeviceDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.cdt.internal.debug.launch.newwizard.ConnectToDeviceDialog.java

Source

/*
* 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.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.JFaceResources;
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.jface.viewers.StyledString;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
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.Group;
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.IConnectedService.IStatusChangedListener;
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;
import com.nokia.cpp.internal.api.utils.ui.LinkParser;
import com.nokia.cpp.internal.api.utils.ui.LinkParser.Element;

/**
 *   This dialog allows in-depth configuration of the connection settings.
 */
public class ConnectToDeviceDialog extends AbstractLaunchSettingsDialog
        implements IConnectionListener, IStatusChangedListener {
    private IConnectionsManager manager;
    private IConnectionTypeProvider typeProvider;
    private FontMetrics fm;
    private ComboViewer viewer;
    private Button editButton;
    private Label descriptionLabel;
    private Button newButton;
    private IConnectedService currentServiceListener;
    private IConnectionWizardData connectionData;

    protected ConnectToDeviceDialog(Shell shell, IWizardData data) {
        super(shell, data);
        manager = RemoteConnectionsActivator.getConnectionsManager();
        typeProvider = RemoteConnectionsActivator.getConnectionTypeProvider();
        connectionData = (IConnectionWizardData) data;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        initializeDialogUnits(parent);
        final Composite composite = initDialogArea(parent, Messages.getString("ConnectToDeviceDialog.Title"), //$NON-NLS-1$
                LaunchWizardHelpIds.WIZARD_DIALOG_CHANGE_CONNECTION);

        Group viewerGroup = new Group(composite, SWT.NONE);
        viewerGroup.setText(Messages.getString("ConnectToDeviceDialog.GroupLabel")); //$NON-NLS-1$
        GridDataFactory.fillDefaults().applyTo(viewerGroup);
        GridLayoutFactory.swtDefaults().applyTo(viewerGroup);

        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 Messages.getString("ConnectToDeviceDialog.NoCurrentItem"); //$NON-NLS-1$
            }
        });
        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);

        parent.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                manager.removeConnectionListener(ConnectToDeviceDialog.this);

                if (currentServiceListener != null)
                    currentServiceListener.removeStatusChangedListener(ConnectToDeviceDialog.this);
            }
        });

        final Composite buttonGroup = new Composite(viewerGroup, SWT.NONE);
        int w = Dialog.convertHorizontalDLUsToPixels(fm, IDialogConstants.HORIZONTAL_MARGIN);
        int h = Dialog.convertVerticalDLUsToPixels(fm, IDialogConstants.VERTICAL_MARGIN);
        int hs = Dialog.convertHorizontalDLUsToPixels(fm, IDialogConstants.HORIZONTAL_SPACING);
        int vs = Dialog.convertVerticalDLUsToPixels(fm, IDialogConstants.VERTICAL_SPACING);
        GridLayoutFactory.swtDefaults().numColumns(2).equalWidth(true).margins(w, h).spacing(hs, vs)
                .applyTo(buttonGroup);
        GridDataFactory.swtDefaults().align(SWT.END, SWT.CENTER).applyTo(buttonGroup);
        buttonGroup.setFont(parent.getFont());

        newButton = new Button(buttonGroup, SWT.PUSH);
        newButton.setText(Messages.getString("ConnectToDeviceDialog.NewLabel")); //$NON-NLS-1$
        newButton.setFont(JFaceResources.getDialogFont());
        int widthHint = Dialog.convertHorizontalDLUsToPixels(fm, IDialogConstants.BUTTON_WIDTH);
        Point minSize = newButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
        widthHint = Math.max(widthHint, minSize.x);
        GridDataFactory.swtDefaults().align(SWT.FILL, SWT.TOP).hint(widthHint, SWT.DEFAULT).applyTo(newButton);
        newButton.setData(UID, "newButton"); //$NON-NLS-1$
        newButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                SettingsWizard wizard = new SettingsWizard(null, connectionData.getService());
                wizard.open(composite.getShell());
                IConnection connection = wizard.getConnectionToEdit();
                setViewerInput(connection);
            }
        });

        editButton = new Button(buttonGroup, SWT.PUSH);
        editButton.setText(Messages.getString("ConnectToDeviceDialog.EditLabel")); //$NON-NLS-1$
        editButton.setFont(JFaceResources.getDialogFont());
        widthHint = Dialog.convertHorizontalDLUsToPixels(fm, IDialogConstants.BUTTON_WIDTH);
        minSize = editButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
        widthHint = Math.max(widthHint, minSize.x);
        GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).hint(widthHint, SWT.DEFAULT).applyTo(editButton);
        editButton.setData(UID, "editButton"); //$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, connectionData.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(connectionData.getConnection());

        return composite;
    }

    private void initializeDialogUnits(Composite parent) {
        GC gc = new GC(parent);
        gc.setFont(JFaceResources.getDialogFont());
        fm = gc.getFontMetrics();
        gc.dispose();
    }

    protected void validate() {
        IStatus status = ConnectToDeviceSection.revalidate(connectionData);

        if (status.isOK()) {
            IConnection connection = connectionData.getConnection();
            if (connection != null) {
                IConnectedService connectedService = findConnectedServiceFromConnection(connection);

                if (connectedService == null) {
                    status = error(MessageFormat.format(
                            Messages.getString("ConnectToDeviceDialog.ServiceNotSupportedError"), //$NON-NLS-1$
                            connectionData.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)) {
                        String description = serviceStatus.getLongDescription();
                        if (description != null) {
                            List<Element> elements = LinkParser.parseText(description);
                            StyledString styledString = LinkParser.getStyledString(elements);
                            description = styledString.getString();
                        }
                        status = warning(Messages.getString("ConnectToDeviceDialog.ServiceNotAvailWarning"), //$NON-NLS-1$
                                description == null ? "" : description); //$NON-NLS-1$
                    }
                }
            }
        }
        updateStatus(status);
    }

    private IConnectedService findConnectedServiceFromConnection(IConnection connection) {
        Collection<IConnectedService> services = manager.getConnectedServices(connection);
        for (IConnectedService connectedService : services) {
            if (connectedService != null && connectedService.getService().getIdentifier()
                    .equals(connectionData.getService().getIdentifier())) {
                return connectedService;
            }
        }
        return null;
    }

    /**
     *   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();
        connectionData.setConnection(connection);
        if (connection != null) {
            descriptionLabel.setText(standardPNPMessage);
        } else {
            descriptionLabel
                    .setText(Messages.getString("ConnectToDeviceDialog.NoConnectionsText") + standardPNPMessage); //$NON-NLS-1$
        }
        if (currentServiceListener != null)
            currentServiceListener.removeStatusChangedListener(this);
        currentServiceListener = findConnectedServiceFromConnection(connection);
        if (currentServiceListener != null)
            currentServiceListener.addStatusChangedListener(this);
    }

    protected void connectionSelected(IConnection connection) {
        updateConnection(connection);
        validate();
    }

    public void connectionAdded(IConnection connection) {
        refreshUI(null);
    }

    public void connectionRemoved(IConnection connection) {
        refreshUI(null);
    }

    public void currentConnectionSet(IConnection connection) {
        //      refreshUI(connection);
    }

    public void statusChanged(com.nokia.carbide.remoteconnections.interfaces.IConnectedService.IStatus status) {
        validate();
    }

    private Set<IConnectionType> getCompatibleConnectionTypes() {
        HashSet<IConnectionType> types = new HashSet<IConnectionType>();
        Collection<String> compatibleTypeIds = typeProvider
                .getCompatibleConnectionTypeIds(connectionData.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(final IConnection connection) {
        Display.getDefault().syncExec(new Runnable() {
            public void run() {
                if (viewer != null && viewer.getContentProvider() != null) {
                    IConnection connectionToSet = connection == null
                            ? getConnectionFromSelection(viewer.getSelection())
                            : connection;
                    setViewerInput(connectionToSet);
                }
            }
        });
    }
}