org.eclipse.tm.te.tcf.ui.dialogs.AgentSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.tm.te.tcf.ui.dialogs.AgentSelectionDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Wind River Systems, Inc. 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:
 * Wind River Systems - initial API and implementation
 *******************************************************************************/
package org.eclipse.tm.te.tcf.ui.dialogs;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.tm.tcf.protocol.Protocol;
import org.eclipse.tm.te.tcf.locator.interfaces.nodes.ILocatorModel;
import org.eclipse.tm.te.tcf.locator.interfaces.nodes.IPeerModel;
import org.eclipse.tm.te.tcf.locator.interfaces.services.ILocatorModelLookupService;
import org.eclipse.tm.te.tcf.ui.internal.help.IContextHelpIds;
import org.eclipse.tm.te.tcf.ui.internal.navigator.LabelProviderDelegate;
import org.eclipse.tm.te.tcf.ui.model.Model;
import org.eclipse.tm.te.tcf.ui.nls.Messages;
import org.eclipse.tm.te.ui.jface.dialogs.CustomTitleAreaDialog;
import org.eclipse.tm.te.ui.swt.SWTControlUtil;

/**
 * TCF agent selection dialog implementation.
 */
public class AgentSelectionDialog extends CustomTitleAreaDialog {
    // The list of remote services the agents must provide to be included
    /* default */ final String[] services;

    // The table viewer
    private TableViewer viewer;

    // The selection. Will be filled in if either "OK" or "Cancel" is pressed
    private ISelection selection;

    /**
     * Constructor.
     *
     * @param services The list of (remote) services the agents must provide to be selectable, or <code>null</code>.
     */
    public AgentSelectionDialog(String[] services) {
        this(null, services);
    }

    /**
     * Constructor.
     *
     * @param parent The parent shell used to view the dialog, or <code>null</code>.
     * @param services The list of (remote) services the agents must provide to be selectable, or <code>null</code>.
     */
    public AgentSelectionDialog(Shell parent, String[] services) {
        super(parent, IContextHelpIds.AGENT_SELECTION_DIALOG);

        this.services = services != null && services.length > 0 ? services : null;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#isResizable()
     */
    @Override
    protected boolean isResizable() {
        return true;
    }

    /* (non-Javadoc)
     * @see org.eclipse.tm.te.ui.jface.dialogs.CustomTitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        Composite top = (Composite) super.createDialogArea(parent);

        setDialogTitle(getDialogTitle());
        setTitle(getTitle());
        setDefaultMessage(getDefaultMessage(), IMessageProvider.NONE);

        // Create the table viewer
        viewer = new TableViewer(top, SWT.MULTI | SWT.BORDER);

        // Configure the table
        Table table = viewer.getTable();

        @SuppressWarnings("unused")
        TableColumn column = new TableColumn(table, SWT.LEFT);

        TableLayout tableLayout = new TableLayout();
        tableLayout.addColumnData(new ColumnWeightData(100));
        table.setLayout(tableLayout);

        GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
        table.setLayoutData(layoutData);

        viewer.setContentProvider(new ArrayContentProvider());
        LabelProviderDelegate labelProvider = new LabelProviderDelegate() {
            /* (non-Javadoc)
             * @see org.eclipse.tm.te.tcf.ui.internal.navigator.LabelProviderDelegate#decorateImage(org.eclipse.swt.graphics.Image, java.lang.Object)
             */
            @Override
            public Image decorateImage(Image image, Object element) {
                return image;
            }
        };
        viewer.setLabelProvider(new DecoratingLabelProvider(labelProvider, labelProvider));

        // The content to show is static. Do the filtering manually so that
        // we can disable the OK Button if the dialog would not show any content.
        final ILocatorModelLookupService service = getModel().getService(ILocatorModelLookupService.class);
        final List<IPeerModel> nodes = new ArrayList<IPeerModel>();
        if (service != null) {
            Protocol.invokeAndWait(new Runnable() {
                @Override
                public void run() {
                    nodes.addAll(Arrays.asList(service.lkupPeerModelBySupportedServices(null, services)));
                }
            });
        }
        viewer.setInput(nodes.size() > 0 ? nodes.toArray(new IPeerModel[nodes.size()]) : null);

        return top;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createButtonBar(Composite parent) {
        Control buttonBar = super.createButtonBar(parent);

        // Adjust the OK button enablement
        Button okButton = getButton(IDialogConstants.OK_ID);
        SWTControlUtil.setEnabled(okButton,
                viewer.getInput() != null && ((IPeerModel[]) viewer.getInput()).length > 0);

        return buttonBar;
    }

    /**
     * Returns the dialog title.
     *
     * @return The dialog title.
     */
    protected String getDialogTitle() {
        return Messages.AgentSelectionDialog_dialogTitle;
    }

    /**
     * Returns the title.
     *
     * @return The title.
     */
    protected String getTitle() {
        return Messages.AgentSelectionDialog_title;
    }

    /**
     * Returns the default message.
     *
     * @return The default message.
     */
    protected String getDefaultMessage() {
        return Messages.AgentSelectionDialog_message;
    }

    /**
     * Returns the locator model instance to use for determining
     * the dialogs input.
     *
     * @return The locator model instance.
     */
    protected ILocatorModel getModel() {
        return Model.getModel();
    }

    /**
     * Returns the selection which had been set to the viewer at
     * the time of closing the dialog with either "OK" or "Cancel".
     *
     * @return The selection or <code>null</code>.
     */
    public ISelection getSelection() {
        return selection;
    }

    /* (non-Javadoc)
     * @see org.eclipse.tm.te.ui.jface.dialogs.CustomTitleAreaDialog#okPressed()
     */
    @Override
    protected void okPressed() {
        selection = viewer.getSelection();
        super.okPressed();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#cancelPressed()
     */
    @Override
    protected void cancelPressed() {
        selection = null;
        super.cancelPressed();
    }
}