/*******************************************************************************
* Copyright (c) 2012 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.cdt.ui.breakpoints;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
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.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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.ui.dialogs.SelectionDialog;
public class TCFContextQueryExpressionDialog extends SelectionDialog {
private final String[] attributes;
private String expression_text;
private int expression_parent;
private final Map<String,String> expression_attrs = new HashMap<String,String>();
private final String[] column_names = new String[] { "Parameter", "Value" };
private int pos;
private int len;
protected TCFContextQueryExpressionDialog(Shell parentShell, String[] attributes, String expression) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
this.attributes = attributes;
expression_text = expression;
len = expression.length();
parseExpression();
}
private void parseExpression() {
if (pos < len && expression_text.charAt(pos) == '/') {
pos++;
expression_parent = pos;
expression_attrs.clear();
}
while (pos < len) {
parseExpressionPart();
if (pos >= len) break;
char ch = expression_text.charAt(pos);
if (ch == '/') {
pos++;
expression_parent = pos;
expression_attrs.clear();
}
else {
// Syntax error
break;
}
}
}
private void parseExpressionPart() {
while (pos < len) {
String name = parseString();
if (pos < len && expression_text.charAt(pos) == '=') {
pos++;
String value = parseString();
expression_attrs.put(name, value);
}
if (pos < len && expression_text.charAt(pos) == ',') {
pos++;
}
else {
break;
}
}
}
private String parseString() {
StringBuffer bf = new StringBuffer();
if (pos < len && expression_text.charAt(pos) == '"') {
pos++;
while (pos < len) {
char ch = expression_text.charAt(pos++);
if (ch == '"') break;
if (ch == '\\' && pos < len) {
ch = expression_text.charAt(pos++);
}
bf.append(ch);
}
}
else {
while (pos < len) {
char ch = expression_text.charAt(pos);
if (ch == '=' || ch == '/' || ch == ',') break;
bf.append(ch);
pos++;
}
}
return bf.toString();
}
private final class ParameterTableLabelProvider extends LabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int column) {
if (column == 0) return (String)element;
return expression_attrs.get((String)element);
}
}
public final class ExpressionEditingSupport extends EditingSupport {
private TextCellEditor editor;
private ColumnViewer viewer;
private ExpressionEditingSupport(ColumnViewer viewer) {
super(viewer);
this.viewer = viewer;
editor = new TextCellEditor((Composite) getViewer().getControl(), SWT.NONE);
}
@Override
protected CellEditor getCellEditor(Object element) {
return editor;
}
@Override
protected boolean canEdit(Object element) {
return true;
}
@Override
protected Object getValue(Object element) {
String value = expression_attrs.get((String)element);
if (value == null) value = "";
return value;
}
@Override
protected void setValue(Object element, Object value) {
String name = (String)element;
String str = (String)value;
if (str == null || str.length() == 0) {
expression_attrs.remove(name);
}
else {
expression_attrs.put(name, str);
}
viewer.update(element, null);
}
}
@Override
protected Control createDialogArea(Composite parent) {
Composite page = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(1, true);
page.setLayout(gridLayout);
page.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
TableLayout tableLayout = new TableLayout();
tableLayout.addColumnData(new ColumnWeightData(1));
tableLayout.addColumnData(new ColumnWeightData(1));
Table table = new Table(parent, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL);
table.setLinesVisible(true);
table.setHeaderVisible(true);
table.setLayout(tableLayout);
TableViewer tableViewer = new TableViewer(table);
tableViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Control cntrl = tableViewer.getControl();
cntrl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
TableViewerColumn labelColumn = new TableViewerColumn(tableViewer, SWT.NONE);
labelColumn.getColumn().setText(column_names[0]);
TableViewerColumn valueColumn = new TableViewerColumn(tableViewer, SWT.Modify);
valueColumn.getColumn().setText(column_names[1]);
tableViewer.setContentProvider(new ArrayContentProvider());
tableViewer.setLabelProvider(new ParameterTableLabelProvider());
valueColumn.setEditingSupport(new ExpressionEditingSupport(valueColumn.getViewer()));
tableViewer.setInput(attributes);
tableViewer.setComparator(new ViewerComparator() {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
String t1 = (String)e1;
String t2 = (String)e2;
return t1.compareTo(t2);
};
});
return parent;
}
private void appendString(StringBuffer bf, String s) {
int l = s.length();
boolean q = false;
for (int i = 0; !q && i < l; i++) {
char ch = s.charAt(i);
q = !Character.isDigit(ch) && !Character.isLetter(ch);
}
if (!q) {
bf.append(s);
return;
}
bf.append('"');
for (int i = 0; i < l; i++) {
char ch = s.charAt(i);
if (ch == '\\' || ch == '"') bf.append('\\');
bf.append(ch);
}
bf.append('"');
}
public String getExpression() {
StringBuffer bf = new StringBuffer();
for (String name : attributes) {
String value = expression_attrs.get(name);
if (value != null && value.length() > 0) {
if (bf.length() > 0) bf.append(',');
appendString(bf, name);
bf.append('=');
appendString(bf, value);
}
}
return expression_text.substring(0, expression_parent) + bf.toString();
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("Select Expression Parameters");
}
}