package org.eclipse.emf.examples.jet.article2.ui;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
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.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
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;
import org.eclipse.emf.examples.jet.article2.model.Attribute;
import org.eclipse.emf.examples.jet.article2.model.NameUtil;
import org.eclipse.emf.examples.jet.article2.model.TypesafeEnum;
/**
* Wizard page where the user can specify the attributes (member variables) of
* the typesafe enumeration class.
*
* @author Remko Popma
* @version $Revision: 1.4 $ ($Date: 2008/04/22 13:35:56 $)
*/
public class NewTypesafeEnumCreationWizardPageAttributes extends WizardPage
{
private final static String PAGE_NAME = "AttributesPage"; //$NON-NLS-1$
private/* static */final String[] COLUMN_NAMES = new String []{ WizardMessages.getString("NewEnumWizPageAttr.col.Key"), //$NON-NLS-1$
WizardMessages.getString("NewEnumWizPageAttr.col.Name"), //$NON-NLS-1$
WizardMessages.getString("NewEnumWizPageAttr.col.Type"), //$NON-NLS-1$
};
private static final int COL_KEY = 0;
private static final int COL_NAME = 1;
private static final int COL_TYPE = 2;
private static final int[] COLUMN_WIDTHS = new int []{ 40, 200, 200, };
private CheckboxTableViewer mTableViewer = null;
private Table mTableWidget = null;
private Button mButtonAdd = null;
private Button mButtonEdit = null;
private Button mButtonRemove = null;
/**
* Helper class that provides content for the table widget.
*/
protected class AttributeContentProvider implements IStructuredContentProvider
{
public Object[] getElements(Object inputElement)
{
List<Attribute> result = new ArrayList<Attribute>();
for (Iterator<Attribute> i = ((TypesafeEnum)inputElement).attributes(); i.hasNext();)
{
result.add(i.next());
}
return result.toArray();
}
public void dispose()
{
// Ignore
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
// Ignore
}
}
/**
* Helper class that knows how to display a table widget row.
*/
protected class AttributeLabelProvider extends LabelProvider implements ITableLabelProvider
{
public Image getColumnImage(Object element, int columnIndex)
{
return null;
}
public String getColumnText(Object element, int columnIndex)
{
if (element instanceof Attribute)
{
Attribute attribute = (Attribute)element;
switch (columnIndex)
{
case COL_NAME:
return attribute.getName() == null ? "" : attribute.getName();
case COL_TYPE:
return attribute.getType();
case COL_KEY:
mTableViewer.setChecked(attribute, attribute.isKey());
return "";
}
}
return null;
}
}
/**
* Constructs a <code>NewTypesafeEnumCreationWizardPageAttributes</code>.
*/
public NewTypesafeEnumCreationWizardPageAttributes()
{
super(PAGE_NAME);
setTitle(WizardMessages.getString("NewEnumWizPageAttr.title")); //$NON-NLS-1$
setDescription(WizardMessages.getString("NewEnumWizPageAttr.description")); //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent)
{
initializeDialogUnits(parent);
Composite container = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
container.setLayout(layout);
container.setLayoutData(new GridData(GridData.FILL_BOTH));
createTableWidget(container);
createButtonsPanel(container);
hookListeners();
updateEnabledState();
mButtonAdd.forceFocus();
setControl(container);
Dialog.applyDialogFont(container);
setPageComplete(false);
}
/**
* Registers listeners with the widgets.
*/
private void hookListeners()
{
mTableViewer.addCheckStateListener(new ICheckStateListener()
{
public void checkStateChanged(CheckStateChangedEvent event)
{
Object element = event.getElement();
if (element instanceof TableItem)
{ // workaround for bug in older versions of Eclipse
element = ((TableItem)element).getData();
}
if (element instanceof Attribute)
{
Attribute attribute = (Attribute)element;
attribute.setKey(event.getChecked());
validatePage();
}
}
});
mTableViewer.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
updateEnabledState();
}
});
mTableViewer.addDoubleClickListener(new IDoubleClickListener()
{
public void doubleClick(DoubleClickEvent event)
{
handleEditPressed();
}
});
mButtonAdd.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
handleAddPressed();
}
});
mButtonEdit.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
handleEditPressed();
}
});
mButtonRemove.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
handleRemovePressed();
}
});
}
private void updateEnabledState()
{
mTableWidget.setEnabled(mTableWidget.getItemCount() > 0);
boolean enabled = (mTableWidget.getSelectionCount() > 0);
mButtonEdit.setEnabled(enabled);
mButtonRemove.setEnabled(enabled);
}
private void handleAddPressed()
{
EditAttributeDialog dialog = new EditAttributeDialog(getShell());
dialog.setAttribute(new Attribute());
dialog.setTitle(WizardMessages.getString("NewEnumWizPageAttr.Add_Attribute"));
int reply = dialog.open();
if (reply == Window.OK)
{
getTypesafeEnumModel().addAttribute(dialog.getAttribute());
mTableViewer.refresh();
mTableViewer.setSelection(new StructuredSelection(dialog.getAttribute()));
mTableViewer.setChecked(dialog.getAttribute(), dialog.getAttribute().isKey());
}
updateEnabledState();
((NewTypesafeEnumCreationWizardPageInstances)getNextPage()).setPageComplete(false);
validatePage();
mButtonAdd.forceFocus();
}
private void handleEditPressed()
{
Attribute attribute = getSelectedAttribute();
if (attribute == null)
{
return;
}
EditAttributeDialog dialog = new EditAttributeDialog(getShell());
dialog.setAttribute(attribute);
dialog.setTitle(WizardMessages.getString("NewEnumWizPageAttr.Edit_Attribute"));
dialog.open();
mTableViewer.refresh();
mTableViewer.setSelection(new StructuredSelection(dialog.getAttribute()));
mTableViewer.setChecked(dialog.getAttribute(), dialog.getAttribute().isKey());
updateEnabledState();
validatePage();
}
private void handleRemovePressed()
{
Attribute attribute = getSelectedAttribute();
if (attribute == null)
{
return;
}
getTypesafeEnumModel().removeAttribute(attribute);
mTableViewer.refresh();
updateEnabledState();
validatePage();
}
private Attribute getSelectedAttribute()
{
IStructuredSelection selection = (IStructuredSelection)mTableViewer.getSelection();
if (selection.isEmpty())
{
return null;
}
Object element = selection.getFirstElement();
if (element instanceof TableItem)
{ // workaround for bug in older versions of Eclipse
element = ((TableItem)element).getData();
}
Attribute attribute = (Attribute)element;
return attribute;
}
/**
* @param parent
*/
private void createButtonsPanel(Composite parent)
{
Composite panel = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
panel.setLayout(layout);
mButtonAdd = new Button(panel, SWT.PUSH);
mButtonEdit = new Button(panel, SWT.PUSH);
mButtonRemove = new Button(panel, SWT.PUSH);
mButtonAdd.setText(WizardMessages.getString("NewEnumWizPageAttr.button.Add"));
mButtonEdit.setText(WizardMessages.getString("NewEnumWizPageAttr.button.Edit"));
mButtonRemove.setText(WizardMessages.getString("NewEnumWizPageAttr.button.Remove"));
}
private void createTableWidget(Composite container)
{
mTableWidget = new Table(container, SWT.CHECK | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
mTableWidget.setHeaderVisible(true);
mTableWidget.setLinesVisible(true);
int listHeight = mTableWidget.getItemHeight() * 10; // show 10 rows
Rectangle trim = mTableWidget.computeTrim(0, 0, 0, listHeight);
GridData tblGD = new GridData(GridData.FILL_BOTH);
tblGD.heightHint = trim.height;
tblGD.horizontalSpan = 2; // use both columns of grid
mTableWidget.setLayoutData(tblGD);
TableLayout tableLayout = new TableLayout();
for (int i = 0; i < COLUMN_WIDTHS.length; i++)
{
tableLayout.addColumnData(new ColumnWeightData(1, COLUMN_WIDTHS[i], true));
}
mTableWidget.setLayout(tableLayout);
for (int i = 0; i < COLUMN_NAMES.length; i++)
{
new TableColumn(mTableWidget, SWT.NONE).setText(COLUMN_NAMES[i]);
}
mTableWidget.pack();
mTableViewer = new CheckboxTableViewer(mTableWidget);
mTableViewer.setColumnProperties(COLUMN_NAMES); // must be same as
// TableColumn text
mTableViewer.setLabelProvider(new AttributeLabelProvider());
mTableViewer.setContentProvider(new AttributeContentProvider());
mTableViewer.setInput(getTypesafeEnumModel());
}
/**
* Validates the attributes of the <code>TypesafeEnum</code>.
*/
private void validatePage()
{
TypesafeEnum type = getTypesafeEnumModel();
if (type.attributeCount() == 0)
{
setErrorMessage(WizardMessages.getString("NewEnumWizPageAttr.Must_have_at_least_one_attribute"));
setPageComplete(false);
return;
}
for (Iterator<Attribute> i = type.attributes(); i.hasNext();)
{
Attribute attribute = i.next();
if (attribute.getName().length() == 0)
{
setErrorMessage(WizardMessages.getString("NewEnumWizPageAttr.attribute_must_have_a_name"));
setPageComplete(false);
return;
}
if (!NameUtil.isValidIdentifier(attribute.getName()))
{
setErrorMessage(WizardMessages.getFormattedString("NewEnumWizPageAttr.invalid_attribute_name", attribute.getName()));
setPageComplete(false);
return;
}
if (attribute.getType().length() == 0)
{
setErrorMessage(WizardMessages.getFormattedString("NewEnumWizPageAttr.attribute_must_have_a_type", attribute.getName()));
setPageComplete(false);
return;
}
if (!NameUtil.isValidIdentifier(attribute.getType()))
{
setErrorMessage(WizardMessages.getFormattedString("NewEnumWizPageAttr.invalid_attribute_type", attribute.getType()));
setPageComplete(false);
return;
}
}
if (type.keyAttributes().hasNext() == false)
{
setErrorMessage(WizardMessages.getString("NewEnumWizPageAttr.missing_key_attribute"));
setPageComplete(false);
return;
}
setErrorMessage(null);
setPageComplete(true);
}
/**
* Returns the <code>TypesafeEnum</code> object shared by all pages.
*
* @return the <code>TypesafeEnum</code> object to edit
*/
public TypesafeEnum getTypesafeEnumModel()
{
return ((NewTypesafeEnumCreationWizardPage)getPreviousPage()).getTypesafeEnumModel();
}
}