org.eclipse.cdt.cmake.ui.ArchTable.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cdt.cmake.ui.ArchTable.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Rohde & Schwarz GmbH & Co. KG 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:
 *     Martin Runge - initial implementation of cmake support
 *******************************************************************************/

package org.eclipse.cdt.cmake.ui;

import org.eclipse.cdt.cmake.var.ArchToolchainPair;
import org.eclipse.cdt.cmake.var.ArchToolchainPairList;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.PlatformUI;

/**
 * @author runge_m
 *
 */
public class ArchTable extends FieldEditor {

    private TableViewer tableViewer;
    private Composite tableParent;
    private ArchToolchainPairList atlist;

    /**
     * The button box containing the Add and Remove buttons;
     * <code>null</code> if none (before creation or after disposal).
     */
    private Composite buttonBox;

    private Button addButton;
    private Button removeButton;
    private SelectionListener selectionListener;

    public ArchTable(String name, String labelText, Composite parent) {
        init(name, labelText);
        createControl(parent);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.FieldEditor#adjustForNumColumns(int)
     */
    @Override
    protected void adjustForNumColumns(int numColumns) {
        Control labelCcontrol = getLabelControl();
        ((GridData) labelCcontrol.getLayoutData()).horizontalSpan = numColumns;
        ((GridData) getTableControl().getLayoutData()).horizontalSpan = numColumns - 1;
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.FieldEditor#doFillIntoGrid(org.eclipse.swt.widgets.Composite, int)
     */
    @Override
    protected void doFillIntoGrid(Composite parent, int numColumns) {
        // doFillLabelIntoGrid(parent, numColumns);
        doFillBoxIntoGrid(parent, numColumns);
    }

    protected void doFillLabelIntoGrid(Composite parent, int numColumns) {
        String text = getLabelText();
        if (text != null && text.length() > 0) {
            Control control = getLabelControl(parent);
            GridData gd = new GridData();
            gd.horizontalSpan = numColumns;
            control.setLayoutData(gd);
        }
    }

    protected void doFillBoxIntoGrid(Composite parent, int numColumns) {
        Control control = getLabelControl(parent);
        GridData gd = new GridData();
        gd.horizontalSpan = numColumns;
        control.setLayoutData(gd);

        Control table = createTableControl(parent);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.verticalAlignment = GridData.FILL;
        gd.horizontalSpan = numColumns - 1;
        gd.grabExcessHorizontalSpace = true;
        table.setLayoutData(gd);

        buttonBox = getButtonBoxControl(parent);
        gd = new GridData();
        gd.verticalAlignment = GridData.BEGINNING;
        buttonBox.setLayoutData(gd);

    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.FieldEditor#doLoad()
     */
    @Override
    protected void doLoad() {
        if (atlist == null) {
            atlist = new ArchToolchainPairList();
        }
        atlist.doLoad();
        tableViewer.setInput(atlist);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.FieldEditor#doLoadDefault()
     */
    @Override
    protected void doLoadDefault() {
        if (atlist == null) {
            atlist = new ArchToolchainPairList();
        }
        atlist.doLoad(true);
        tableViewer.setInput(atlist);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.FieldEditor#doStore()
     */
    @Override
    protected void doStore() {
        if (atlist == null)
            return;
        atlist.doStore();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.FieldEditor#getNumberOfControls()
     */
    @Override
    public int getNumberOfControls() {
        return 3;
    }

    @Override
    protected void createControl(Composite parent) {
        GridLayout ly = (GridLayout) parent.getLayout();
        doFillIntoGrid(parent, getNumberOfControls());
    }

    public Table createTableControl(Composite parent) {
        Table table = getTableControl();
        if (table == null) {
            tableParent = parent;
            tableViewer = new TableViewer(parent,
                    SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
            createColumns(tableViewer);
            table = tableViewer.getTable();
            table.setHeaderVisible(true);
            table.setLinesVisible(true);
            table.setFont(parent.getFont());
            tableViewer.setComparator(new ViewerComparator());

            tableViewer.setContentProvider(ArrayContentProvider.getInstance());

            //         tableViewer.setInput( atlist );
        } else {
            checkParent(table, parent);
        }
        return table;
    }

    /**
     * @param tableViewer
     */
    private void createColumns(TableViewer tv) {
        // create a column for the architecture's name
        TableViewerColumn colArchName = new TableViewerColumn(tv, SWT.NONE);
        colArchName.getColumn().setWidth(200);
        colArchName.getColumn().setText("Architecture");
        colArchName.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                ArchToolchainPair p = (ArchToolchainPair) element;
                return p.getArchName();
            }
        });
        colArchName.setEditingSupport(new ArchCellEditor(tableViewer));

        // create a column for the architecture's name
        TableViewerColumn colToolchainFile = new TableViewerColumn(tv, SWT.NONE);
        colToolchainFile.getColumn().setWidth(200);
        colToolchainFile.getColumn().setText("CMake toolchain file");
        colToolchainFile.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public String getText(Object element) {
                ArchToolchainPair p = (ArchToolchainPair) element;
                return p.getToolchainFile();
            }
        });

    }

    /**
     * @return
     */
    private Table getTableControl() {
        if (tableViewer != null) {
            return tableViewer.getTable();
        } else {
            return null;
        }
    }

    /**
     * Returns this field editor's button box containing the Add, Remove,
     * Up, and Down button.
     *
     * @param parent the parent control
     * @return the button box
     */
    public Composite getButtonBoxControl(Composite parent) {
        if (buttonBox == null) {
            buttonBox = new Composite(parent, SWT.NULL);
            GridLayout layout = new GridLayout();
            layout.marginWidth = 0;
            buttonBox.setLayout(layout);
            addButton = createPushButton(buttonBox, Messages.ArchTableEditor_Add);//$NON-NLS-1$
            removeButton = createPushButton(buttonBox, Messages.ArchTableEditor_Remove);//$NON-NLS-1$
            buttonBox.addDisposeListener(new DisposeListener() {
                public void widgetDisposed(DisposeEvent event) {
                    addButton = null;
                    removeButton = null;
                    buttonBox = null;
                }
            });

        } else {
            checkParent(buttonBox, parent);
        }

        selectionChanged();
        return buttonBox;
    }

    /**
     * Helper method to create a push button.
     * 
     * @param parent the parent control
     * @param key the resource name used to supply the button's label text
     * @return Button
     */
    private Button createPushButton(Composite parent, String key) {
        Button button = new Button(parent, SWT.PUSH);
        button.setText(JFaceResources.getString(key));
        button.setFont(parent.getFont());
        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        int widthHint = convertHorizontalDLUsToPixels(button, IDialogConstants.BUTTON_WIDTH);
        data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
        button.setLayoutData(data);
        button.addSelectionListener(getSelectionListener());
        return button;
    }

    /**
     * Creates a selection listener.
     */
    public void createSelectionListener() {
        selectionListener = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                Widget widget = event.widget;
                if (widget == addButton) {
                    addPressed();
                } else if (widget == removeButton) {
                    removePressed();
                } else if (widget == getTableControl()) {
                    selectionChanged();
                }
            }
        };
    }

    /**
     * 
     */
    protected void selectionChanged() {
    }

    private void addPressed() {
        ArchToolchainPairEditor ed = new ArchToolchainPairEditor(
                PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
        int rc = ed.open();
        if (rc == Window.OK) {
            atlist.add(ed.getPair());
            tableViewer.refresh();
        }
    }

    private void removePressed() {
        Table table = getTableControl();
        //   table.remove(table.getSelectionIndices());

        int[] sel = table.getSelectionIndices();
        for (int i = 0; i < sel.length; i++) {
            // #i have already been removed by earlier runs, remove i from index 
            atlist.remove(sel[i] - i);
        }
        tableViewer.refresh();
    }

    /**
     * Returns this field editor's selection listener.
     * The listener is created if nessessary.
     *
     * @return the selection listener
     */
    private SelectionListener getSelectionListener() {
        if (selectionListener == null) {
            createSelectionListener();
        }
        return selectionListener;
    }

}