blob: e8e2adde5cdaed14498e4f0509e1181341e0cbaa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2009 IBM 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.common.properties.sections;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.ibm.icu.util.StringTokenizer;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import org.eclipse.wst.common.ui.internal.viewers.NavigableTableViewer;
import org.eclipse.wst.xsd.ui.internal.common.commands.AddEnumerationsCommand;
import org.eclipse.wst.xsd.ui.internal.common.commands.DeleteCommand;
import org.eclipse.wst.xsd.ui.internal.common.commands.SetXSDFacetValueCommand;
import org.eclipse.wst.xsd.ui.internal.common.util.Messages;
import org.eclipse.wst.xsd.ui.internal.common.util.XSDCommonUIUtils;
import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorPlugin;
import org.eclipse.wst.xsd.ui.internal.widgets.EnumerationsDialog;
import org.eclipse.xsd.XSDEnumerationFacet;
import org.eclipse.xsd.XSDSimpleTypeDefinition;
import org.eclipse.xsd.util.XSDConstants;
public class EnumerationsSection extends AbstractSection
{
private EnumerationsTableViewer enumerationsTable;
private Button addButton;
private Button addManyButton;
private Button deleteButton;
/**
*
*/
public EnumerationsSection()
{
super();
}
public void widgetSelected(SelectionEvent e)
{
XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition) input;
if (e.widget == addButton)
{
List enumList = st.getEnumerationFacets();
String newName = XSDCommonUIUtils.createUniqueEnumerationValue("value", enumList); //$NON-NLS-1$
AddEnumerationsCommand command = new AddEnumerationsCommand(Messages._UI_ACTION_ADD_ENUMERATION, (XSDSimpleTypeDefinition) input);
command.setValue(newName);
getCommandStack().execute(command);
enumerationsTable.refresh();
int newItemIndex = enumerationsTable.getTable().getItemCount() - 1;
enumerationsTable.editElement(enumerationsTable.getElementAt(newItemIndex), 0);
}
else if (e.widget == addManyButton)
{
Display display = Display.getCurrent();
// if it is null, get the default one
display = display == null ? Display.getDefault() : display;
Shell parentShell = display.getActiveShell();
EnumerationsDialog dialog = new EnumerationsDialog(parentShell);
dialog.setBlockOnOpen(true);
int result = dialog.open();
if (result == Window.OK)
{
String text = dialog.getText();
String delimiter = dialog.getDelimiter();
StringTokenizer tokenizer = new StringTokenizer(text, delimiter);
CompoundCommand compoundCommand = new CompoundCommand(Messages._UI_ACTION_ADD_ENUMERATIONS);
while (tokenizer.hasMoreTokens())
{
String token = tokenizer.nextToken();
if (dialog.isPreserveWhitespace() == false)
{
token = token.trim();
}
AddEnumerationsCommand command = new AddEnumerationsCommand(Messages._UI_ACTION_ADD_ENUMERATIONS, (XSDSimpleTypeDefinition) input);
command.setValue(token);
compoundCommand.add(command);
}
getCommandStack().execute(compoundCommand);
}
enumerationsTable.refresh();
}
else if (e.widget == deleteButton)
{
StructuredSelection selection = (StructuredSelection) enumerationsTable.getSelection();
if (selection != null)
{
Iterator i = selection.iterator();
CompoundCommand compoundCommand = new CompoundCommand(Messages._UI_ACTION_DELETE_ENUMERATION);
while (i.hasNext())
{
Object obj = i.next();
if (obj != null)
{
if (obj instanceof XSDEnumerationFacet)
{
XSDEnumerationFacet enumFacet = (XSDEnumerationFacet) obj;
DeleteCommand deleteCommand = new DeleteCommand(Messages._UI_ACTION_DELETE_ENUMERATION, enumFacet);
compoundCommand.add(deleteCommand);
}
}
}
getCommandStack().execute(compoundCommand);
enumerationsTable.refresh();
}
}
else if (e.widget == enumerationsTable.getTable())
{
StructuredSelection selection = (StructuredSelection) enumerationsTable.getSelection();
if (selection.getFirstElement() != null)
{
deleteButton.setEnabled(true);
}
else
{
deleteButton.setEnabled(false);
}
}
}
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void createContents(Composite parent)
{
TabbedPropertySheetWidgetFactory factory = getWidgetFactory();
composite = factory.createFlatFormComposite(parent);
enumerationsTable = new EnumerationsTableViewer(getWidgetFactory().createTable(composite, SWT.MULTI | SWT.FULL_SELECTION));
enumerationsTable.setInput(input);
Table table = enumerationsTable.getTable();
table.addSelectionListener(this);
addButton = getWidgetFactory().createButton(composite, XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_ADD_BUTTON_LABEL"), SWT.PUSH); //$NON-NLS-1$
addManyButton = getWidgetFactory().createButton(composite, XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_ADD_BUTTON_LABEL") + "...", SWT.PUSH); //$NON-NLS-1$ //$NON-NLS-2$
deleteButton = getWidgetFactory().createButton(composite, XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE_INCLUDE"), SWT.PUSH); //$NON-NLS-1$
FormData data2 = new FormData();
data2.top = new FormAttachment(0, 0);
data2.left = new FormAttachment(100, -100);
data2.right = new FormAttachment(100, 0);
// data2.width = 50;
addButton.setLayoutData(data2);
addButton.addSelectionListener(this);
FormData data = new FormData();
data.left = new FormAttachment(addButton, 0, SWT.LEFT);
data.right = new FormAttachment(100, 0);
data.top = new FormAttachment(addButton, 0);
addManyButton.setLayoutData(data);
addManyButton.addSelectionListener(this);
data = new FormData();
data.left = new FormAttachment(addButton, 0, SWT.LEFT);
data.right = new FormAttachment(100, 0);
data.top = new FormAttachment(addManyButton, 0);
deleteButton.setLayoutData(data);
deleteButton.setEnabled(false);
deleteButton.addSelectionListener(this);
data = new FormData();
data.top = new FormAttachment(0, 0);
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(addButton, 0);
data.bottom = new FormAttachment(100, 0);
data.width = 50;
table.setLayoutData(data);
table.addListener(SWT.Resize, this);
}
/*
* @see org.eclipse.wst.common.ui.properties.internal.provisional.view.ITabbedPropertySection#refresh()
*/
public void refresh()
{
if (isReadOnly)
{
composite.setEnabled(false);
}
else
{
composite.setEnabled(true);
}
XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition) input;
Iterator validFacets = st.getValidFacets().iterator();
boolean isApplicable = false;
while (validFacets.hasNext())
{
String aValidFacet = (String) validFacets.next();
if (aValidFacet.equals(XSDConstants.ENUMERATION_ELEMENT_TAG))
{
isApplicable = true;
}
}
if (isApplicable)
{
addButton.setEnabled(true);
addManyButton.setEnabled(true);
}
else
{
addButton.setEnabled(false);
addManyButton.setEnabled(false);
}
enumerationsTable.setInput(input);
}
public void handleEvent(Event event)
{
Table table = enumerationsTable.getTable();
if (event.type == SWT.Resize && event.widget == table)
{
TableColumn tableColumn = table.getColumn(0);
tableColumn.setWidth(table.getSize().x);
}
}
public void dispose()
{
}
public boolean shouldUseExtraSpace()
{
return true;
}
class EnumerationsTableViewer extends NavigableTableViewer implements ICellModifier
{
protected String[] columnProperties = { XSDConstants.ENUMERATION_ELEMENT_TAG };
protected CellEditor[] cellEditors;
Table table;
public EnumerationsTableViewer(Table table)
{
super(table);
table = getTable();
table.setLinesVisible(true);
setContentProvider(new EnumerationsTableContentProvider());
setLabelProvider(new EnumerationsTableLabelProvider());
setColumnProperties(columnProperties);
setCellModifier(this);
TableColumn column = new TableColumn(table, SWT.NONE, 0);
column.setText(columnProperties[0]);
column.setAlignment(SWT.LEFT);
column.setResizable(true);
cellEditors = new CellEditor[1];
TableLayout layout = new TableLayout();
ColumnWeightData data = new ColumnWeightData(100);
layout.addColumnData(data);
cellEditors[0] = new TextCellEditor(table);
getTable().setLayout(layout);
setCellEditors(cellEditors);
}
public boolean canModify(Object element, String property)
{
return true;
}
public void modify(Object element, String property, Object value)
{
if (element instanceof TableItem && (value != null))
{
TableItem item = (TableItem) element;
XSDEnumerationFacet enumFacet = (XSDEnumerationFacet) item.getData();
SetXSDFacetValueCommand command = new SetXSDFacetValueCommand(Messages._UI_ACTION_SET_ENUMERATION_VALUE, enumFacet);
command.setValue((String) value);
getCommandStack().execute(command);
item.setData(enumFacet);
item.setText((String) value);
}
}
public Object getValue(Object element, String property)
{
if (element instanceof XSDEnumerationFacet)
{
XSDEnumerationFacet enumFacet = (XSDEnumerationFacet) element;
String value = enumFacet.getLexicalValue();
if (value == null)
value = ""; //$NON-NLS-1$
return value;
}
return ""; //$NON-NLS-1$
}
}
class EnumerationsTableContentProvider implements IStructuredContentProvider
{
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
}
public java.lang.Object[] getElements(java.lang.Object inputElement)
{
java.util.List list = new ArrayList();
if (inputElement instanceof XSDSimpleTypeDefinition)
{
XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition) inputElement;
return st.getEnumerationFacets().toArray();
}
return list.toArray();
}
public void dispose()
{
}
}
class EnumerationsTableLabelProvider extends LabelProvider implements ITableLabelProvider
{
public EnumerationsTableLabelProvider()
{
}
public Image getColumnImage(Object element, int columnIndex)
{
return XSDEditorPlugin.getXSDImage("icons/XSDSimpleEnum.gif"); //$NON-NLS-1$
}
public String getColumnText(Object element, int columnIndex)
{
if (element instanceof XSDEnumerationFacet)
{
XSDEnumerationFacet enumFacet = (XSDEnumerationFacet) element;
String value = enumFacet.getLexicalValue();
if (value == null)
value = ""; //$NON-NLS-1$
return value;
}
return ""; //$NON-NLS-1$
}
}
}