| /* |
| * Copyright (c) 2002 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM - Initial API and implementation |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| */ |
| package org.eclipse.wst.xml.ui.internal.catalog; |
| |
| import java.text.Collator; |
| import java.util.Arrays; |
| import java.util.Comparator; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Vector; |
| |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jface.viewers.ViewerFilter; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.ui.IEditorRegistry; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.wst.common.uriresolver.internal.util.URIHelper; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog; |
| |
| |
| public class XMLCatalogTreeViewer extends TreeViewer |
| { |
| public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002."; |
| protected static Image xmlCatalogImage = ImageFactory.INSTANCE.getImage("icons/obj16/xmlcatalog_obj.gif"); |
| protected static Image errorImage = ImageFactory.INSTANCE.getImage("icons/ovr16/error-overlay.gif"); |
| protected static Image entryImage = ImageFactory.INSTANCE.getImage("icons/obj16/entry_obj.gif"); |
| protected static Image nextCatalogImage = ImageFactory.INSTANCE.getImage("icons/obj16/nextCatalog_obj.gif"); |
| |
| protected static String ERROR_STATE_KEY = "errorstatekey"; |
| |
| protected ICatalog workingUserCatalog; |
| protected ICatalog systemCatalog; |
| |
| public static String USER_SPECIFIED_ENTRIES_OBJECT = XMLCatalogMessages.UI_LABEL_USER_SPECIFIED_ENTRIES; |
| public static String PLUGIN_SPECIFIED_ENTRIES_OBJECT = XMLCatalogMessages.UI_LABEL_PLUGIN_SPECIFIED_ENTRIES; |
| |
| public XMLCatalogTreeViewer(Composite parent, ICatalog workingUserCatalog, ICatalog systemCatalog) |
| { |
| super(parent, SWT.NONE); |
| this.workingUserCatalog = workingUserCatalog; |
| this.systemCatalog = systemCatalog; |
| |
| setContentProvider(new CatalogEntryContentProvider()); |
| setLabelProvider(new CatalogEntryLabelProvider()); |
| } |
| |
| public void setFilterExtensions(String[] extensions) |
| { |
| resetFilters(); |
| addFilter(new XMLCatalogTableViewerFilter(extensions)); |
| } |
| |
| public class CatalogEntryLabelProvider extends LabelProvider |
| { |
| protected HashMap imageTable = new HashMap(); |
| |
| public String getText(Object object) |
| { |
| String result = null; |
| if (object instanceof ICatalogEntry) |
| { |
| ICatalogEntry catalogEntry = (ICatalogEntry)object; |
| result = catalogEntry.getKey(); |
| //result = URIHelper.removePlatformResourceProtocol(result); |
| } |
| else if(object instanceof INextCatalog){ |
| INextCatalog nextCatalog = (INextCatalog)object; |
| result = nextCatalog.getCatalogLocation(); |
| } |
| return result != null ? result : object.toString(); |
| } |
| |
| public Image getImage(Object object) |
| { |
| Image result = null; |
| Image base = null; |
| if (object instanceof String) |
| { |
| result = xmlCatalogImage; |
| } |
| else if (object instanceof ICatalogEntry) |
| { |
| ICatalogEntry catalogEntry = (ICatalogEntry)object; |
| String uri = catalogEntry.getURI(); |
| IEditorRegistry er = PlatformUI.getWorkbench().getEditorRegistry(); |
| ImageDescriptor imageDescriptor = er.getImageDescriptor(uri); |
| Image image = (Image)imageTable.get(imageDescriptor); |
| if (image == null) |
| { |
| image = imageDescriptor.createImage(); |
| imageTable.put(imageDescriptor, image); |
| } |
| base = image; |
| |
| if (base != null) |
| { |
| if (URIHelper.isReadableURI(uri, false)) |
| { |
| result = base; |
| } |
| else |
| { |
| result = ImageFactory.INSTANCE.createCompositeImage(base, errorImage, ImageFactory.BOTTOM_LEFT); |
| } |
| } |
| } |
| else if(object instanceof INextCatalog) |
| { |
| // TODO: add image to the imageTable and add error overlay if next catalog URI is not readable |
| result = nextCatalogImage; |
| } |
| return result; |
| } |
| } |
| |
| |
| public class CatalogEntryContentProvider implements ITreeContentProvider |
| { |
| protected Object[] roots; |
| |
| public CatalogEntryContentProvider() |
| { |
| roots = new Object[2]; |
| roots[0] = USER_SPECIFIED_ENTRIES_OBJECT; |
| roots[1] = PLUGIN_SPECIFIED_ENTRIES_OBJECT; |
| } |
| |
| public boolean isRoot(Object object) |
| { |
| return object instanceof String || object instanceof INextCatalog; |
| } |
| |
| public Object[] getElements(Object element) |
| { |
| return roots; |
| } |
| |
| public Object[] getChildren(Object parentElement) |
| { |
| Object[] result = new Object[0]; |
| if (parentElement == roots[0]) |
| { |
| result = getChildrenHelper(workingUserCatalog); |
| } |
| else if (parentElement == roots[1]) |
| { |
| result = getChildrenHelper(systemCatalog); |
| } |
| else if(parentElement instanceof INextCatalog){ |
| ICatalog nextCatalog = ((INextCatalog)parentElement).getReferencedCatalog(); |
| result = getChildrenHelper(nextCatalog); |
| } |
| return result; |
| } |
| |
| protected Object[] getChildrenHelper(ICatalog catalog) |
| { |
| // TODO add entries from the nested catalogs |
| |
| ICatalogEntry[] entries = catalog.getCatalogEntries(); |
| if (entries.length > 0) |
| { |
| Comparator comparator = new Comparator() |
| { |
| public int compare(Object o1, Object o2) |
| { |
| int result = 0; |
| if (o1 instanceof ICatalogEntry && o2 instanceof ICatalogEntry) |
| { |
| ICatalogEntry entry1 = (ICatalogEntry)o1; |
| ICatalogEntry entry2 = (ICatalogEntry)o2; |
| result = Collator.getInstance().compare(entry1.getKey(), entry2.getKey()); |
| } |
| return result; |
| } |
| }; |
| Arrays.sort(entries, comparator); |
| } |
| Vector result = new Vector(); |
| result.addAll(Arrays.asList(entries)); |
| INextCatalog[] nextCatalogs = catalog.getNextCatalogs(); |
| List nextCatalogsList = Arrays.asList(nextCatalogs); |
| result.addAll(nextCatalogsList); |
| |
| return (ICatalogElement[]) result.toArray(new ICatalogElement[result.size()]); |
| }; |
| |
| public Object getParent(Object element) |
| { |
| return (element instanceof String) ? null : USER_SPECIFIED_ENTRIES_OBJECT; |
| } |
| |
| public boolean hasChildren(Object element) |
| { |
| return isRoot(element) ? getChildren(element).length > 0 : false; |
| } |
| |
| public void dispose() |
| { |
| } |
| |
| public void inputChanged(Viewer viewer, Object old, Object newobj) |
| { |
| } |
| |
| public boolean isDeleted(Object object) |
| { |
| return false; |
| } |
| } |
| |
| |
| public void menuAboutToShow(IMenuManager menuManager) |
| { |
| Action action = new Action("hello") |
| { |
| public void run() |
| { |
| System.out.println("run!"); |
| } |
| }; |
| menuManager.add(action); |
| } |
| |
| |
| class XMLCatalogTableViewerFilter extends ViewerFilter |
| { |
| protected String[] extensions; |
| |
| public XMLCatalogTableViewerFilter(String[] extensions) |
| { |
| this.extensions = extensions; |
| } |
| |
| public boolean isFilterProperty(Object element, Object property) |
| { |
| return false; |
| } |
| |
| public boolean select(Viewer viewer, Object parent, Object element) |
| { |
| boolean result = false; |
| if (element instanceof ICatalogEntry) |
| { |
| ICatalogEntry catalogEntry = (ICatalogEntry)element; |
| for (int i = 0; i < extensions.length; i++) |
| { |
| if (catalogEntry.getURI().endsWith(extensions[i])) |
| { |
| result = true; |
| break; |
| } |
| } |
| } |
| return result; |
| } |
| } |
| |
| |
| } |