org.eclipse.tcf.internal.cdt.ui.breakpoints.TCFContextQueryExpressionDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.tcf.internal.cdt.ui.breakpoints.TCFContextQueryExpressionDialog.java

Source

/*******************************************************************************
 * 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");
    }
}