/* * Copyright (c) 2004-2011 Marco Maccaferri 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: * Marco Maccaferri - initial API and implementation */ package org.eclipsetrader.ui.internal.charts.views; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.nebula.widgets.pshelf.PShelf; import org.eclipse.nebula.widgets.pshelf.PShelfItem; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSourceAdapter; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.eclipsetrader.ui.charts.ChartObjectFactoryTransfer; import org.eclipsetrader.ui.internal.UIActivator; public class PaletteView extends ViewPart { public static final String K_ID = "id"; //$NON-NLS-1$ public static final String K_NAME = "name"; //$NON-NLS-1$ public static final String K_DESCRIPTION = "description"; //$NON-NLS-1$ public static final String K_ICON = "icon"; //$NON-NLS-1$ public static final String K_CATEGORY = "category"; //$NON-NLS-1$ private PShelf shelf; public PaletteView() { } /* (non-Javadoc) * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento) */ @Override public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); site.setSelectionProvider(new SelectionProvider()); } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) */ @Override public void createPartControl(Composite parent) { shelf = new PShelf(parent, SWT.NONE); createItems(); shelf.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TableViewer viewer = (TableViewer) e.item.getData(); if (viewer != null) { updateSiteSelection((IStructuredSelection) viewer.getSelection()); } else { getViewSite().getSelectionProvider().setSelection(StructuredSelection.EMPTY); } } }); } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { shelf.setFocus(); } protected void createItems() { IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(UIActivator.INDICATORS_EXTENSION_ID); IConfigurationElement[] configElements = extensionPoint.getConfigurationElements(); List<IConfigurationElement> contributionElements = new ArrayList<IConfigurationElement>(); List<IConfigurationElement> categories = new ArrayList<IConfigurationElement>(); for (int i = 0; i < configElements.length; i++) { if (configElements[i].getName().equals(K_CATEGORY)) { categories.add(configElements[i]); } else { contributionElements.add(configElements[i]); } } for (IConfigurationElement categoryElement : categories) { PShelfItem shelfItem = new PShelfItem(shelf, SWT.NONE); shelfItem.setText(categoryElement.getAttribute(K_NAME)); String icon = categoryElement.getAttribute(K_ICON); if (icon != null) { ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin(categoryElement.getContributor().getName(), icon); final Image image = imageDescriptor != null ? imageDescriptor.createImage() : null; if (image != null) { shelfItem.setImage(image); shelfItem.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { image.dispose(); } }); } } List<IConfigurationElement> addedElements = createContents(shelfItem, contributionElements.toArray(new IConfigurationElement[contributionElements.size()]), categoryElement.getAttribute(K_ID)); contributionElements.removeAll(addedElements); } PShelfItem shelfItem = new PShelfItem(shelf, SWT.NONE); shelfItem.setText(Messages.PaletteView_OtherTitle); ImageDescriptor imageDescriptor = UIActivator.getImageDescriptor("icons/obj16/blank_obj.gif"); //$NON-NLS-1$ final Image image = imageDescriptor != null ? imageDescriptor.createImage() : null; if (image != null) { shelfItem.setImage(image); shelfItem.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { image.dispose(); } }); } createContents(shelfItem, contributionElements.toArray(new IConfigurationElement[contributionElements.size()]), null); } protected List<IConfigurationElement> createContents(PShelfItem shelfItem, IConfigurationElement[] configElements, String categoryId) { shelfItem.getBody().setLayout(new FillLayout()); final TableViewer viewer = new TableViewer(shelfItem.getBody(), SWT.MULTI | SWT.FULL_SELECTION); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new LabelProvider() { private Map<Object, Image> imageMap = new HashMap<Object, Image>(); @Override public Image getImage(Object element) { Image image = imageMap.get(element); if (image == null) { IConfigurationElement configurationElement = (IConfigurationElement) element; String icon = configurationElement.getAttribute(K_ICON); if (icon != null) { ImageDescriptor imageDescriptor = AbstractUIPlugin.imageDescriptorFromPlugin(configurationElement.getContributor().getName(), icon); image = imageDescriptor != null ? imageDescriptor.createImage() : null; imageMap.put(element, image); } } return image; } @Override public void dispose() { for (Image image : imageMap.values()) { image.dispose(); } super.dispose(); } @Override public String getText(Object element) { IConfigurationElement configurationElement = (IConfigurationElement) element; String template = configurationElement.getAttribute(K_DESCRIPTION) != null ? "{0} - {1}" : "{0}"; //$NON-NLS-1$ //$NON-NLS-2$ return NLS.bind(template, new Object[] { configurationElement.getAttribute(K_NAME), configurationElement.getAttribute(K_DESCRIPTION) }); } }); viewer.setSorter(new ViewerSorter()); shelfItem.setData(viewer); viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { updateSiteSelection((IStructuredSelection) event.getSelection()); } }); Transfer[] transferTypes = new Transfer[] { ChartObjectFactoryTransfer.getInstance(), }; viewer.addDragSupport(DND.DROP_COPY | DND.DROP_MOVE, transferTypes, new DragSourceAdapter() { @Override public void dragStart(DragSourceEvent event) { event.doit = !viewer.getSelection().isEmpty(); } @Override public void dragSetData(DragSourceEvent event) { Object[] selection = ((IStructuredSelection) viewer.getSelection()).toArray(); String[] elements = new String[selection.length]; for (int i = 0; i < elements.length; i++) { elements[i] = ((IConfigurationElement) selection[i]).getAttribute("id"); //$NON-NLS-1$ } event.data = elements; } }); List<IConfigurationElement> input = new ArrayList<IConfigurationElement>(); for (int i = 0; i < configElements.length; i++) { if (categoryId == null || categoryId.equals(configElements[i].getAttribute(K_CATEGORY))) { input.add(configElements[i]); } } viewer.setInput(input.toArray()); return input; } protected void updateSiteSelection(IStructuredSelection selection) { if (!selection.isEmpty()) { Object[] ar = selection.toArray(); Object[] o = new Object[ar.length]; for (int i = 0; i < o.length; i++) { try { o[i] = ((IConfigurationElement) ar[i]).createExecutableExtension("class"); //$NON-NLS-1$ } catch (Exception e) { // Do nothing } } getViewSite().getSelectionProvider().setSelection(new StructuredSelection(o)); } else { getViewSite().getSelectionProvider().setSelection(StructuredSelection.EMPTY); } } }