org.caleydo.view.info.selection.external.ExternalFieldEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.caleydo.view.info.selection.external.ExternalFieldEditor.java

Source

/*******************************************************************************
 * Caleydo - Visualization for Molecular Biology - http://caleydo.org
 * Copyright (c) The Caleydo Team. All rights reserved.
 * Licensed under the new BSD license, available at http://caleydo.org/license
 ******************************************************************************/
package org.caleydo.view.info.selection.external;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.caleydo.core.id.IDCategory;
import org.caleydo.core.id.IDType;
import org.caleydo.view.info.selection.external.MyPreferences.OpenExternally;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TableColumn;

/**
 * @author Samuel Gratzl
 *
 */
public class ExternalFieldEditor extends FieldEditor {

    private final List<IDCategoryPattern> data = new ArrayList<>();
    private Composite top;
    private TableViewer viewer = null;

    public ExternalFieldEditor(String name, String labelText, Composite parent) {
        super(name, labelText, parent);
        for (IDCategory cat : IDCategory.getAllRegisteredIDCategories()) {
            if (cat.isInternaltCategory() || cat.getPublicIdTypes().isEmpty())
                continue;
            data.add(new IDCategoryPattern(cat));
        }
        Collections.sort(data);
        if (viewer != null)
            viewer.setInput(data);
    }

    @Override
    protected void adjustForNumColumns(int numColumns) {
        ((GridData) top.getLayoutData()).horizontalSpan = numColumns;
    }

