/******************************************************************************** * Copyright (c) 2012, 2014 MontaVista Software, LLC. * 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: * Anna Dushistova (MontaVista) - initial API and implementation ********************************************************************************/ package org.eclipse.tcf.te.tcf.launch.cdt.controls; import java.util.concurrent.atomic.AtomicReference; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.tcf.protocol.Protocol; import org.eclipse.tcf.te.tcf.launch.cdt.activator.Activator; import org.eclipse.tcf.te.tcf.launch.cdt.nls.Messages; import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; import org.eclipse.tcf.te.tcf.locator.model.ModelManager; public class TCFPeerSelector { protected Combo combo; protected Label label; protected IPeerNode[] peers = null; private Composite composite; public TCFPeerSelector(Composite parent, int style, int numberOfColumns) { composite = new Composite(parent, style); GridLayout layout = new GridLayout(numberOfColumns, false); layout.marginHeight = 0; layout.marginWidth = 0; composite.setLayout(layout); label = new Label(composite, SWT.NONE); label.setText(Messages.TCFPeerSelector_0); label.setLayoutData(new GridData(SWT.BEGINNING)); combo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY); combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); refreshCombo(); } public void setEnabled(boolean enabled) { composite.setEnabled(enabled); label.setEnabled(enabled); combo.setEnabled(enabled); } public boolean isDisposed() { return composite == null || composite.isDisposed(); } public void setLayoutData(Object layoutData) { if (composite != null) { composite.setLayoutData(layoutData); } } public void addSelectionListener(SelectionListener listener) { combo.addSelectionListener(listener); } public void removeSelectionListener(SelectionListener listener) { combo.removeSelectionListener(listener); } public void addModifyListener(ModifyListener listener) { combo.addModifyListener(listener); } public void removeModifyListener(ModifyListener listener) { combo.removeModifyListener(listener); } /** * Get the selected peer. */ public IPeerNode getPeerNode() { if (peers != null && !combo.isDisposed()) { int selectionIndex = combo.getSelectionIndex(); if (selectionIndex >= 0 && selectionIndex < peers.length) { return peers[selectionIndex]; } } return null; } /** * Get the selected peerId. */ public String getPeerId() { if (peers != null && !combo.isDisposed()) { int selectionIndex = combo.getSelectionIndex(); if (selectionIndex >= 0 && selectionIndex < peers.length) { return peers[selectionIndex].getPeerId(); } } return null; } public void updateSelectionFrom(String peerId) { int newSelectedIndex = -1; for (int i = 0; i < peers.length; i++) { if (peers[i].getPeerId().equals(peerId)) { newSelectedIndex = i; break; } } if (newSelectedIndex >= 0) { combo.select(newSelectedIndex); } } protected void refreshCombo() { Activator.getDefault().initializeTE(); peers = ModelManager.getPeerModel().getPeerNodes(); int newSelectedIndex = 0; for (int i = 0; i < peers.length; i++) { final AtomicReference<String> name = new AtomicReference<String>(); final int index = i; Runnable runnable = new Runnable() { @Override public void run() { name.set(peers[index].getName()); } }; Protocol.invokeAndWait(runnable); combo.add(name.get()); } combo.select(newSelectedIndex); } }