blob: 38362faf4633ffae06d204ba57632c9f1544d0b6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 QNX Software Systems 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
*******************************************************************************/
package org.eclipse.cdt.arduino.ui.internal.remote;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map.Entry;
import org.eclipse.cdt.arduino.core.internal.HierarchicalProperties;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoManager;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoPackage;
import org.eclipse.cdt.arduino.core.internal.board.ArduinoPlatform;
import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection;
import org.eclipse.cdt.arduino.ui.internal.Activator;
import org.eclipse.cdt.arduino.ui.internal.Messages;
import org.eclipse.cdt.serial.SerialPort;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.remote.core.IRemoteConnectionWorkingCopy;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
public class BoardPropertyControl extends Composite {
private Combo portCombo;
private String[] portNames;
private String portName;
private Combo boardCombo;
private ArduinoBoard[] boards;
private ArduinoBoard board;
private List<SelectionListener> listeners = Collections.synchronizedList(new ArrayList<SelectionListener>());
private List<Control> menuControls = new ArrayList<>();
public BoardPropertyControl(Composite parent, int style) {
super(parent, style);
setLayout(new GridLayout(2, false));
Label portLabel = new Label(this, SWT.NONE);
portLabel.setText(Messages.NewArduinoTargetWizardPage_4);
portCombo = new Combo(this, SWT.NONE);
portCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
try {
portNames = SerialPort.list();
} catch (IOException e) {
portNames = new String[0];
Activator.log(e);
}
for (String portName : portNames) {
portCombo.add(portName);
}
if (portNames.length > 0) {
portCombo.select(0);
portName = portNames[0];
} else {
portName = ""; //$NON-NLS-1$
}
portCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
portName = portCombo.getText();
fireSelection();
}
});
Label boardLabel = new Label(this, SWT.NONE);
boardLabel.setText(Messages.ArduinoTargetPropertyPage_2);
boardCombo = new Combo(this, SWT.READ_ONLY);
boardCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
try {
List<ArduinoBoard> boardList = new ArrayList<>(
Activator.getService(ArduinoManager.class).getInstalledBoards());
Collections.sort(boardList, new Comparator<ArduinoBoard>() {
@Override
public int compare(ArduinoBoard o1, ArduinoBoard o2) {
return o1.getName().compareTo(o2.getName());
}
});
boards = boardList.toArray(new ArduinoBoard[boardList.size()]);
for (ArduinoBoard board : boards) {
boardCombo.add(board.getName());
}
boardCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boardChanged();
fireSelection();
}
});
if (boards.length > 0) {
// TODO use preference to remember the last selected board
boardCombo.select(0);
board = boards[0];
updateBoardMenu();
}
} catch (CoreException e) {
Activator.log(e);
}
}
public String getPortName() {
return portName;
}
public ArduinoBoard getSelectedBoard() {
return board;
}
public void addSelectionListener(SelectionListener listener) {
listeners.add(listener);
}
private void updateBoardMenu() {
HierarchicalProperties menus = board.getMenus();
if (menus != null) {
for (Entry<String, HierarchicalProperties> menuEntry : menus.getChildren().entrySet()) {
Label label = new Label(this, SWT.NONE);
label.setText(board.getPlatform().getMenuText(menuEntry.getKey()) + ':');
label.setData(menuEntry.getKey());
menuControls.add(label);
Combo combo = new Combo(this, SWT.READ_ONLY);
combo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
menuControls.add(combo);
List<String> ids = new ArrayList<>();
for (Entry<String, HierarchicalProperties> valueEntry : menuEntry.getValue().getChildren().entrySet()) {
String value = valueEntry.getValue().getValue();
if (value != null) {
combo.add(value);
ids.add(valueEntry.getKey());
}
}
combo.setData(ids);
combo.select(0);
}
}
}
private void boardChanged() {
int index = boardCombo.getSelectionIndex();
ArduinoBoard newBoard = index < 0 ? null : boards[index];
if (newBoard != board) {
// Clear out old menus
for (Control control : menuControls) {
control.dispose();
}
menuControls.clear();
board = newBoard;
updateBoardMenu();
layout();
getShell().pack();
redraw();
}
}
private void fireSelection() {
for (SelectionListener listener : listeners) {
Event event = new Event();
event.widget = this;
listener.widgetSelected(new SelectionEvent(event));
}
}
public void apply(IRemoteConnectionWorkingCopy workingCopy) {
ArduinoRemoteConnection.setBoardId(workingCopy, board);
ArduinoRemoteConnection.setPortName(workingCopy, portName);
String key = null;
for (Control control : menuControls) {
if (control instanceof Label) {
key = (String) control.getData();
} else if (control instanceof Combo) {
Combo combo = (Combo) control;
@SuppressWarnings("unchecked")
String value = ((List<String>) combo.getData()).get(combo.getSelectionIndex());
if (key != null) {
ArduinoRemoteConnection.setMenuValue(workingCopy, key, value);
}
}
}
}
}