/******************************************************************************* * Copyright (c) 2001, 2006 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 * Trung de Irene <trungha@ca.ibm.com> *******************************************************************************/ package org.eclipse.wst.xsd.ui.internal.dialogs; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; import org.eclipse.wst.common.ui.internal.search.dialogs.ComponentSpecification; import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorPlugin; import org.eclipse.xsd.util.XSDConstants; /** * This class provides the content for SelectBuiltInTypesForFilterDialog * readability Warning: Some simple tricks to tweak efficiency are used */ public class BuiltInTypesTreeViewerProvider { ILabelProvider labelProvider; ITreeContentProvider contentProvider; // private static final String CONST_PARENT = "parent"; /** * Currently there are 3 subgroups: Numbers, Data and Time, Other * Folks can choose to expand to more subgroups */ private static int BUILT_IN_TYPES_SUB_GROUP = 3; static String[] numberTypes = { "base64Binary", "byte", "decimal", "double", "float", "hexBinary", "int", "integer", "long", "negativeInteger", "nonNegativeInteger", "nonPositiveInteger", "positiveInteger", "short", "unsignedByte", "unsignedInt", "unsignedLong", "unsignedShort"}; static String[] dateAndTimeTypes = { "date", "dateTime", "duration", "gDay", "gMonth", "gMonthDay", "gYear", "gYearMonth", "time"}; public static List getAllBuiltInTypes() { List items = new ArrayList(); //for (int i = 0; i < XSDDOMHelper.dataType.length; i++) { // items.add(XSDDOMHelper.dataType[i][0]); //} Iterator it = items.iterator(); List mainContainer = new ArrayList(BUILT_IN_TYPES_SUB_GROUP); ComponentSpecification header = new ComponentSpecification("", "Root", null); mainContainer.add(header); List numbersGroup = new ArrayList(); header = new ComponentSpecification("", "Numbers", null); numbersGroup.add(header); mainContainer.add(numbersGroup); List dateAndTimeGroup = new ArrayList(); header = new ComponentSpecification("", "Date and Time", null); dateAndTimeGroup.add(header); mainContainer.add(dateAndTimeGroup); List otherGroup = new ArrayList(); header = new ComponentSpecification("", "Other", null); otherGroup.add(header); mainContainer.add(otherGroup); while (it.hasNext()) { Object item = it.next(); String name = item.toString(); ComponentSpecification builtInTypeItem = new ComponentSpecification(name, XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, null); // if this built-In Type is in Number group if ( partOf(name, numberTypes) ){ // Set parent //builtInTypeItem.addAttributeInfo(CONST_PARENT, numbersGroup); numbersGroup.add(builtInTypeItem); } // if this built-In Type is in Date-and-Time group else if ( partOf(name, dateAndTimeTypes)){ //builtInTypeItem.addAttributeInfo(CONST_PARENT, dateAndTimeGroup); dateAndTimeGroup.add(builtInTypeItem); } // otherwise, put in Other group else { //builtInTypeItem.addAttributeInfo(CONST_PARENT, otherGroup); otherGroup.add(builtInTypeItem); } } return mainContainer; } public ILabelProvider getLabelProvider(){ if (labelProvider != null) return labelProvider; labelProvider = new BuiltInTypeLabelProvider(); return labelProvider; } public ITreeContentProvider getContentProvider() { if (contentProvider != null) return contentProvider; contentProvider = new BuiltInTypesTreeContentProvider(); return contentProvider; } /** * Determines whether an equivalent of 'item' appears in 'array' * @param item * @param array * @return */ private static boolean partOf(String item, String[] array){ for(int i = 0; i < array.length; i++ ){ if ( item.equals(array[i]) ){ return true; } } return false; } class BuiltInTypeLabelProvider implements ILabelProvider{ public Image getImage(Object element) { if ( getText(element).equals("Numbers") ) return XSDEditorPlugin.getXSDImage("icons/XSDNumberTypes.gif"); if ( getText(element).equals("Date and Time") ) return XSDEditorPlugin.getXSDImage("icons/XSDDateAndTimeTypes.gif"); if ( getText(element).equals("Other") ) return XSDEditorPlugin.getXSDImage("icons/browsebutton.gif"); if ( element instanceof ComponentSpecification ){ return XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"); } return null; } public String getText(Object element) { ComponentSpecification spec = null; /* if not non-leaf node, the first element has the name for * the whole list */ if (element instanceof List){ spec = (ComponentSpecification) ((List) element).get(0); } else if (element instanceof ComponentSpecification ){ spec = (ComponentSpecification) element; } return spec.getName(); } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } } class BuiltInTypesTreeContentProvider implements ITreeContentProvider { public Object[] getChildren(Object parentElement) { if (parentElement instanceof List) { List parentContent = (List) parentElement; /** Ignore the first element (which contains the name of this list * ie. 'Numbers', 'Date and time', 'Other') */ return parentContent.subList(1, parentContent.size()).toArray(); } return new Object[0]; } public Object[] getElements(Object inputElement) { return getChildren(inputElement); } public Object getParent(Object element) { return null; } public boolean hasChildren(Object element) { if (getChildren(element).length > 1) { return true; } return false; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public void dispose() { } } }