    @Override
    protected void doFillIntoGrid(Composite parent, int numColumns) {
        Composite tableComposite = new Composite(parent, SWT.NONE);
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.horizontalSpan = numColumns;
        tableComposite.setLayoutData(gd);
        top = tableComposite;
        TableColumnLayout tableColumnLayout = new TableColumnLayout();
        tableComposite.setLayout(tableColumnLayout);
        this.viewer = new TableViewer(tableComposite, SWT.BORDER | SWT.FULL_SELECTION);
        viewer.setContentProvider(ArrayContentProvider.getInstance());
        viewer.getTable().setHeaderVisible(true);
        viewer.getTable().setLinesVisible(true);

        TableViewerColumn idCategory = createTableColumn(viewer, "ID Category");
        idCategory.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                return row.category.getCategoryName();
            }
        });

        TableViewerColumn label = createTableColumn(viewer, "Label");
        label.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                return row.label == null ? "" : row.label;
            }
        });
        label.setEditingSupport(new EditingSupport(viewer) {
            @Override
            protected void setValue(Object element, Object value) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                row.label = value.toString();
            }

            @Override
            protected Object getValue(Object element) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                return row.label == null ? "" : row.label;
            }

            @Override
            protected CellEditor getCellEditor(Object element) {
                return new TextCellEditor(viewer.getTable());
            }

            @Override
            protected boolean canEdit(Object element) {
                return true;
            }
        });

        TableViewerColumn idType = createTableColumn(viewer, "Argument ID Type");
        idType.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                return row.idType == null ? "" : row.idType.getTypeName();
            }
        });
        idType.setEditingSupport(new EditingSupport(viewer) {
            @Override
            protected void setValue(Object element, Object value) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                if (((Integer) value).intValue() == -1)
                    row.idType = null;
                else
                    row.idType = IDType.getIDType(row.publicIDTypes[(Integer) value]);
            }

            @Override
            protected Object getValue(Object element) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                if (row.idType == null)
                    return row.publicIDTypes.length > 1 ? -1 : 0;
                for (int i = 0; i < row.publicIDTypes.length; ++i)
                    if (row.publicIDTypes[i].equals(row.idType.getTypeName()))
                        return i;
                return -1;
            }

            @Override
            protected CellEditor getCellEditor(Object element) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                return new ComboBoxCellEditor(viewer.getTable(), row.getPublicIDTypes());
            }

            @Override
            protected boolean canEdit(Object element) {
                return true;
            }
        });
        TableViewerColumn pattern = createTableColumn(viewer, "URL Pattern");
        pattern.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                return row.pattern == null ? "" : row.pattern;
            }
        });
        pattern.getColumn().setToolTipText("Use {0} as placeholder");
        pattern.setEditingSupport(new EditingSupport(viewer) {
            @Override
            protected void setValue(Object element, Object value) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                row.pattern = value.toString();
            }

            @Override
            protected Object getValue(Object element) {
                IDCategoryPattern row = (IDCategoryPattern) element;
                return row.pattern == null ? "" : row.pattern;
            }

            @Override
            protected CellEditor getCellEditor(Object element) {
                return new TextCellEditor(viewer.getTable());
            }

            @Override
            protected boolean canEdit(Object element) {
                return true;
            }
        });

        tableColumnLayout.setColumnData(idCategory.getColumn(), new ColumnWeightData(15, 100, true));
        tableColumnLayout.setColumnData(label.getColumn(), new ColumnWeightData(15, 100, true));
        tableColumnLayout.setColumnData(idType.getColumn(), new ColumnWeightData(15, 100, true));
        tableColumnLayout.setColumnData(pattern.getColumn(), new ColumnWeightData(55, 100, true));

        viewer.setInput(data);
    }

    private TableViewerColumn createTableColumn(TableViewer viewer, String name) {
        TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE);
        TableColumn coll = col.getColumn();
        coll.setText(name);
        coll.setMoveable(true);
        coll.setResizable(true);
        coll.setWidth(100);
        return col;
    }

    @Override
    protected void doLoad() {
        read(false);
    }

    private void read(boolean defaultValue) {
        IPreferenceStore store = getPreferenceStore();
        for (IDCategoryPattern p : this.data) {
            OpenExternally pair = MyPreferences.getExternalIDCategory(store, p.category, defaultValue);
            if (pair == null) {
                p.idType = null;
                p.pattern = null;
                p.label = "";
            } else {
                p.idType = pair.getIdType();
                p.pattern = pair.getPattern();
                p.label = pair.getLabel();
            }
        }
        if (viewer != null)
            viewer.refresh();
    }

    @Override
    protected void doLoadDefault() {
        read(true);
    }

    @Override
    protected void doStore() {
        IPreferenceStore store = getPreferenceStore();
        for (IDCategoryPattern p : this.data) {
            String prefix = "external.idcategory." + p.category + ".";
            if (p.pattern == null || p.idType == null || p.pattern.isEmpty()) {
                store.setToDefault(prefix + "pattern");
                store.setToDefault(prefix + "idType");
            } else {
                store.setValue(prefix + "pattern", p.pattern);
                store.setValue(prefix + "idType", p.idType.getTypeName());
            }
        }
    }

    @Override
    public int getNumberOfControls() {
        return 1;
    }

    private static class IDCategoryPattern implements Comparable<IDCategoryPattern> {
        private final IDCategory category;
        private String label;
        private String pattern;
        private IDType idType;
        private final String[] publicIDTypes;

        public IDCategoryPattern(IDCategory category) {
            super();
            this.category = category;
            List<IDType> r = category.getPublicIdTypes();
            String[] a = new String[r.size()];
            for (int i = 0; i < a.length; ++i)
                a[i] = r.get(i).getTypeName();
            this.publicIDTypes = a;
        }

        /**
         * @return
         */
        public String[] getPublicIDTypes() {
            return publicIDTypes;
        }

        @Override
        public int compareTo(IDCategoryPattern o) {
            return category.getCategoryName().compareTo(o.category.getCategoryName());
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((category == null) ? 0 : category.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            IDCategoryPattern other = (IDCategoryPattern) obj;
            if (category == null) {
                if (other.category != null)
                    return false;
            } else if (!category.equals(other.category))
                return false;
            return true;
        }

    }

}