/******************************************************************************* * Copyright (c) 2008 Hallvard Traetteberg. * 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: * Hallvard Traetteberg - initial API and implementation ******************************************************************************/ package org.eclipse.e4.tm.ui; import java.util.Iterator; import java.util.StringTokenizer; import org.eclipse.e4.tm.builder.IBuilderListener; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerDropAdapter; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DragSourceListener; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; public class EcorePaletteView extends ViewPart { private TmPartStyle partStyle = new TmPartStyle.SashStyle(); private EditingDomainModelContext editingDomainModelContext = new EditingDomainModelContext(partStyle); private TreeViewer viewer; public void createPartControl(Composite parent) { final Transfer[] dragTransfers = new Transfer[]{TextTransfer.getInstance()}; final DragSourceListener dragSourceListener = new DragSourceListener() { private String uris; public void dragFinished(DragSourceEvent event) { uris = null; } public void dragSetData(DragSourceEvent event) { if (TextTransfer.getInstance().isSupportedType(event.dataType)) { event.data = uris; } } public void dragStart(DragSourceEvent event) { Control control = ((DragSource)event.getSource()).getControl(); uris = null; if (control == viewer.getControl() && viewer.getSelection() instanceof IStructuredSelection) { uris = getUriString(((IStructuredSelection)viewer.getSelection()).iterator()); } else { Object controlData = control.getData("modelUri"); if (controlData != null) { uris = controlData.toString(); } } event.doit = (uris != null); } }; editingDomainModelContext.addBuilderListener(new IBuilderListener() { public void objectHandled(int id, EObject eObject, Object object) { if (id == IBuilderListener.BUILD && object instanceof Control) { Control control = (Control)object; DragSource ds = new DragSource(control, DND.DROP_COPY); ds.setTransfer(dragTransfers); ds.addDragListener(dragSourceListener); } } }); editingDomainModelContext.createControls(parent); partStyle.getTreeParent().setLayout(new FillLayout()); viewer = new TreeViewer(new Tree(partStyle.getTreeParent(), SWT.SINGLE | SWT.V_SCROLL)); // force creation of adapterFactory viewer.setContentProvider(new AdapterFactoryContentProvider(editingDomainModelContext.getAdapterFactory())); viewer.setLabelProvider(new TmLabelProvider(new AdapterFactoryLabelProvider(editingDomainModelContext.getAdapterFactory()))); viewer.setInput(editingDomainModelContext.getResourceSet()); viewer.addDragSupport(DND.DROP_COPY, dragTransfers, dragSourceListener); final Transfer[] dropTransfers = new Transfer[]{ // ResourceTransfer.getInstance(), FileTransfer.getInstance() }; viewer.addDropSupport(DND.DROP_COPY | DND.DROP_LINK , dropTransfers, new ViewerDropAdapter(viewer) { public boolean validateDrop(Object target, int operation, TransferData transferType) { setFeedbackEnabled(false); for (int i = 0; i < dropTransfers.length; i++) { if (dropTransfers[i].isSupportedType(transferType)) { return true; } } return false; } public boolean performDrop(Object data) { boolean result = false; if (data instanceof String[]) { String[] filenames = (String[])data; for (int i = 0; i < filenames.length; i++) { result |= editingDomainModelContext.addResource(URI.createFileURI(filenames[i])); } } return result; } }); createActions(); createMenu(); createToolbar(); } public void dispose() { editingDomainModelContext.dispose(); super.dispose(); } public void setFocus() { viewer.getControl().setFocus(); } // public final static String FRAGMENT_SEPARATOR = "#"; private String getUriString(Iterator<?> it) { String uris = null; while (it.hasNext()) { Object o = it.next(); URI uri = null; if (o instanceof EObject) { uri = EcoreUtil.getURI((EObject)o); } else if (o instanceof Resource) { uri = ((Resource)o).getURI(); } if (uri != null) { if (uris == null) { uris = uri.toString(); } else { uris += " " + uri; } } } return uris; } // private final static String STORE_URIS = "EcorePaletteView.uris"; public void saveState(IMemento memento) { super.saveState(memento); memento.putString(STORE_URIS, getUriString(editingDomainModelContext.getResourceSet().getResources().iterator())); } public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); if (memento != null) { String uris = memento.getString(STORE_URIS); if (uris != null) { for (StringTokenizer tokens = new StringTokenizer(uris); tokens.hasMoreTokens();) { editingDomainModelContext.addResource(URI.createURI(tokens.nextToken())); } } } } // private IAction deleteAction; private void createActions() { deleteAction = new Action("Delete") { public void run() { ISelection selection = viewer.getSelection(); if (selection instanceof IStructuredSelection) { for (Iterator<?> it = ((IStructuredSelection)selection).iterator(); it.hasNext();) { Object o = it.next(); if (o instanceof Resource) { Resource resource = (Resource)o; editingDomainModelContext.getResourceSet().getResources().remove(resource); } } } } }; } // private void createMenu() { IMenuManager menuManager = getViewSite().getActionBars().getMenuManager(); menuManager.add(editingDomainModelContext.loadResourceAction); // menuManager.add(deleteAction); } private void createToolbar() { IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager(); toolBarManager.add(editingDomainModelContext.loadResourceAction); // toolBarManager.add(deleteAction); } }