org.eclipse.imp.formatting.editor.SpaceOptionTable.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.imp.formatting.editor.SpaceOptionTable.java

Source

/*******************************************************************************
* Copyright (c) IBM Corporation 2008 
* 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:
*    Jurgen Vinju (jurgenv@cwi.nl) - initial API and implementation
    
*******************************************************************************/

package org.eclipse.imp.formatting.editor;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.imp.formatting.spec.Specification;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;

public class SpaceOptionTable implements IEditorPart {
    private Table optionTable;

    private final int NAME_COLUMN = 0;
    private final int VALUE_COLUMN = 1;

    private static final String NAME_PROPERTY = "name";
    private static final String VALUE_PROPERTY = "value";

    private TableItem activeOption;

    private List<IPropertyListener> listeners;

    private Specification model;

    private boolean dirty = false;
    private IEditorSite site;
    private IEditorInput input;
    private TableViewer tableViewer;

    public SpaceOptionTable(Specification model) {
        this.model = model;
        listeners = new LinkedList<IPropertyListener>();
    }

    public void setModel(Specification model) {
        this.model = model;
        refresh();
    }

    public void addPropertyListener(IPropertyListener l) {
        listeners.add(l);
    }

    private void firePropertyChange(int change) {
        for (IPropertyListener l : listeners) {
            l.propertyChanged(this, change);
        }
    }

    public IEditorInput getEditorInput() {
        return input;
    }

    public IEditorSite getEditorSite() {
        return site;
    }

    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        this.site = site;
        this.input = input;
    }

    public void dispose() {
        optionTable.dispose();
    }

    public IWorkbenchPartSite getSite() {
        return site;
    }

    public String getTitle() {
        return "Options";
    }

    public Image getTitleImage() {
        return null;
    }

    public String getTitleToolTip() {
        return null;
    }

    public void removePropertyListener(IPropertyListener listener) {
        listeners.remove(listener);
    }

    public void setFocus() {
        optionTable.setFocus();
    }

    public Object getAdapter(Class adapter) {
        return null;
    }

    public void doSave(IProgressMonitor monitor) {
        throw new UnsupportedOperationException("not implemented");
    }

    public void doSaveAs() {
        throw new UnsupportedOperationException("not implemented");
    }

    public boolean isSaveAsAllowed() {
        return false;
    }

    public boolean isSaveOnCloseNeeded() {
        return false;
    }

    public void createPartControl(Composite parent) {
        parent.setLayout(new FillLayout(SWT.VERTICAL));

        optionTable = new Table(parent, SWT.FULL_SELECTION);
        optionTable.setLinesVisible(true);
        optionTable.setHeaderVisible(true);

        TableColumn name = new TableColumn(optionTable, SWT.NONE);
        name.setText("Key");
        name.setResizable(true);

        TableColumn value = new TableColumn(optionTable, SWT.NONE);
        value.setText("Value");
        value.setResizable(true);

        tableViewer = new TableViewer(optionTable);

        name.pack();
        value.pack();

        createCellEditor();
    }

    private void createCellEditor() {
        tableViewer.setCellModifier(new ICellModifier() {
            public boolean canModify(Object element, String property) {
                return true;
            }

            public Object getValue(Object element, String property) {
                if (NAME_PROPERTY.equals(property)) {
                    return ((EditableTableItem) element).getName();
                } else {
                    return ((EditableTableItem) element).getValue().toString();
                }
            }

            public void modify(Object element, String property, Object value) {
                TableItem tableItem = (TableItem) element;
                EditableTableItem data = (EditableTableItem) tableItem.getData();
                if (NAME_PROPERTY.equals(property)) {
                    data.setName(value.toString());
                } else {
                    data.setValue(Integer.parseInt(value.toString()));
                }

                setDirty(true);

                tableViewer.refresh(data);
            }
        });

        CellEditor nameEditor = new TextCellEditor(optionTable, SWT.BORDER);
        ((Text) nameEditor.getControl()).addVerifyListener(new VerifyListener() {
            public void verifyText(VerifyEvent e) {
                int start = 0;
                e.doit = true;

                if (e.start == 0) {
                    e.doit = e.text.startsWith("$");
                    start = 1;
                }

                for (int i = start; i < e.text.length() && e.doit; i++) {
                    e.doit = Character.isLetter(e.text.charAt(i));
                }
            }
        });

        CellEditor valueEditor = new TextCellEditor(optionTable, SWT.BORDER);
        ((Text) valueEditor.getControl()).addVerifyListener(new VerifyListener() {
            public void verifyText(VerifyEvent e) {
                e.doit = true;
                for (int i = 0; i < e.text.length() && e.doit; i++) {
                    e.doit = Character.isDigit(e.text.charAt(i));
                }
            }
        });

        tableViewer.setCellEditors(new CellEditor[] { nameEditor, valueEditor });

        tableViewer.setColumnProperties(new String[] { NAME_PROPERTY, VALUE_PROPERTY });

        tableViewer.setLabelProvider(new ITableLabelProvider() {
            public Image getColumnImage(Object element, int columnIndex) {
                return null;
            }

            public String getColumnText(Object element, int columnIndex) {
                switch (columnIndex) {
                case NAME_COLUMN:
                    return ((EditableTableItem) element).getName();
                case VALUE_COLUMN:
                    return "" + ((EditableTableItem) element).getValue();
                }

                return "";
            }

            public void addListener(ILabelProviderListener listener) {
            }

            public void dispose() {
            }

            public boolean isLabelProperty(Object element, String property) {
                return false;
            }

            public void removeListener(ILabelProviderListener listener) {
            }
        });

    }

    public void refresh() {
        optionTable.removeAll();

        Iterator<String> iter = model.getSpaceOptions();

        while (iter.hasNext()) {
            final String name = iter.next();
            EditableTableItem item = new EditableTableItem(model, name, model.getSpaceOption(name));
            tableViewer.add(item);
        }

        for (TableColumn c : optionTable.getColumns()) {
            c.pack();
        }
    }

    public void setDirty(boolean b) {
        if (dirty != b) {
            dirty = b;
            firePropertyChange(PROP_DIRTY);
        }
    }

    public void newOption() {
        model.setSpaceOption("$exampleKey", 1);
        EditableTableItem item = new EditableTableItem(model, "$exampleKey", 1);
        tableViewer.add(item);
        setDirty(true);
    }

    public void deleteOption() {
        if (activeOption != null) {
            model.removeSpaceOption(activeOption.getText(NAME_COLUMN));
            optionTable.remove(optionTable.indexOf(activeOption));
            activeOption = null;
            setDirty(true);
        }
    }

    public boolean isDirty() {
        return dirty;
    }

    private class EditableTableItem {
        private String name;
        private Integer value;
        private Specification model;

        public EditableTableItem(Specification m, String n, Integer v) {
            this.model = m;
            name = n;
            value = v;
        }

        public String getName() {
            return name;
        }

        public Integer getValue() {
            return value;
        }

        public void setName(String name) {
            Integer value = model.getSpaceOption(this.name);
            model.removeSpaceOption(this.name);
            model.setSpaceOption(name, value);
            this.name = name;
        }

        public void setValue(Integer value) {
            model.setSpaceOption(name, value);
            this.value = value;
        }
    }
}