blob: c438b960d048408b7cb610b7a6f53c595c7fd1ee [file] [log] [blame]
/*******************************************************************************
* 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
}
}
}