/******************************************************************************* * 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 } } }