/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ /** * */ package org.ebayopensource.turmeric.eclipse.ui.wizards.pages; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.ebayopensource.turmeric.common.config.LibraryType; import org.ebayopensource.turmeric.eclipse.core.logging.SOALogger; import org.ebayopensource.turmeric.eclipse.core.model.IParameterElement; import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants; import org.ebayopensource.turmeric.eclipse.repositorysystem.core.GlobalRepositorySystem; import org.ebayopensource.turmeric.eclipse.repositorysystem.core.ISOAHelpProvider; import org.ebayopensource.turmeric.eclipse.ui.SOABasePage; import org.ebayopensource.turmeric.eclipse.ui.components.SOAComboDialogCellEditor; import org.ebayopensource.turmeric.eclipse.ui.components.TableButtonPanelViewer; import org.ebayopensource.turmeric.eclipse.ui.components.TableButtonPanelViewer.ColumnDef; import org.ebayopensource.turmeric.eclipse.utils.collections.ListUtil; import org.ebayopensource.turmeric.eclipse.utils.plugin.EclipseMessageUtils; import org.ebayopensource.turmeric.eclipse.utils.ui.UIUtil; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; /** * The Class AbstractElementManagementWizardPage. * * @author yayu */ public abstract class AbstractElementManagementWizardPage extends SOABasePage { // public static final String NON_EDITABLE_COL_NAME = ""; /** The Constant COLUMN_NAME. */ public static final String COLUMN_NAME = "name"; /** The Constant COLUMN_TYPE. */ public static final String COLUMN_TYPE = "type"; /** The Constant COLUMN_OCCUR_MIN. */ public static final String COLUMN_OCCUR_MIN = "min_occur"; /** The Constant COLUMN_OCCUR_MAX. */ public static final String COLUMN_OCCUR_MAX = "max_occur"; /** The Constant PARAMETER_COLUMN_PROPERTIES. */ public static final String[] PARAMETER_COLUMN_PROPERTIES = {COLUMN_NAME, COLUMN_TYPE, COLUMN_OCCUR_MIN, COLUMN_OCCUR_MAX}; /** The Constant OCCUR_UNBOUNDED. */ public static final String OCCUR_UNBOUNDED = "unbounded"; /** The Constant DEFAULT_MAX_OCCURS. */ protected static final int DEFAULT_MAX_OCCURS = -1; /** The types viewer. */ protected TableButtonPanelViewer typesViewer; /** The elements. */ protected List<IParameterElement> elements = new ArrayList<IParameterElement>(); /** The param cell editor. */ protected CellEditor paramCellEditor; private int minimumRequiredElementNum = 1; /** * Instantiates a new abstract element management wizard page. * * @param pageName the page name * @param title the title * @param description the description * @param elements the elements */ public AbstractElementManagementWizardPage(String pageName, String title, String description, List<? extends IParameterElement> elements) { this(pageName, title, description, elements, 1); } /*public AbstractElementManagementWizardPage(String pageName, String title, String description, List<? extends IParameterElement> elements, minimumRequiredElementNum) { super(pageName, title, description); if (elements != null) { this.elements.addAll(elements); } }*/ /** * Instantiates a new abstract element management wizard page. * * @param pageName the page name * @param title the title * @param description the description * @param elements the elements * @param minimumRequiredElementNum the minimum required element num */ public AbstractElementManagementWizardPage(String pageName, String title, String description, List<? extends IParameterElement> elements, int minimumRequiredElementNum) { super(pageName, title, description); if (elements != null) { this.elements.addAll(elements); } if (minimumRequiredElementNum >= 0) { this.minimumRequiredElementNum = minimumRequiredElementNum; } } /** * Gets the elements. * * @return the elements */ public List<IParameterElement> getElements() { return elements; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.eclipse.ui.SOABasePage#dialogChanged() */ @Override protected boolean dialogChanged() { if (super.dialogChanged() == false) return false; /*if (elements.size() < minimumRequiredElementNum) { updateStatus("Please add at least " + minimumRequiredElementNum + " element(s)"); return false; }*/ final Set<String> elemNames = new HashSet<String>(); for (final IParameterElement elem : elements) { if (elemNames.contains(elem.getName())) { updateStatus(this.typesViewer.getTable(), "Duplicate element names>" + elem.getName()); return false; } elemNames.add(elem.getName()); } return true; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.eclipse.ui.SOABasePage#getDefaultValue(org.eclipse.swt.widgets.Text) */ @Override public String getDefaultValue(Text text) { return SOAProjectConstants.EMPTY_STRING; } /** * {@inheritDoc} */ @Override public void createControl(Composite parent) { final Composite container = super.createParentControl(parent, 3); createTypesViewer(container); } private TableViewer createTypesViewer(Composite parent) { final List<ColumnDef> columns = new ArrayList<ColumnDef>(4); { columns.add(new ColumnDef("Name", 80)); columns.add(new ColumnDef("Type", 95)); columns.add(new ColumnDef("Min Occurs", 70)); columns.add(new ColumnDef("Max Occurs", 70)); } typesViewer = new TableButtonPanelViewer(parent, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.SINGLE, columns.toArray(new ColumnDef[0]), true, true) { @Override protected void addButtonSelected(SelectionEvent event) { super.addButtonSelected(event); elements.add(createNewElement("element", "string")); addPressed(); typesViewer.refresh(); AbstractElementManagementWizardPage.this.dialogChanged(); } @Override protected void downButtonSelected(SelectionEvent event) { super.downButtonSelected(event); final Object obj = getSelectedObject(); if (obj instanceof IParameterElement) { ListUtil.moveOnePositionDown(elements, (IParameterElement)obj); typesViewer.refresh(); } } @Override protected void removeButtonSelected(SelectionEvent event) { super.removeButtonSelected(event); final Object obj = getSelectedObject(); if (obj instanceof IParameterElement) { elements.remove(obj); removePrssed(obj); typesViewer.refresh(); AbstractElementManagementWizardPage.this.dialogChanged(); } } @Override protected void upButtonSelected(SelectionEvent event) { super.upButtonSelected(event); final Object obj = getSelectedObject(); if (obj instanceof IParameterElement) { ListUtil.moveOnePositionUp(elements, (IParameterElement)obj); typesViewer.refresh(); } } @Override protected void viewerSelectionChanged( SelectionChangedEvent event) { super.viewerSelectionChanged(event); dialogChanged(); } }; GridData data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 2; final Table table = typesViewer.getTable(); table.setLayoutData(data); typesViewer.setContentProvider(new IStructuredContentProvider() { @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof Collection<?>) { return ((Collection<?>)inputElement).toArray(); } return Collections.EMPTY_LIST.toArray(); } @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); typesViewer.setLabelProvider(new ITableLabelProvider() { @Override public Image getColumnImage(Object element, int columnIndex) { return null; } @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof IParameterElement) { final IParameterElement param = (IParameterElement) element; switch(columnIndex) { case 0: return param.getName(); case 1: return getDataTypeOfParameterElement(param); case 2: return String.valueOf(param.getMinOccurs()); case 3: if (param.getMaxOccurs() < 0) return OCCUR_UNBOUNDED; return String.valueOf(param.getMaxOccurs()); } } return SOAProjectConstants.EMPTY_STRING; } @Override public void addListener(ILabelProviderListener listener) { } @Override public void dispose() { } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { } }); typesViewer.setColumnProperties(PARAMETER_COLUMN_PROPERTIES); typesViewer.setCellModifier(new ICellModifier() { @Override public boolean canModify(Object element, String property) { return true; } @Override public Object getValue(Object element, String property) { if (element instanceof IParameterElement) { final IParameterElement param = (IParameterElement) element; if (COLUMN_NAME.equals(property)) { return param.getName(); } if (COLUMN_TYPE.equals(property)) { return getDataTypeOfParameterElement(param); } else if (COLUMN_OCCUR_MIN.equals(property)) { return String.valueOf(param.getMinOccurs()); } else if (COLUMN_OCCUR_MAX.equals(property)) { if (param.getMaxOccurs() < 0) return OCCUR_UNBOUNDED; return String.valueOf(param.getMaxOccurs()); } } return SOAProjectConstants.EMPTY_STRING; } @Override public void modify(Object element, String property, Object value) { Object obj = null; if (element instanceof Item) { element = ((Item) element).getData(); } try { if (element instanceof IParameterElement) { final IParameterElement param = (IParameterElement) element; if (COLUMN_NAME.equals(property)) { if (param.getName().equals(value) == false) { param.setName(String.valueOf(value)); obj = param; } } else if (COLUMN_TYPE.equals(property)) { //modify datatype if (modifyDataTypeOfParameterElement(param, value)) obj = param; } else if (COLUMN_OCCUR_MIN.equals(property)) { int newValue = Integer.parseInt(String.valueOf(value)); if (param.getMinOccurs() != newValue) { param.setMinOccurs(newValue); obj = param; } } else if (COLUMN_OCCUR_MAX.equals(property)) { if (!String.valueOf(value).equalsIgnoreCase(OCCUR_UNBOUNDED)) { int newValue = Integer.parseInt(String.valueOf(value)); if (param.getMaxOccurs() != newValue) { param.setMaxOccurs(newValue); obj = param; } } else { param.setMaxOccurs(DEFAULT_MAX_OCCURS); obj = param; } } } } catch (RuntimeException e) { updatePageStatus(typesViewer.getTable(), EclipseMessageUtils.createErrorStatus(e)); return; } if (obj != null) { typesViewer.refresh(obj); dialogChanged(); } } }); paramCellEditor = new SOAComboDialogCellEditor(table, SOAProjectConstants.DEFAULT_DATA_TYPES) { @Override protected Object openDialogBox(Control cellEditorWindow) { List<LibraryType> libTypes = null; try { libTypes = getSelectedLibraryTypes(); } catch (Exception e) { SOALogger.getLogger().error(e); } if (libTypes != null) { return openTypeSelectorDialog(UIUtil.getActiveShell(), libTypes.toArray(new LibraryType[0])); } return null; } @Override protected String getValueText(Object value) { if (value instanceof LibraryType) return ((LibraryType)value).getName(); return super.getValueText(value); } }; typesViewer.setCellEditors(new CellEditor[]{ new TextCellEditor(table), paramCellEditor, new TextCellEditor(table), new TextCellEditor(table)}); typesViewer.setInput(this.elements); return typesViewer; } /* (non-Javadoc) * @see org.ebayopensource.turmeric.eclipse.ui.SOABasePage#getHelpContextID() */ @Override public String getHelpContextID() { return GlobalRepositorySystem.instanceOf().getActiveRepositorySystem() .getHelpProvider().getHelpContextID( ISOAHelpProvider.PAGE_CREATE_SCHEMA_TYPE); } /** * Gets the data type of parameter element. * * @param elem the elem * @return the data type of parameter element */ public static String getDataTypeOfParameterElement( IParameterElement elem) { if (elem != null) { if (elem.getDatatype() instanceof LibraryType) { return ((LibraryType)elem.getDatatype()).getName(); } else if (elem.getDatatype() != null){ return elem.getDatatype().toString(); } } return SOAProjectConstants.EMPTY_STRING; } /** * Modify data type of parameter element. * * @param elem the elem * @param value the value * @return true, if successful */ public static boolean modifyDataTypeOfParameterElement(IParameterElement elem, Object value) { if (value.equals(elem.getDatatype()) == false){ elem.setDatatype(value); return true; } return false; } /** * Gets the selected library types. * * @return the selected library types * @throws Exception the exception */ protected abstract List<LibraryType> getSelectedLibraryTypes() throws Exception; /** * Open type selector dialog. * * @param shell the shell * @param libTypes the lib types * @return the object */ protected abstract Object openTypeSelectorDialog(Shell shell, LibraryType[] libTypes); /** * Creates the new element. * * @param name the name * @param type the type * @return the i parameter element */ protected abstract IParameterElement createNewElement(String name, String type); /** * Adds the pressed. */ protected abstract void addPressed(); /** * Removes the prssed. * * @param object the object */ protected abstract void removePrssed(Object object); }