eu.geclipse.ui.widgets.TabComponent.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.ui.widgets.TabComponent.java

Source

/******************************************************************************
 * Copyright (c) 2006, 2007 g-Eclipse consortium 
 * 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
 *
 * Initial development of the original code was made for
 * project g-Eclipse founded by European Union
 * project number: FP6-IST-034327  http://www.geclipse.eu/
 *
 * Contributor(s):
 *     PSNC: 
 *      - Katarzyna Bylec (katis@man.poznan.pl)
 *           
 *****************************************************************************/
package eu.geclipse.ui.widgets;

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

import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

/**
 * @author katis
 * @param <T> Type of items stored in the table
 */
public abstract class TabComponent<T> extends AbstractLaunchConfigurationTab {

    protected Button editButton;
    protected Button removeButton;
    protected Button addButton;
    protected ColumnLayoutData[] tabColumnsLayouts;
    protected TableViewer table;
    private IStructuredContentProvider contentProvider;
    private ITableLabelProvider labelProvider;
    private String[] tabColumnsHeaders;
    private String[] tabColumnsProperties;
    private int tabHeight;
    private List<Integer> columnsWidth = new ArrayList<Integer>();
    private ArrayList<CellEditor> cellEditors = new ArrayList<CellEditor>();
    private ICellModifier cellModifier;
    private int buttonsPosition;
    private Object input;

    public TabComponent(final IStructuredContentProvider contentProvider, final ITableLabelProvider labelProvider,
            final List<String> propertiesVsHearders, final Object input, final int hight, final int width) {
        this(contentProvider, labelProvider, propertiesVsHearders, hight, width, SWT.LEFT);
        this.input = input;
    }

    /**
     * @param contentProvider
     * @param labelProvider
     * @param propertiesVsHearders
     */
    public TabComponent(final IStructuredContentProvider contentProvider, final ITableLabelProvider labelProvider,
            final List<String> propertiesVsHearders, final int hight, final int width) {
        this(contentProvider, labelProvider, propertiesVsHearders, hight, width, SWT.LEFT);
    }

    public TabComponent(final IStructuredContentProvider contentProvider, final ITableLabelProvider labelProvider,
            final List<String> propertiesVsHearders, final int hight, final int width, final int buttonsPosition) {
        this.contentProvider = contentProvider;
        this.tabHeight = hight;
        this.labelProvider = labelProvider;
        this.tabColumnsHeaders = new String[propertiesVsHearders.size()];
        this.tabColumnsProperties = new String[propertiesVsHearders.size()];
        this.tabColumnsHeaders = propertiesVsHearders.toArray(this.tabColumnsHeaders);
        this.tabColumnsProperties = propertiesVsHearders.toArray(this.tabColumnsProperties);
        this.tabColumnsLayouts = new ColumnLayoutData[this.tabColumnsHeaders.length];
        for (int i = 0; i < this.tabColumnsHeaders.length; i++) {
            this.columnsWidth.add(Integer.valueOf(width));
            this.tabColumnsLayouts[i] = new ColumnWeightData(this.columnsWidth.get(i).intValue(),
                    this.columnsWidth.get(i).intValue(), false);
        }
        this.buttonsPosition = buttonsPosition;
    }

    public TabComponent(final IStructuredContentProvider contentProvider, final ITableLabelProvider labelProvider,
            final List<String> propertiesVsHearders, final Object input, final int hight,
            final List<Integer> columnsWidth, final int buttonsPosition) {
        this.contentProvider = contentProvider;
        this.tabHeight = hight;
        this.columnsWidth = columnsWidth;
        this.labelProvider = labelProvider;
        this.tabColumnsHeaders = new String[propertiesVsHearders.size()];
        this.tabColumnsProperties = new String[propertiesVsHearders.size()];
        this.tabColumnsHeaders = propertiesVsHearders.toArray(this.tabColumnsHeaders);
        this.tabColumnsProperties = propertiesVsHearders.toArray(this.tabColumnsProperties);
        this.tabColumnsLayouts = new ColumnLayoutData[this.tabColumnsHeaders.length];
        for (int i = 0; i < this.tabColumnsHeaders.length; i++) {
            this.tabColumnsLayouts[i] = new ColumnWeightData(this.columnsWidth.get(i).intValue(),
                    this.columnsWidth.get(i).intValue(), false);
        }
        this.buttonsPosition = buttonsPosition;
        this.input = input;
    }

