/******************************************************************************* * 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(); } }