org.eclipse.jst.jsf.common.ui.internal.preferences.StrategyOrderingPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.jsf.common.ui.internal.preferences.StrategyOrderingPanel.java

Source

/*******************************************************************************
 * Copyright (c) 2001, 2008 Oracle 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:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.common.ui.internal.preferences;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider;
import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider.OrderableObject;
import org.eclipse.jst.jsf.common.ui.internal.utils.PixelConverter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
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.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

/**
 * Creates a composite with a checked table viewer and up/down buttons that
 * allow ordering and enablement of a list of items in the table.
 * 
 * Largely derived from
 * org.eclipse.jdt.internal.ui.preferences.CodeAssistAdvancedConfigurationBlock
 * 
 * @author cbateman
 * 
 */
public class StrategyOrderingPanel {
    private CheckboxTableViewer _viewer;
    private Button fUpButton;
    private Button fDownButton;

    private final OrderedListProvider _provider;
    private final ITableLabelProvider _labelProvider;
    private final String _title;

    /**
     * @param provider
     * @param labelProvider
     * @param title 
     */
    public StrategyOrderingPanel(final OrderedListProvider provider, final ITableLabelProvider labelProvider,
            final String title) {
        _provider = provider;
        _labelProvider = labelProvider;
        _title = title;
    }

    /**
     * @param parent
     * @return the control
     */
    public Control createContents(final Composite parent) {
        final Composite panel = new Composite(parent, SWT.NONE);
        final GridLayout layout = new GridLayout(2, false);
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        panel.setLayout(layout);

        final Label titleLabel = new Label(panel, SWT.NONE);
        titleLabel.setText(_title);
        final GridData gridData = new GridData(GridData.FILL, GridData.BEGINNING, true, false, 2, 1);
        titleLabel.setLayoutData(gridData);

        createTableViewer(panel);
        createButtonList(panel);

        return panel;
    }

    /**
     * Refresh the UI from model. Must not be called before createContents
     */
    public void refresh() {
        _provider.resetOrderedObjects();
        _viewer.refresh();
        for (final OrderableObject object : _provider.getOrderedObjects()) {
            _viewer.setChecked(object, object.isEnabled());
        }
    }

    private void createTableViewer(final Composite parent) {
        _viewer = CheckboxTableViewer.newCheckList(parent, SWT.SINGLE | SWT.BORDER);
        final Table table = _viewer.getTable();
        table.setHeaderVisible(false);
        table.setLinesVisible(false);
        table.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false, 1, 1));

        final TableColumn nameColumn = new TableColumn(table, SWT.NONE);
        // nameColumn
        // .setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_separate_table_category_column_title);
        nameColumn.setResizable(false);

        _viewer.setContentProvider(new ContentProvider());

        _viewer.setLabelProvider(_labelProvider);
        _viewer.setInput(_provider);

        final int ICON_AND_CHECKBOX_WITH = 50;
        final int HEADER_MARGIN = 20;
        int minNameWidth = computeWidth(table, nameColumn.getText()) + HEADER_MARGIN;
        for (int i = 0; i < _provider.getOrderedObjects().size(); i++) {
            minNameWidth = Math.max(minNameWidth,
                    computeWidth(table, _labelProvider.getColumnText(_provider.getOrderedObjects().get(i), 0))
                            + ICON_AND_CHECKBOX_WITH);
        }

        nameColumn.setWidth(minNameWidth);

        _viewer.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(final CheckStateChangedEvent event) {
                final boolean checked = event.getChecked();
                final OrderableObject element = (OrderableObject) event.getElement();
                element.setEnabled(checked);
            }
        });

        table.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                handleTableSelection();
            }
        });

    }

    private void createButtonList(final Composite parent) {
        final Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));

        final GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        composite.setLayout(layout);

        fUpButton = new Button(composite, SWT.PUSH | SWT.CENTER);
        fUpButton.setText(OrderingMessages.Ordering_Up);
        fUpButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                final int index = getSelectionIndex();
                if (index != -1) {
                    final OrderableObject object = _provider.getOrderedObjects().get(index);
                    _provider.moveUp(object);
                    _viewer.refresh();
                    handleTableSelection();
                }
            }
        });
        fUpButton.setLayoutData(new GridData());
        setButtonDimensionHint(fUpButton);

        fDownButton = new Button(composite, SWT.PUSH | SWT.CENTER);
        fDownButton.setText(OrderingMessages.Ordering_Down);
        fDownButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                final int index = getSelectionIndex();
                if (index != -1) {
                    final OrderableObject object = _provider.getOrderedObjects().get(index);
                    _provider.moveDown(object);
                    _viewer.refresh();
                    handleTableSelection();
                }
            }
        });
        fDownButton.setLayoutData(new GridData());
        setButtonDimensionHint(fDownButton);
    }

    private int computeWidth(final Control control, final String name) {
        if (name == null) {
            return 0;
        }
        final GC gc = new GC(control);
        try {
            gc.setFont(JFaceResources.getDialogFont());
            return gc.stringExtent(name).x + 10;
        } finally {
            gc.dispose();
        }
    }

    private void handleTableSelection() {
        final OrderableObject item = getSelectedItem();
        if (item != null) {
            final int index = getSelectionIndex();
            fUpButton.setEnabled(index > 0);
            fDownButton.setEnabled(index < _provider.getOrderedObjects().size() - 1);
        } else {
            fUpButton.setEnabled(false);
            fDownButton.setEnabled(false);
        }
    }

    private OrderableObject getSelectedItem() {
        return (OrderableObject) ((IStructuredSelection) _viewer.getSelection()).getFirstElement();
    }

    private int getSelectionIndex() {
        return _viewer.getTable().getSelectionIndex();
    }

    /**
     * Returns a width hint for a button control.
     */
    private static int getButtonWidthHint(final Button button) {
        button.setFont(JFaceResources.getDialogFont());
        PixelConverter converter = new PixelConverter(button);
        final int widthHint = converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
        return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
    }

    /**
     * Sets width and height hint for the button control. <b>Note:</b> This is
     * a NOP if the button's layout data is not an instance of
     * <code>GridData</code>.
     * 
     * @param button
     *            the button for which to set the dimension hint
     */
    private static void setButtonDimensionHint(final Button button) {
        Assert.isNotNull(button);
        final Object gd = button.getLayoutData();
        if (gd instanceof GridData) {
            ((GridData) gd).widthHint = getButtonWidthHint(button);
            ((GridData) gd).horizontalAlignment = GridData.FILL;
        }
    }

    private static class ContentProvider implements IStructuredContentProvider {

        public Object[] getElements(final Object inputElement) {
            if (inputElement instanceof OrderedListProvider) {
                return ((OrderedListProvider) inputElement).getOrderedObjects().toArray();
            }
            return new Object[0];
        }

        public void dispose() {
            // do nothing
        }

        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
            // do nothing
        }

    }
}