    public TabComponent(final IStructuredContentProvider contentProvider, final ITableLabelProvider labelProvider,
            final List<String> propertiesVsHearders, final int hight, final List<Integer> columnsWidth,
            final int buttonsPosition) {
        this.contentProvider = contentProvider;
        this.tabHeight = hight;
        this.columnsWidth = columnsWidth;
        this.labelProvider = labelProvider;
        this.tabColumnsHeaders = new String[propertiesVsHearders.size()];
        this.tabColumnsProperties = new String[propertiesVsHearders.size()];
        this.tabColumnsHeaders = propertiesVsHearders.toArray(this.tabColumnsHeaders);
        this.tabColumnsProperties = propertiesVsHearders.toArray(this.tabColumnsProperties);
        this.tabColumnsLayouts = new ColumnLayoutData[this.tabColumnsHeaders.length];
        for (int i = 0; i < this.tabColumnsHeaders.length; i++) {
            this.tabColumnsLayouts[i] = new ColumnWeightData(this.columnsWidth.get(i).intValue(),
                    this.columnsWidth.get(i).intValue(), false);
        }
        this.buttonsPosition = buttonsPosition;
    }

    public void createControl(final Composite parent) {
        Composite mainComposite1 = new Composite(parent, SWT.NONE);
        setControl(mainComposite1);
        GridLayout layout = new GridLayout();
        if (this.buttonsPosition == SWT.BOTTOM || this.buttonsPosition == SWT.TOP) {
            layout.numColumns = 1;
        } else {
            layout.numColumns = 2;
        }
        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        mainComposite1.setLayout(layout);
        mainComposite1.setLayoutData(gridData);
        mainComposite1.setFont(parent.getFont());
        createTable(mainComposite1);
        createTableButtons(mainComposite1);
        setLabels();
        Dialog.applyDialogFont(mainComposite1);
        addEditors();
        if (!this.cellEditors.isEmpty()) {
            CellEditor[] editorsTable = new CellEditor[this.cellEditors.size()];
            int i = 0;
            for (CellEditor editor : this.cellEditors) {
                editorsTable[i] = editor;
                i++;
            }
            this.table.setCellEditors(editorsTable);
            this.table.setCellModifier(this.cellModifier);
        }
    }

    protected void addEditors() {
        // do nothing - subclasses defines its behavior
    }

    protected void setCellModifier(final ICellModifier cellModifier) {
        this.cellModifier = cellModifier;
    }

    protected void addComboEditor(final ComboBoxCellEditor editor, final String[] types, final boolean readOnly) {
        editor.create(this.table.getTable());
        editor.setItems(types);
        if (readOnly) {
            editor.setStyle(SWT.READ_ONLY);
        }
        this.cellEditors.add(editor);
    }

    public void addEditor(final CellEditor editor) {
        editor.create(this.table.getTable());
        this.cellEditors.add(editor);
    }

