org.eclipse.core.tools.TableWithTotalView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.core.tools.TableWithTotalView.java

Source

/*******************************************************************************
 * Copyright (c) 2002, 2005 IBM Corporation 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:
 *     IBM - Initial API and implementation
 *******************************************************************************/
package org.eclipse.core.tools;

import java.util.Iterator;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableTree;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.ViewPart;

/**
 * Abstract class representing a view made of two tables.
 * The first one is used to display data and the second to display totals of the
 * data showed in the first table.
 */
public abstract class TableWithTotalView extends ViewPart implements ISelectionProvider {
    protected TableTreeViewer viewer; // Table tree viewer used to contain all the data but the total
    protected TableTree tableTree; // The table tree that will populate the viewer
    protected Table totalTable; // The table used to display the totals
    protected boolean flat; // Flag indicating the view mode 
    protected Clipboard clipboard;
    protected Action copyAction;
    protected Action selectAllAction;

    abstract protected String[] getColumnHeaders();

    abstract protected ColumnLayoutData[] getColumnLayout();

    abstract protected void createActions();

    abstract protected void createToolbar();

    abstract protected void createContextMenu();

    private SelectionListener getColumnListener() {
        return new SelectionListener() {
            public void widgetDefaultSelected(SelectionEvent event) {
                // do nothing
            }

            public void widgetSelected(SelectionEvent event) {
                // column selected - need to sort
                int column = viewer.getTableTree().getTable().indexOf((TableColumn) event.widget);

                ISorter oldSorter = (ISorter) viewer.getSorter();
                boolean threeState = oldSorter.states() == 3;
                ISelection selection = viewer.getSelection();

                // first check to see if we are changing sort columns.
                // If so, set flatness and get a new sorter
                if (oldSorter == null || !threeState || column != oldSorter.getColumnNumber()) {
                    flat = column != 0; // default for column 0 is NOT flat
                    viewer.setSorter(getSorter(column));
                } else {
                    // Not changing sorters so we have to cycle through states for the columns
                    // Three state sort for column 0.  !flat/!reverse -> flat/!reverse -> flat/reverse
                    if (column == 0) {
                        if (flat) {
                            if (oldSorter.isReversed())
                                flat = false;
                            oldSorter.setReversed(!oldSorter.isReversed());
                        } else {
                            flat = true;
                            oldSorter.setReversed(false);
                        }
                    } else { // for all other columns flatten and simply reverse
                        flat = true;
                        oldSorter.setReversed(!oldSorter.isReversed());
                    }
                }
                if (viewer.getContentProvider() instanceof IFlattable)
                    ((IFlattable) viewer.getContentProvider()).setFlat(flat);
                viewer.refresh();
                viewer.setSelection(selection);
            }
        };
    }

    protected ControlListener getColumnResizeListener() {
        return new ControlListener() {
            public void controlMoved(ControlEvent event) {
                // do nothing
            }

            public void controlResized(ControlEvent event) {
                TableColumn column = (TableColumn) event.widget;
                int columnNumber = viewer.getTableTree().getTable().indexOf(column);
                totalTable.getColumn(columnNumber).setWidth(column.getWidth());
            }
        };
    }

    private void createTables(Composite parent) {
        // create a first table, that will display all the data
        tableTree = new TableTree(parent, SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION | SWT.HIDE_SELECTION);
        tableTree.setLayoutData(new GridData(GridData.FILL_BOTH));
        Table table = tableTree.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        TableLayout tableLayout = new TableLayout();
        table.setLayout(tableLayout);

        SelectionListener headerListener = getColumnListener();

        // create a second table for totals
        totalTable = new Table(parent, 0);
        GridData gridInfo = new GridData(GridData.FILL_HORIZONTAL);
        gridInfo.heightHint = totalTable.getItemHeight();
        totalTable.setLayoutData(gridInfo);
        totalTable.setHeaderVisible(false);
        totalTable.setLinesVisible(true);
        TableLayout totalLayout = new TableLayout();
        totalTable.setLayout(totalLayout);

        ControlListener columnResizeListener = getColumnResizeListener();
        //create the columns for the two tables
        ColumnLayoutData[] columnLayout = getColumnLayout();
        String[] headers = getColumnHeaders();
        for (int i = 0; i < getColumnHeaders().length; i++) {
            // column for the first table
            tableLayout.addColumnData(columnLayout[i]);
            TableColumn column = new TableColumn(table, SWT.NONE, i);
            column.setResizable(true);
            column.setText(headers[i]);
            column.addSelectionListener(headerListener);
            // "connect" the two tables so the width of their column evolve simultaneously
            // more precisely here, only the resize of the first table will trigger a resize of the second one
            column.addControlListener(columnResizeListener);

            // column for the second table
            totalLayout.addColumnData(columnLayout[i]);
            column = new TableColumn(totalTable, SWT.NONE, i);
            column.setResizable(true);
        }
    }

