blob: d00bc7f57bd5d4f3cdfd4864123eb64f2b184520 [file] [log] [blame]
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.ddms;
import com.android.ddmuilib.TableHelper;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Dialog to configure the static debug ports.
*
*/
public class StaticPortConfigDialog extends Dialog {
/** Preference name for the 0th column width */
private static final String PREFS_DEVICE_COL = "spcd.deviceColumn"; //$NON-NLS-1$
/** Preference name for the 1st column width */
private static final String PREFS_APP_COL = "spcd.AppColumn"; //$NON-NLS-1$
/** Preference name for the 2nd column width */
private static final String PREFS_PORT_COL = "spcd.PortColumn"; //$NON-NLS-1$
private static final int COL_DEVICE = 0;
private static final int COL_APPLICATION = 1;
private static final int COL_PORT = 2;
private static final int DLG_WIDTH = 500;
private static final int DLG_HEIGHT = 300;
private Shell mShell;
private Shell mParent;
private Table mPortTable;
/**
* Array containing the list of already used static port to avoid
* duplication.
*/
private ArrayList<Integer> mPorts = new ArrayList<Integer>();
/**
* Basic constructor.
* @param parent
*/
public StaticPortConfigDialog(Shell parent) {
super(parent, SWT.DIALOG_TRIM | SWT.BORDER | SWT.APPLICATION_MODAL);
}
/**
* Open and display the dialog. This method returns only when the
* user closes the dialog somehow.
*
*/
public void open() {
createUI();
if (mParent == null || mShell == null) {
return;
}
updateFromStore();
// Set the dialog size.
mShell.setMinimumSize(DLG_WIDTH, DLG_HEIGHT);
Rectangle r = mParent.getBounds();
// get the center new top left.
int cx = r.x + r.width/2;
int x = cx - DLG_WIDTH / 2;
int cy = r.y + r.height/2;
int y = cy - DLG_HEIGHT / 2;
mShell.setBounds(x, y, DLG_WIDTH, DLG_HEIGHT);
mShell.pack();
// actually open the dialog
mShell.open();
// event loop until the dialog is closed.
Display display = mParent.getDisplay();
while (!mShell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
/**
* Creates the dialog ui.
*/
private void createUI() {
mParent = getParent();
mShell = new Shell(mParent, getStyle());
mShell.setText("Static Port Configuration");
mShell.setLayout(new GridLayout(1, true));
mShell.addListener(SWT.Close, new Listener() {
public void handleEvent(Event event) {
event.doit = true;
}
});
// center part with the list on the left and the buttons
// on the right.
Composite main = new Composite(mShell, SWT.NONE);
main.setLayoutData(new GridData(GridData.FILL_BOTH));
main.setLayout(new GridLayout(2, false));
// left part: list view
mPortTable = new Table(main, SWT.SINGLE | SWT.FULL_SELECTION);
mPortTable.setLayoutData(new GridData(GridData.FILL_BOTH));
mPortTable.setHeaderVisible(true);
mPortTable.setLinesVisible(true);
TableHelper.createTableColumn(mPortTable, "Device Serial Number",
SWT.LEFT, "emulator-5554", //$NON-NLS-1$
PREFS_DEVICE_COL, PrefsDialog.getStore());
TableHelper.createTableColumn(mPortTable, "Application Package",
SWT.LEFT, "com.android.samples.phone", //$NON-NLS-1$
PREFS_APP_COL, PrefsDialog.getStore());
TableHelper.createTableColumn(mPortTable, "Debug Port",
SWT.RIGHT, "Debug Port", //$NON-NLS-1$
PREFS_PORT_COL, PrefsDialog.getStore());
// right part: buttons
Composite buttons = new Composite(main, SWT.NONE);
buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
buttons.setLayout(new GridLayout(1, true));
Button newButton = new Button(buttons, SWT.NONE);
newButton.setText("New...");
newButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
StaticPortEditDialog dlg = new StaticPortEditDialog(mShell,
mPorts);
if (dlg.open()) {
// get the text
String device = dlg.getDeviceSN();
String app = dlg.getAppName();
int port = dlg.getPortNumber();
// add it to the list
addEntry(device, app, port);
}
}
});
final Button editButton = new Button(buttons, SWT.NONE);
editButton.setText("Edit...");
editButton.setEnabled(false);
editButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int index = mPortTable.getSelectionIndex();
String oldDeviceName = getDeviceName(index);
String oldAppName = getAppName(index);
String oldPortNumber = getPortNumber(index);
StaticPortEditDialog dlg = new StaticPortEditDialog(mShell,
mPorts, oldDeviceName, oldAppName, oldPortNumber);
if (dlg.open()) {
// get the text
String deviceName = dlg.getDeviceSN();
String app = dlg.getAppName();
int port = dlg.getPortNumber();
// add it to the list
replaceEntry(index, deviceName, app, port);
}
}
});
final Button deleteButton = new Button(buttons, SWT.NONE);
deleteButton.setText("Delete");
deleteButton.setEnabled(false);
deleteButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int index = mPortTable.getSelectionIndex();
removeEntry(index);
}
});
// bottom part with the ok/cancel
Composite bottomComp = new Composite(mShell, SWT.NONE);
bottomComp.setLayoutData(new GridData(
GridData.HORIZONTAL_ALIGN_CENTER));
bottomComp.setLayout(new GridLayout(2, true));
Button okButton = new Button(bottomComp, SWT.NONE);
okButton.setText("OK");
okButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateStore();
mShell.close();
}
});
Button cancelButton = new Button(bottomComp, SWT.NONE);
cancelButton.setText("Cancel");
cancelButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
mShell.close();
}
});
mPortTable.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// get the selection index
int index = mPortTable.getSelectionIndex();
boolean enabled = index != -1;
editButton.setEnabled(enabled);
deleteButton.setEnabled(enabled);
}
});
mShell.pack();
}
/**
* Add a new entry in the list.
* @param deviceName the serial number of the device
* @param appName java package for the application
* @param portNumber port number
*/
private void addEntry(String deviceName, String appName, int portNumber) {
// create a new item for the table
TableItem item = new TableItem(mPortTable, SWT.NONE);
item.setText(COL_DEVICE, deviceName);
item.setText(COL_APPLICATION, appName);
item.setText(COL_PORT, Integer.toString(portNumber));
// add the port to the list of port number used.
mPorts.add(portNumber);
}
/**
* Remove an entry from the list.
* @param index The index of the entry to be removed
*/
private void removeEntry(int index) {
// remove from the ui
mPortTable.remove(index);
// and from the port list.
mPorts.remove(index);
}
/**
* Replace an entry in the list with new values.
* @param index The index of the item to be replaced
* @param deviceName the serial number of the device
* @param appName The new java package for the application
* @param portNumber The new port number.
*/
private void replaceEntry(int index, String deviceName, String appName, int portNumber) {
// get the table item by index
TableItem item = mPortTable.getItem(index);
// set its new value
item.setText(COL_DEVICE, deviceName);
item.setText(COL_APPLICATION, appName);
item.setText(COL_PORT, Integer.toString(portNumber));
// and replace the port number in the port list.
mPorts.set(index, portNumber);
}
/**
* Returns the device name for a specific index
* @param index The index
* @return the java package name of the application
*/
private String getDeviceName(int index) {
TableItem item = mPortTable.getItem(index);
return item.getText(COL_DEVICE);
}
/**
* Returns the application name for a specific index
* @param index The index
* @return the java package name of the application
*/
private String getAppName(int index) {
TableItem item = mPortTable.getItem(index);
return item.getText(COL_APPLICATION);
}
/**
* Returns the port number for a specific index
* @param index The index
* @return the port number
*/
private String getPortNumber(int index) {
TableItem item = mPortTable.getItem(index);
return item.getText(COL_PORT);
}
/**
* Updates the ui from the value in the preference store.
*/
private void updateFromStore() {
// get the map from the debug port manager
DebugPortProvider provider = DebugPortProvider.getInstance();
Map<String, Map<String, Integer>> map = provider.getPortList();
// we're going to loop on the keys and fill the table.
Set<String> deviceKeys = map.keySet();
for (String deviceKey : deviceKeys) {
Map<String, Integer> deviceMap = map.get(deviceKey);
if (deviceMap != null) {
Set<String> appKeys = deviceMap.keySet();
for (String appKey : appKeys) {
Integer port = deviceMap.get(appKey);
if (port != null) {
addEntry(deviceKey, appKey, port);
}
}
}
}
}
/**
* Update the store from the content of the ui.
*/
private void updateStore() {
// create a new Map object and fill it.
HashMap<String, Map<String, Integer>> map = new HashMap<String, Map<String, Integer>>();
int count = mPortTable.getItemCount();
for (int i = 0 ; i < count ; i++) {
TableItem item = mPortTable.getItem(i);
String deviceName = item.getText(COL_DEVICE);
Map<String, Integer> deviceMap = map.get(deviceName);
if (deviceMap == null) {
deviceMap = new HashMap<String, Integer>();
map.put(deviceName, deviceMap);
}
deviceMap.put(item.getText(COL_APPLICATION), Integer.valueOf(item.getText(COL_PORT)));
}
// set it in the store through the debug port manager.
DebugPortProvider provider = DebugPortProvider.getInstance();
provider.setPortList(map);
}
}