    private void createTable(final Composite parent) {
        Font font = parent.getFont();
        // Create table composite
        Composite tableComposite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        layout.numColumns = 1;
        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.heightHint = this.tabHeight;
        int width = 0;
        for (Integer value : this.columnsWidth) {
            width = width + value.intValue();
        }
        // gridData.widthHint = ( this.tabColumnsHeaders.length * width ) + 30;
        tableComposite.setLayout(layout);
        tableComposite.setLayoutData(gridData);
        tableComposite.setFont(font);
        // Create label
        // Label label = new Label( tableComposite, SWT.NONE );
        // label.setFont( font );
        // label.setText(Messages.getString("OutputFilesTab.output_files_settings_label"));
        // //$NON-NLS-1$
        // Create table
        this.table = new TableViewer(tableComposite,
                SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
        Table localTable = this.table.getTable();
        TableLayout tableLayout = new TableLayout();
        localTable.setLayout(tableLayout);
        localTable.setHeaderVisible(true);
        localTable.setFont(font);
        gridData = new GridData(GridData.FILL_BOTH);
        this.table.getControl().setLayoutData(gridData);
        this.table.setContentProvider(this.contentProvider);
        this.table.setInput(this.input);
        this.table.setLabelProvider(this.labelProvider);
        this.table.setColumnProperties(this.tabColumnsProperties);
        this.table.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(final SelectionChangedEvent event) {
                handleTableSelectionChanged(event);
            }
        });
        this.table.addDoubleClickListener(new IDoubleClickListener() {

            public void doubleClick(final DoubleClickEvent event) {
                if (!TabComponent.this.table.getSelection().isEmpty()) {
                    handleEditButtonSelected();
                }
            }
        });
        // Create columns
        for (int i = 0; i < this.tabColumnsHeaders.length; i++) {
            tableLayout.addColumnData(this.tabColumnsLayouts[i]);
            TableColumn tc = new TableColumn(localTable, SWT.NONE, i);
            tc.setResizable(this.tabColumnsLayouts[i].resizable);
            tc.setText(this.tabColumnsHeaders[i]);
        }
        this.table.refresh();
    }

    public String getName() {
        // TODO Auto-generated method stub
        return null;
    }

    public void initializeFrom(final ILaunchConfiguration configuration) {
        // TODO Auto-generated method stub
    }

    public void performApply(final ILaunchConfigurationWorkingCopy configuration) {
        // TODO Auto-generated method stub
    }

    public void setDefaults(final ILaunchConfigurationWorkingCopy configuration) {
        // TODO Auto-generated method stub
    }

    /**
     * Responds to a selection changed event in the environment table
     * 
     * @param event the selection change event
     */
    protected void handleTableSelectionChanged(final SelectionChangedEvent event) {
        int size = ((IStructuredSelection) event.getSelection()).size();
        this.editButton.setEnabled(size == 1);
        this.removeButton.setEnabled(size > 0);
    }

    /**
     * Creates the add/edit/remove buttons for the table
     * 
     * @param parent the composite in which the buttons should be created
     */
    protected void createTableButtons(final Composite parent) {
        // Create button composite
        Composite buttonComposite = new Composite(parent, SWT.NONE);
        GridLayout glayout = new GridLayout();
        glayout.marginHeight = 0;
        glayout.marginWidth = 0;
        if (this.buttonsPosition == SWT.BOTTOM || this.buttonsPosition == SWT.TOP) {
            glayout.numColumns = 3;
        } else {
            glayout.numColumns = 1;
        }
        GridData gdata = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_END);
        buttonComposite.setLayout(glayout);
        buttonComposite.setLayoutData(gdata);
        buttonComposite.setFont(parent.getFont());
        if (this.buttonsPosition == SWT.LEFT) {
            createVerticalSpacer(buttonComposite, 1);
        }
        // Create buttons
        gdata = new GridData(GridData.FILL_BOTH);
        this.addButton = new Button(buttonComposite, SWT.PUSH);
        this.addButton.setLayoutData(gdata);
        this.addButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent event) {
                handleAddButtonSelected();
            }
        });
        gdata = new GridData(GridData.FILL_BOTH);
        this.editButton = new Button(buttonComposite, SWT.PUSH);
        this.editButton.setLayoutData(gdata);
        this.editButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent event) {
                handleEditButtonSelected();
            }
        });
        this.editButton.setEnabled(false);
        gdata = new GridData(GridData.FILL_BOTH);
        this.removeButton = new Button(buttonComposite, SWT.PUSH);
        this.removeButton.setLayoutData(gdata);
        this.removeButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(final SelectionEvent event) {
                handleRemoveButtonSelected();
            }
        });
        this.removeButton.setEnabled(false);
    }

    @SuppressWarnings("unchecked")
    protected boolean addVariable(final T variable) {
        boolean result = true;
        TableItem[] items = this.table.getTable().getItems();
        for (int i = 0; i < items.length; i++) {
            T existingVariable = (T) items[i].getData();
            if (existingVariable.equals(variable)) {
                boolean overWrite = MessageDialog.openQuestion(getShell(),
                        Messages.getString("TabComponent.replace_table_item_question_title"), //$NON-NLS-1$
                        Messages.getString("TabComponent.replace_table_item_question")); //$NON-NLS-1$
                if (!overWrite) {
                    result = false;
                } else {
                    this.table.remove(existingVariable);
                }
                break;
            }
        }
        if (result) {
            this.table.add(variable);
            // this.table.setInput( variable );
            // updateLaunchConfigurationDialog();
        }
        return result;
    }

    /**
     * Method to access data kept in table
     * 
     * @return ArrayList of items kept in table
     */
    @SuppressWarnings("unchecked")
    public ArrayList<T> getInput() {
        ArrayList<T> result = new ArrayList<T>();
        for (TableItem item : this.table.getTable().getItems()) {
            result.add((T) item.getData());
        }
        return result;
    }

    abstract protected void handleRemoveButtonSelected();

    abstract protected void handleAddButtonSelected();

    abstract protected void handleEditButtonSelected();

    abstract protected void setLabels();
}