    protected abstract ITreeContentProvider getContentProvider();

    protected abstract ITableLabelProvider getLabelProvider();

    protected abstract ViewerSorter getSorter(int column);

    protected abstract String getStatusLineMessage(Object element);

    public void createPartControl(Composite parent) {
        Composite composite = new Composite(parent, 0);
        // crete a grid layout of one column
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        composite.setLayout(layout);

        createTables(composite);

        clipboard = new Clipboard(parent.getDisplay());
        //create the viewer
        viewer = new TableTreeViewer(tableTree);
        viewer.setContentProvider(getContentProvider());
        viewer.setLabelProvider(getLabelProvider());
        viewer.setSorter(getSorter(0));
        viewer.addSelectionChangedListener(getTableListener());

        createCommonActions();
        createActions();
        createToolbar();
        createContextMenu();
    }

    abstract protected String[] computeTotalLine(Iterator elements);

    private void createCommonActions() {
        copyAction = new Action() {
            public void run() {
                IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
                String result = ""; //$NON-NLS-1$
                String[] columnHeaders = getColumnHeaders();
                for (int i = 0; i < columnHeaders.length; i++)
                    result += columnHeaders[i] + ","; //$NON-NLS-1$
                result += "\n\n"; //$NON-NLS-1$

                ITableLabelProvider labelProvider = (ITableLabelProvider) viewer.getLabelProvider();
                for (Iterator iterator = selection.iterator(); iterator.hasNext();) {
                    Object selectedItem = iterator.next();
                    for (int i = 0; i < columnHeaders.length; i++)
                        result += labelProvider.getColumnText(selectedItem, i) + ","; //$NON-NLS-1$
                    result += "\n"; //$NON-NLS-1$
                }
                clipboard.setContents(new Object[] { result }, new Transfer[] { TextTransfer.getInstance() });
            }
        };
        IActionBars actionBars = getViewSite().getActionBars();
        actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), copyAction);

        selectAllAction = new Action() {
            public void run() {
                tableTree.selectAll();
                // force viewer selection change
                viewer.setSelection(viewer.getSelection());
            }
        };
        actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), selectAllAction);
    }

    protected ISelectionChangedListener getTableListener() {
        return new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent e) {
                IStructuredSelection selection = (IStructuredSelection) e.getSelection();
                copyAction.setEnabled(!selection.isEmpty());
                if (selection.size() == 1) {
                    String message = getStatusLineMessage(selection.getFirstElement());
                    getViewSite().getActionBars().getStatusLineManager().setMessage(message);
                }
                totalTable.removeAll();
                updateTotals();
            }
        };
    }

    public void updateTotals() {
        IStructuredSelection selection = (IStructuredSelection) getSelection();
        TableItem item = new TableItem(totalTable, 0);
        item.setText(computeTotalLine(selection.iterator()));
    }

    public ISelection getSelection() {
        return viewer.getSelection();
    }

    public void addSelectionChangedListener(ISelectionChangedListener listener) {
        // do nothing
    }

    public void removeSelectionChangedListener(ISelectionChangedListener listener) {
        // do nothing
    }

    public void setSelection(ISelection selection) {
        // do nothing
    }

    public void setFocus() {
        if (tableTree != null)
            tableTree.setFocus();
    }
}