fr.liglab.adele.cilia.workbench.common.ui.widget.KeyValueWidget.java Source code

Java tutorial

Introduction

Here is the source code for fr.liglab.adele.cilia.workbench.common.ui.widget.KeyValueWidget.java

Source

/**
 * Copyright 2012-2013 France Tlcom 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License.
 */
package fr.liglab.adele.cilia.workbench.common.ui.widget;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

/**
 * 
 * @author Etienne Gandrille
 */
public class KeyValueWidget {

    private ControlListener resizeListener;
    private final Control control;

    public KeyValueWidget(Composite parent, Map<String, String> input, String keyLabel, String valueLabel) {
        control = createComposite(parent, input, keyLabel, valueLabel);
    }

    public Control getControl() {
        return control;
    }

    public void setLayoutData(Object layoutData) {
        control.setLayoutData(layoutData);
    }

    private Control createComposite(Composite parent, Map<String, String> input, String keyLabel,
            String valueLabel) {

        // JFace Table Viewer
        StructuredViewer jFaceViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        jFaceViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        final TableViewerColumn col1 = createTableViewerColumn(jFaceViewer, 0, keyLabel);
        final TableViewerColumn col2 = createTableViewerColumn(jFaceViewer, 1, valueLabel);
        jFaceViewer.setContentProvider(new TableContentProvider());
        jFaceViewer.setInput(input);
        jFaceViewer.setComparator(getDefaultComparator());

        // SWT Table widget configuration
        Table swtTable = ((TableViewer) jFaceViewer).getTable();
        swtTable.setHeaderVisible(true);
        swtTable.setLinesVisible(true);

        // Listener
        resizeListener = new ResizeListener(col1, col2, jFaceViewer);
        jFaceViewer.getControl().addControlListener(resizeListener);

        return jFaceViewer.getControl();
    }

    private static class TableContentProvider implements IStructuredContentProvider {

        @Override
        public Object[] getElements(Object inputElement) {

            @SuppressWarnings("unchecked")
            Map<String, String> items = (Map<String, String>) inputElement;

            List<String[]> retval = new ArrayList<String[]>();

            for (String key : items.keySet()) {
                String value = items.get(key);
                String[] keyValue = new String[2];
                keyValue[0] = key;
                keyValue[1] = value;
                retval.add(keyValue);
            }

            return retval.toArray();
        }

        @Override
        public void dispose() {
            // do nothing
        }

        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // do nothing
        }
    }

    private static TableViewerColumn createTableViewerColumn(StructuredViewer viewer, final int index,
            String title) {
        final TableViewerColumn viewerColumn = new TableViewerColumn(((TableViewer) viewer), SWT.NONE);
        final TableColumn column = viewerColumn.getColumn();
        column.setText(title);
        column.setResizable(false);
        column.setMoveable(false);
        column.setAlignment(SWT.LEFT);

        viewerColumn.setLabelProvider(new ColumnLabelProvider() {
            private String getTextFromObject(Object element) {
                String[] keyValue = (String[]) element;
                return keyValue[index];
            }

            @Override
            public String getText(Object element) {
                return getTextFromObject(element);
            }

            @Override
            public String getToolTipText(Object element) {
                return getTextFromObject(element);
            }
        });

        return viewerColumn;
    }

    /**
     * Resize the table column as soon as a composite is resized.
     * 
     * @see ResizeEvent
     */
    private static class ResizeListener implements ControlListener {

        final TableViewerColumn col1;
        final TableViewerColumn col2;
        final StructuredViewer table;

        public ResizeListener(TableViewerColumn col1, TableViewerColumn col2, StructuredViewer table) {
            this.col1 = col1;
            this.col2 = col2;
            this.table = table;
        }

        @Override
        public void controlResized(ControlEvent e) {
            Control control = table.getControl();
            int width = control.getBounds().width / 2 - 2;
            col1.getColumn().setWidth(width);
            col2.getColumn().setWidth(width);
        }

        @Override
        public void controlMoved(ControlEvent e) {
            // do nothing
        }
    }

    private static ViewerComparator getDefaultComparator() {
        return new ViewerComparator() {
            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                String str1 = ((String[]) e1)[0];
                String str2 = ((String[]) e2)[0];
                return (str1.toUpperCase()).compareTo(str2.toUpperCase());
            }
        };
    }
}