org.eclipse.help.ui.internal.preferences.ICTable.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.help.ui.internal.preferences.ICTable.java

Source

/*******************************************************************************
 * Copyright (c) 2011 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 Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.help.ui.internal.preferences;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
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;

public class ICTable {

    private Table table;
    private TableViewer viewer;

    private final String NAME_COLUMN = Messages.RemoteICViewer_Name;
    private final String LOCATION_COLUMN = Messages.RemoteICViewer_URL;
    private final String STATUS_COLUMN = Messages.RemoteICViewer_Enabled;

    // Set column names
    private String[] columnNames = new String[] { NAME_COLUMN, LOCATION_COLUMN, STATUS_COLUMN };

    public ICTable(Composite parent) {

        // Create the table
        table = createTable(parent);
        // Create and setup the TableViewer
        viewer = createTableViewer();

        loadPreferences();
    }

    /**
     * Release resources
     */
    public void dispose() {
        // Tell the label provider to release its resources
        viewer.getLabelProvider().dispose();
    }

    /**
     * Create the Table
     */
    private Table createTable(Composite parent) {
        int style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION;

        TableLayout tableLayout = new TableLayout();
        Table table = new Table(parent, style);
        table.setLayout(tableLayout);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        table.setFont(parent.getFont());

        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.grabExcessVerticalSpace = true;
        gridData.grabExcessHorizontalSpace = true;
        gridData.verticalAlignment = GridData.FILL;
        gridData.horizontalAlignment = GridData.FILL;
        gridData.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
        gridData.heightHint = table.getItemHeight();
        gridData.horizontalSpan = 1;
        table.setLayoutData(gridData);

        ColumnLayoutData[] fTableColumnLayouts = { new ColumnWeightData(85), new ColumnWeightData(165),
                new ColumnWeightData(60) };

        TableColumn column;

        tableLayout.addColumnData(fTableColumnLayouts[0]);
        column = new TableColumn(table, SWT.NONE, 0);
        column.setResizable(fTableColumnLayouts[0].resizable);
        column.setText(NAME_COLUMN);

        tableLayout.addColumnData(fTableColumnLayouts[1]);
        column = new TableColumn(table, SWT.NONE, 1);
        column.setResizable(fTableColumnLayouts[1].resizable);
        column.setText(LOCATION_COLUMN);

        tableLayout.addColumnData(fTableColumnLayouts[2]);
        column = new TableColumn(table, SWT.NONE, 2);
        column.setResizable(fTableColumnLayouts[2].resizable);
        column.setText(STATUS_COLUMN);

        return table;
    }

    /**
     * Create the TableViewer
     */
    private TableViewer createTableViewer() {

        TableViewer viewer = new TableViewer(table);
        viewer.setUseHashlookup(true);
        viewer.setColumnProperties(columnNames);
        viewer.setContentProvider(new ICContentProvider());
        viewer.setLabelProvider(new ICLabelProvider());
        return viewer;
    }

    /**
     * Proxy for the the RemoteICList which provides content
     * for the Table. This class implements IRemoteHelpListViewer interface an 
     * registers itself with RemoteICList
     */
    class ICContentProvider implements IStructuredContentProvider {
        private List content = new ArrayList();

        public void dispose() {
            content = null;
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            content = (List) newInput;
        }

        public Object[] getElements(Object inputElement) {
            return (Object[]) content.toArray(new Object[content.size()]);
        }

    }

    public class ICLabelProvider extends LabelProvider implements ITableLabelProvider {

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            switch (columnIndex) {
            case 0:
                return ((IC) element).getName();
            case 1:
                return ((IC) element).getHref();
            case 2:
                return ((IC) element).isEnabled() ? Messages.RemoteICLabelProvider_4
                        : Messages.RemoteICLabelProvider_5;
            default:
                return null;
            }
        }

    }

    /**
     * @param rics the ordered remote InfoCenters
     */
    public void update(List ics) {
        viewer.getContentProvider().inputChanged(viewer, null, ics);
        refresh();
    }

    /**
     * Make sure the table viewer shows the latest copy of the ordered InfoCenters 
     */
    public void refresh() {
        viewer.refresh(getICs());
    }

    /**
     * Return the column names in a collection
     * 
     * @return List containing column names
     */
    public List getColumnNames() {
        return Arrays.asList(columnNames);
    }

    /**
     * @return currently selected item
     */
    public ISelection getSelection() {
        return viewer.getSelection();
    }

    /**
     * Return the RemoteICList
     */
    public List getICs() {
        ICContentProvider p = (ICContentProvider) viewer.getContentProvider();
        Object objs[] = p.getElements(null);
        List content = new ArrayList();
        for (int o = 0; o < objs.length; o++)
            content.add(objs[o]);
        return content;
    }

    public void setICs(List ics) {
        List oldICs = getICs();
        for (int o = 0; o < oldICs.size(); o++)
            removeIC((IC) oldICs.get(o));

        for (int i = 0; i < ics.size(); i++)
            addIC((IC) ics.get(i));
    }

    public TableViewer getTableViewer() {
        return viewer;
    }

    /**
     * Return the parent composite
     */
    public Control getControl() {
        return table.getParent();
    }

    public Table getTable() {
        return table;
    }

    public void addIC(IC ic) {
        List content = getICs();
        content.add(ic);
        getTableViewer().getContentProvider().inputChanged(getTableViewer(), null, content);
        getTableViewer().add(ic);
        refresh();
    }

    public void editIC(IC ic) {
        List content = getICs();
        content.set(getTable().getSelectionIndex(), ic);
        getTableViewer().replace(ic, getTable().getSelectionIndex());
        getTableViewer().getContentProvider().inputChanged(getTableViewer(), null, content);
        refresh();
    }

    public void removeIC(IC ic) {
        List content = getICs();
        content.remove(ic);
        getTableViewer().getContentProvider().inputChanged(getTableViewer(), null, content);
        getTableViewer().remove(ic);
        refresh();
    }

    private void loadPreferences() {
        List ics = ICPreferences.getICs();
        for (int i = 0; i < ics.size(); i++)
            addIC((IC) ics.get(i));
    }

}