com.vectrace.MercurialEclipse.ui.AbstractHighlightableTable.java Source code

Java tutorial

Introduction

Here is the source code for com.vectrace.MercurialEclipse.ui.AbstractHighlightableTable.java

Source

/*******************************************************************************
 * Copyright (c) 2005-2010 VecTrace (Zingo Andersen) 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:
 * John Peberdy   implementation
 *******************************************************************************/
package com.vectrace.MercurialEclipse.ui;

import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;

/**
 *
 */
public abstract class AbstractHighlightableTable<E> extends Composite {

    private static final Font APPLIED_FONT = JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT);

    private final TableViewer viewer;

    public AbstractHighlightableTable(Composite parent, final HighlightingLabelProvider<E> labelProvider) {
        super(parent, SWT.NONE);

        setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        TableColumnLayout tableColumnLayout = new TableColumnLayout();
        setLayout(tableColumnLayout);

        viewer = new TableViewer(this, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL);

        viewer.setContentProvider(new ArrayContentProvider());
        viewer.setLabelProvider(labelProvider);

        List<TableViewerColumn> cols = createColumns(viewer, tableColumnLayout);

        CellLabelProvider clp = new CellLabelProvider() {
            @Override
            public void update(ViewerCell cell) {
                E patch = (E) cell.getElement();
                HighlightingLabelProvider<E> lp = (HighlightingLabelProvider<E>) viewer.getLabelProvider();
                cell.setText(labelProvider.getColumnText(patch, cell.getColumnIndex()));
                cell.setImage(labelProvider.getColumnImage(patch, cell.getColumnIndex()));
                if (lp.isHighlighted(patch)) {
                    cell.setFont(APPLIED_FONT);
                } else {
                    cell.setFont(null);
                }
            }
        };

        for (Iterator<TableViewerColumn> it = cols.iterator(); it.hasNext();) {
            it.next().setLabelProvider(clp);
        }

        Table table = viewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
    }

    protected abstract List<TableViewerColumn> createColumns(TableViewer tableViewer,
            TableColumnLayout tableColumnLayout);

    /**
     * @return The first selected patch, or {@code null} if the selection is empty.
     */
    public E getSelection() {
        return (E) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
    }

    /**
     * @return A list of the selected patches. If the selection is empty an empty list is returned,
     *         never {@code null}.
     */
    public List<E> getSelections() {
        return ((IStructuredSelection) viewer.getSelection()).toList();
    }

    public void setItems(List<E> patches) {
        viewer.setInput(patches);
    }

    @SuppressWarnings("unchecked")
    public List<E> getItems() {
        Object inp = viewer.getInput();

        if (inp instanceof List) {
            return (List<E>) inp;
        }

        return Collections.emptyList();
    }

    public TableViewer getTableViewer() {
        return viewer;
    }

    public abstract static class HighlightingLabelProvider<F> extends LabelProvider implements ITableLabelProvider {
        public abstract boolean isHighlighted(F inst);
    }
}