/****************************************************************************** * Copyright (c) 2002, 2008 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 ****************************************************************************/ package org.eclipse.gmf.runtime.diagram.ui.requests; import java.util.Collections; import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.draw2d.geometry.Point; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.requests.CreateRequest; import org.eclipse.gef.requests.CreationFactory; import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint; import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil; import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter; import org.eclipse.gmf.runtime.notation.Node; import org.eclipse.gmf.runtime.notation.View; /** * * A request to create new <code>IView</code> (s) * * To instantiate this request, clients have to create a <code>ViewDescriptor</code> * or a list of <code>ViewDescriptor</code> s filling it with view creation * parameters. The <code>ViewDescriptor</code> is a inner class to this * request * * The request object can be used to obtain a view creation command from a * target <code>EditPart</code> Once such command is executed, the request * cannot be reused again to create another view. A different instance of the * reqyest has to be used instead * * @author melaasar * */ public class CreateViewRequest extends CreateRequest { /** * A view descriptor that contains attributes needed to create the view The * class is also a mutable adapter that initially adapts to nothing, but * can adapt to <code> IView </code> after the view has been created (by * executing the creation command returned from edit policies in response * to this request) This is how GEF works!! */ public static class ViewDescriptor implements IAdaptable { /** the element adapter */ private final IAdaptable elementAdapter; /** the view kind */ private final Class viewKind; /** the semantic hint */ private final String semanticHint; /** the index */ private final int index; /** The underlying view element */ private View view; /** persisted view flag. */ private boolean _persisted; /** * The hint used to find the appropriate preference store from which general * diagramming preference values for properties of shapes, connections, and * diagrams can be retrieved. This hint is mapped to a preference store in * the {@link DiagramPreferencesRegistry}. */ private PreferencesHint preferencesHint; /** * Creates a new view descriptor using element adapter * * @param elementAdapter the element adapter referened by the view * @param preferencesHint * The preference hint that is to be used to find the appropriate * preference store from which to retrieve diagram preference * values. The preference hint is mapped to a preference store in * the preference registry <@link DiagramPreferencesRegistry>. */ public ViewDescriptor(IAdaptable elementAdapter, PreferencesHint preferencesHint) { this(elementAdapter, Node.class, preferencesHint); } /** * Creates a new view descriptor using element adapter and a view kind * * @param elementAdapter the element adapter referened by the view * @param viewkind the kind of the view to be created (a concrete class * derived from IView) * @param preferencesHint * The preference hint that is to be used to find the appropriate * preference store from which to retrieve diagram preference * values. The preference hint is mapped to a preference store in * the preference registry <@link DiagramPreferencesRegistry>. */ public ViewDescriptor(IAdaptable elementAdapter, Class viewkind, PreferencesHint preferencesHint) { this(elementAdapter, viewkind, "", preferencesHint); //$NON-NLS-1$ } /** * Creates a new view descriptor using element adapter and a view kind * * @param elementAdapter the element adapter referened by the view * @param viewkind the kind of the view to be created (a concrete class * derived from IView) * @param persisted * indicates if the view will be created as a persisted * view or transient * @param preferencesHint * The preference hint that is to be used to find the appropriate * preference store from which to retrieve diagram preference * values. The preference hint is mapped to a preference store in * the preference registry <@link DiagramPreferencesRegistry>. */ public ViewDescriptor(IAdaptable elementAdapter, Class viewkind,boolean persisted, PreferencesHint preferencesHint) { this(elementAdapter, viewkind, "",persisted, preferencesHint); //$NON-NLS-1$ } /** * Creates a new view descriptor using element adapter, a view kind and * a factory hint * * @param elementAdapter the element adapter referened by the view * @param viewkind the kind of the view to be created * @param semanticHint the semantic hint of the view * @param preferencesHint * The preference hint that is to be used to find the appropriate * preference store from which to retrieve diagram preference * values. The preference hint is mapped to a preference store in * the preference registry <@link DiagramPreferencesRegistry>. */ public ViewDescriptor( IAdaptable elementAdapter, Class viewkind, String semanticHint, PreferencesHint preferencesHint) { this(elementAdapter, viewkind, semanticHint, ViewUtil.APPEND, preferencesHint); } /** * Creates a new view descriptor using element adapter, a view kind and * a factory hint * * @param elementAdapter the element adapter referened by the view * @param viewkind the kind of the view to be created * @param semanticHint the semantic hint of the view * @param persisted * indicates if the view will be created as a persisted * view or transient * @param preferencesHint * The preference hint that is to be used to find the appropriate * preference store from which to retrieve diagram preference * values. The preference hint is mapped to a preference store in * the preference registry <@link DiagramPreferencesRegistry>. */ public ViewDescriptor( IAdaptable elementAdapter, Class viewkind, String semanticHint, boolean persisted, PreferencesHint preferencesHint) { this(elementAdapter, viewkind, semanticHint, ViewUtil.APPEND,persisted, preferencesHint); } /** * Creates a new view descriptor using the supplied element adapter, * view kind, factory hint and index. * <P> * Same as calling <code>new ViewDescriptor(elementAdapter, viewKind, factoryHint, index, true);</code> * @param elementAdapter the element adapter referened by the view * @param viewKind the kind of the view to be created (a concrete class derived from View) * @param factoryHint the semantic hint of the view * @param index the index of the view in its parent's children collection */ public ViewDescriptor( IAdaptable elementAdapter, Class viewKind, String factoryHint, int index, PreferencesHint preferencesHint) { this(elementAdapter, viewKind, factoryHint, index, true, preferencesHint); } /** * Creates a new view descriptor using the supplied element adapter, * view kind, factory hint, index and persistence flag. * @param elementAdapter the element adapter referened by the view * @param viewKind the kind of the view to be created (a concrete class derived from View) * @param semanticHint the semantic hint of the view * @param index the index of the view in its parent's children collection * @param persisted set <true> to create a persisted (attached) view; * <tt>false</tt> to create a detached (non-persisted) view. */ public ViewDescriptor( IAdaptable elementAdapter, Class viewKind, String semanticHint, int index, boolean persisted, PreferencesHint preferencesHint) { Assert.isNotNull(viewKind); Assert.isTrue(index >= ViewUtil.APPEND); this.elementAdapter = elementAdapter; this.viewKind = viewKind; this.semanticHint = semanticHint; this.index = index; _persisted = persisted; this.preferencesHint = preferencesHint; } /** * Adapts to IView * * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class) */ public Object getAdapter(Class adapter) { if (adapter.isInstance(view)) return view; return null; } /** * Method setView. * * @param view */ public void setView(View view) { this.view = view; } /** * Method setPersisted. * * @param persisted */ public void setPersisted( boolean persisted ) { _persisted = persisted; } /** * Method getelementAdapter. * * @return IAdaptable */ public IAdaptable getElementAdapter() { return elementAdapter; } /** * Method getViewKind. * * @return Class */ public Class getViewKind() { return viewKind; } /** * Method getSemanticHint. * * @return String */ public String getSemanticHint() { return semanticHint; } /** * Method getIndex. * * @return int */ public int getIndex() { return index; } /** * Return <tt>true</tt> if the view will be persisted; otherwise <tt>false</tt> * @return <code>true</code> or <code>false</code> */ public final boolean isPersisted() { return _persisted; } /** * Gets the preferences hint that is to be used to find the appropriate * preference store from which to retrieve diagram preference values. The * preference hint is mapped to a preference store in the preference * registry <@link DiagramPreferencesRegistry>. * * @return the preferences hint */ public PreferencesHint getPreferencesHint() { return preferencesHint; } } /** * The view descriptors set by the user */ private List<? extends ViewDescriptor> viewDescriptors; /** * Convenience constructor for CreateViewRequest using a <code>IElement</code> * * @param element a semantic element * @param preferencesHint * The preference hint that is to be used to find the appropriate * preference store from which to retrieve diagram preference * values. The preference hint is mapped to a preference store in * the preference registry <@link DiagramPreferencesRegistry>. */ public CreateViewRequest(EObject element, PreferencesHint preferencesHint) { this(new ViewDescriptor(new EObjectAdapter(element), preferencesHint)); } /** * Constructor for CreateViewRequest using a <code>ViewDescriptor</code> * * @param viewDescriptor a view descriptor */ public CreateViewRequest(ViewDescriptor viewDescriptor) { this(Collections.singletonList(viewDescriptor)); } /** * Constructor for CreateViewRequest using a list of <code>ViewDescriptor</code> * s * * @param viewDescriptors a list of view descriptors */ public CreateViewRequest(List<? extends ViewDescriptor> viewDescriptors) { Assert.isNotNull(viewDescriptors); this.viewDescriptors = viewDescriptors; setLocation(new Point(-1,-1)); } /** * Constructor for CreateViewRequest using a request type and a <code>ViewDescriptor</code> * * @param type request type * @param viewDescriptor a view descriptor */ public CreateViewRequest(Object type, ViewDescriptor viewDescriptor) { this(type, Collections.singletonList(viewDescriptor)); } /** * Constructor for CreateViewRequest using a request type and list of * <code>ViewDescriptor</code> s * * @param type the request type * @param viewDescriptors a list of view descriptors */ public CreateViewRequest(Object type, List<? extends ViewDescriptor> viewDescriptors) { super(type); Assert.isNotNull(viewDescriptors); this.viewDescriptors = viewDescriptors; setLocation(new Point(-1,-1)); } /** * Returns the viewDescriptors list * * @return List of <code>ViewDescriptor</code> s */ public List<? extends ViewDescriptor> getViewDescriptors() { return viewDescriptors; } /** * A list of <code>IAdaptable</code> objects that adapt to <code>View</code> * .class * * @see org.eclipse.gef.requests.CreateRequest#getNewObject() */ public Object getNewObject() { return getViewDescriptors(); } /** * The type is a List of <code>IAdaptable</code> objects that adapt to * <code>IView</code> .class * * @see org.eclipse.gef.requests.CreateRequest#getNewObjectType() */ public Object getNewObjectType() { return List.class; } /** * The factory mechanism is not used * @throws UnsupportedOperationException */ protected CreationFactory getFactory() { throw new UnsupportedOperationException("The Factory mechanism is not used"); //$NON-NLS-1$ } /** * The factory mechanism is not used */ public void setFactory(CreationFactory factory) { throw new UnsupportedOperationException("The Factory mechanism is not used"); //$NON-NLS-1$ } }