/*******************************************************************************
* Copyright (c) 2010, 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.tcf.internal.debug.ui.launch.setup;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
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.Event;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.tcf.internal.debug.ui.ImageCache;
import org.eclipse.tcf.protocol.IPeer;
public class PeerPropsControl {
private static final int
SIZING_TABLE_WIDTH = 400,
SIZING_TABLE_HEIGHT = 200;
private static final String[] column_names = { "Name", "Value" };
private final Map<String,String> attrs;
private final ArrayList<Attribute> attr_table_data;
private final boolean create_new;
private final boolean enable_editing;
private final Runnable listener;
private Text id_text;
private Text name_text;
private Table attr_table;
private TableViewer table_viewer;
private Image attr_image;
private class Attribute {
String name;
String value;
}
private class AttributeLabelProvider extends LabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int column) {
if (column == 0) return attr_image;
return null;
}
public String getColumnText(Object element, int column) {
Attribute a = (Attribute)element;
return column == 0 ? a.name : a.value;
}
public String getText(Object element) {
TableColumn column = attr_table.getSortColumn();
if (column == null) return "";
return getColumnText(element, attr_table.indexOf(column));
}
}
public PeerPropsControl(Composite parent, Map<String,String> attrs, boolean enable_editing, Runnable listener) {
this.attrs = attrs;
this.enable_editing = enable_editing;
this.listener = listener;
create_new = attrs.get(IPeer.ATTR_ID) == null;
attr_table_data = new ArrayList<Attribute>();
createTextFields(parent);
createAttrTable(parent);
}
private void createTextFields(Composite parent) {
Font font = parent.getFont();
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
composite.setFont(font);
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label id_label = new Label(composite, SWT.WRAP);
id_label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
id_label.setFont(font);
id_label.setText("Peer &ID:");
id_text = new Text(composite, SWT.SINGLE | SWT.BORDER);
id_text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
id_text.setFont(font);
id_text.setEditable(false);
Label name_label = new Label(composite, SWT.WRAP);
name_label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
name_label.setFont(font);
name_label.setText("Peer &name:");
name_text = new Text(composite, SWT.SINGLE | SWT.BORDER);
name_text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
name_text.setFont(font);
name_text.setEditable(enable_editing);
name_text.addListener(SWT.KeyUp, new Listener() {
public void handleEvent(Event event) {
listener.run();
}
});
}
private void createAttrTable(Composite parent) {
Font font = parent.getFont();
Label props_label = new Label(parent, SWT.WRAP);
props_label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
props_label.setFont(font);
props_label.setText("Peer &properties:");
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
composite.setFont(font);
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, 2, 1));
attr_table = new Table(composite, SWT.SINGLE | SWT.BORDER |
SWT.H_SCROLL | SWT.V_SCROLL |
SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
attr_table.setFont(font);
GridData data = new GridData(GridData.FILL_BOTH);
data.widthHint = SIZING_TABLE_WIDTH;
data.heightHint = SIZING_TABLE_HEIGHT;
attr_table.setLayoutData(data);
for (int i = 0; i < column_names.length; i++) {
final TableColumn column = new TableColumn(attr_table, SWT.LEAD, i);
column.setMoveable(false);
column.setText(column_names[i]);
column.setWidth(SIZING_TABLE_WIDTH / column_names.length);
column.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (column == attr_table.getSortColumn()) {
switch (attr_table.getSortDirection()) {
case SWT.NONE:
attr_table.setSortDirection(SWT.DOWN);
break;
case SWT.DOWN:
attr_table.setSortDirection(SWT.UP);
break;
case SWT.UP:
attr_table.setSortDirection(SWT.NONE);
break;
}
}
else {
attr_table.setSortColumn(column);
attr_table.setSortDirection(SWT.DOWN);
}
table_viewer.refresh();
}
});
}
attr_table.setHeaderVisible(true);
attr_table.setLinesVisible(true);
attr_image = ImageCache.getImage(ImageCache.IMG_ATTRIBUTE);
table_viewer = new TableViewer(attr_table);
table_viewer.setUseHashlookup(true);
table_viewer.setColumnProperties(column_names);
CellEditor[] editors = new CellEditor[column_names.length];
for (int i = 0; i < column_names.length; i++) {
TextCellEditor editor = new TextCellEditor(attr_table);
((Text)editor.getControl()).setTextLimit(250);
editors[i] = editor;
}
table_viewer.setCellEditors(editors);
table_viewer.setCellModifier(new ICellModifier() {
public boolean canModify(Object element, String property) {
return enable_editing;
}
public Object getValue(Object element, String property) {
if (element instanceof Item) element = ((Item)element).getData();
Attribute a = (Attribute)element;
return property.equals(column_names[0]) ? a.name : a.value;
}
public void modify(Object element, String property, Object value) {
if (element instanceof Item) element = ((Item)element).getData();
Attribute a = (Attribute)element;
if (property.equals(column_names[0])) {
a.name = (String)value;
}
else {
a.value = (String)value;
}
table_viewer.update(element, new String[] { property });
}
});
String[] keys = attrs.keySet().toArray(new String[attrs.size()]);
Arrays.sort(keys);
for (String key : keys) {
if (key.equals(IPeer.ATTR_ID)) {
id_text.setText(attrs.get(key));
}
else if (key.equals(IPeer.ATTR_NAME)) {
name_text.setText(attrs.get(key));
}
else {
Attribute a = new Attribute();
a.name = key;
a.value = attrs.get(key);
attr_table_data.add(a);
}
}
if (create_new) id_text.setText("USR:" + System.currentTimeMillis());
table_viewer.setContentProvider(new IStructuredContentProvider() {
public Object[] getElements(Object input) {
assert input == attr_table_data;
return attr_table_data.toArray();
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
});
table_viewer.setLabelProvider(new AttributeLabelProvider());
table_viewer.setInput(attr_table_data);
table_viewer.setComparator(new ViewerComparator() {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
switch (attr_table.getSortDirection()) {
case SWT.UP : return -super.compare(viewer, e1, e2);
case SWT.DOWN: return +super.compare(viewer, e1, e2);
}
return 0;
}
});
createTableButtons(composite);
}
private void createTableButtons(Composite parent) {
Font font = parent.getFont();
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
composite.setFont(font);
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
final Button button_new = new Button(composite, SWT.PUSH);
button_new.setText("&Add");
button_new.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
button_new.setEnabled(enable_editing);
button_new.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Attribute a = new Attribute();
a.name = "";
a.value = "";
attr_table_data.add(a);
table_viewer.add(a);
table_viewer.setSelection(new StructuredSelection(a), true);
attr_table.setFocus();
}
});
final Button button_remove = new Button(composite, SWT.PUSH);
button_remove.setText("&Remove");
button_remove.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
button_remove.setEnabled(enable_editing);
button_remove.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Attribute a = (Attribute) ((IStructuredSelection)
table_viewer.getSelection()).getFirstElement();
if (a == null) return;
attr_table_data.remove(a);
table_viewer.remove(a);
}
});
}
public boolean isComplete() {
return name_text.getText().length() > 0;
}
public void okPressed() {
if (enable_editing) {
if (create_new) attrs.put(IPeer.ATTR_ID, id_text.getText());
String id = attrs.get(IPeer.ATTR_ID);
String nm = name_text.getText();
attrs.clear();
for (Attribute a : attr_table_data) attrs.put(a.name, a.value);
attrs.put(IPeer.ATTR_ID, id);
attrs.put(IPeer.ATTR_NAME, nm);
}
}
}