uidesigner/com.nokia.sdt.uimodel/src/com/nokia/sdt/datamodel/IDesignerDataModel.java
changeset 0 fb279309251b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uidesigner/com.nokia.sdt.uimodel/src/com/nokia/sdt/datamodel/IDesignerDataModel.java	Fri Apr 03 23:33:03 2009 +0100
@@ -0,0 +1,370 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+package com.nokia.sdt.datamodel;
+
+import com.nokia.sdt.component.IComponent;
+import com.nokia.sdt.component.IComponentSet;
+import com.nokia.sdt.component.event.IEventDescriptor;
+import com.nokia.sdt.datamodel.adapter.IComponentInstance;
+import com.nokia.sdt.datamodel.adapter.IEventBinding;
+import com.nokia.sdt.displaymodel.IDisplayModel;
+import com.nokia.sdt.sourcegen.ISourceGenSession;
+import com.nokia.cpp.internal.api.utils.core.CacheMap;
+import com.nokia.sdt.workspace.IDesignerDataModelSpecifier;
+import com.nokia.sdt.workspace.IProjectContext;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.domain.EditingDomain;
+
+import java.util.Collection;
+import java.util.List;
+
+	/**
+	 * Abstract interface for an EMF model usable with
+	 * UI Designer. Both the UI designer and the display
+	 * model interact with the model via this API
+	 * and a standard set of adapter interfaces.
+	 */
+public interface IDesignerDataModel {
+	
+	/**
+	 * Return the abstract specifier for this model
+	 */
+	IDesignerDataModelSpecifier getModelSpecifier();
+	
+	/**
+	 * Return the abstract project context for this model
+	 */
+	IProjectContext getProjectContext();
+
+		/**
+		 * Releases all resources used by the model. Do not
+		 * use this instance after calling dispose
+		 */
+	void dispose();
+	
+		/**
+		 * Provides an EMF editing domain
+		 * @see org.eclipse.emf.edit.domain.EditingDomain
+		 */
+	EditingDomain getEditingDomain();
+	
+	/**
+	 * Returns the root object of the data model. This is not necessarily
+	 * the root visual container
+	 * @see #getRootContainers()
+	 */
+	EObject getRoot();
+	
+		/**
+		 * Returns the model objects corresponding to the
+		 * root visual containers. These objects are not
+		 * necessarily roots in the model implementation, i.e.
+		 * they may have parent objects.
+		 * @see org.eclipse.emf.ecore.EObject
+		 * @returns non-null array of containers
+		 */
+	EObject[] getRootContainers();
+	
+	/**
+	 * Create a new root container instance. 
+	 * The new object is added as a root container to the data model
+	 * @param component the component to associate with the new object
+	 */
+	EObject createRootContainerInstance(IComponent component);
+	
+		/**
+		 * Returns the component set associated with the
+		 * data model. All components are found within
+		 * the scope of this component set.
+		 */
+	IComponentSet getComponentSet();
+	
+		/**
+		 * Establishes a new component set for the model.
+		 * The model is not immediately validated
+		 * against the new component set, the valdate method
+		 * must be called to do so.
+		 * @param cs may not be null
+		 * @throws CoreException 
+		 */
+	void setComponentSet(IComponentSet cs) throws CoreException;
+	
+		/**
+		 * Validate the structure of a data model and
+		 * the current data against the current component
+		 * set.
+		 */
+	Collection<IModelMessage> validate();
+	
+		/**
+		 * Returns the display model for this data model,
+		 * initializing one if necessary
+		 */
+	IDisplayModel getDisplayModelForRootContainer(EObject rootContainer) throws CoreException;
+	
+		/**
+		 * Returns an existing display model, if there is one. 
+		 * Does not create otherwise.
+		 */
+	IDisplayModel getExistingDisplayModelForRootContainer(EObject rootContainer);
+	
+		/**
+		 * Notification that display model is disposed
+		 */
+	void displayModelDisposed(IDisplayModel displayModel);
+	
+		/**
+		 * Install the given EMF adapter factory into the
+		 * model. The factory will then be able to fulfill
+		 * adapter requests.
+		 */
+	void addAdapterFactory(AdapterFactory adapterFactory);
+	
+	/**
+	 * Create a new component instance. The new object is not
+	 * part of the data model, and should be added via
+	 * createAddNewComponentInstanceCommand
+	 * @param tool the component to associate with the new object
+	 */
+	EObject createNewComponentInstance(IComponent tool);
+	
+	static final int IN_FRONT = 0;
+	static final int AT_END = -1;
+		/**
+		 * Creates an undoable EMF command to insert a new instance of a component
+		 * @param owner the parent object for the new object
+		 * @param child EObject previously created from createNewComponentInstance. It
+		 * must not have been previously added to the data model.
+		 * @param insertionPosition position at which to insert the new object. Use
+		 * the constants IN_FRONT, AT_END, or the index of an existing object under the given owner.
+		 * @return an executable command
+		 */
+	Command createAddNewComponentInstanceCommand(EObject owner, EObject child, int insertionPosition);
+	
+		/**
+		 * Creates an undoable EMF command to remove a collection of existing component instances
+		 * @param objectsToRemove a list of objects to be removed
+		 * @return an executable command
+		 */
+	Command createRemoveComponentInstancesCommand(List<EObject> objectsToRemove);
+	
+		/**
+		 * Creates an undoable EMF command to move an existing component instance object.
+		 * The object can be moved to a different owner or re-ordered within the same
+		 * owner.
+		 * @param targetObject the object to be moved
+		 * @param newOwner the new owner for the object. Can be the existing owner
+		 * @param insertionPosition the desired position for the object. Use
+		 * the constants IN_FRONT, AT_END, or the index of an existing object under the given owner.
+	     * @return an executable command
+		 */
+	Command createMoveComponentInstanceCommand(EObject targetObject, EObject newOwner, int insertionPosition);
+	
+		/**
+		 * Creates an undoable EMF command to copy a collection of component instances
+		 * to the EMF EditingDomain's clipboard.
+		 * @param objectsToCopy a List of EObject
+		 * @return an executable command
+		 */
+	Command createCopyComponentInstancesCommand(List objectsToCopy);
+	
+	/**
+	 * Creates an undoable EMF command which copy a collection of component instances
+	 * to the EMF EditingDomain's clipboard and removes them from the model.
+	 * @param objectsToCut a List of EObject
+	 * @return an executable command
+	 */
+	Command createCutComponentInstancesCommand(List objectsToCut);
+
+		/**
+		 * Creates an undoable EMF command to paste the component instances on the 
+		 * EMF EditingDomain's clipboard to the model as children of <code>owner</code>.
+		 * @param owner the instance to copy to
+		 * @return an executable command
+		 */
+	Command createPasteComponentInstancesCommand(EObject owner);
+	
+		/**
+		 * Creates an undoable command to add an event binding
+		 * @param targetObject object to receive the new binding
+		 * @param event descriptor for the event
+		 * @param userSpecifiedHandlerName the desired event handler method name. Use null to allow the default, recommended handler name.
+		 * @return an executable command
+		 */
+	Command createAddEventBindingCommand(EObject targetObject, IEventDescriptor event, String userSpecifiedHandlerName);
+	
+		/**
+		 * Creates an undoable command to remove an existing 
+		 * event binding.
+		 * @param eventBinding the binding to remove. The target object
+		 * is implied by the binding
+		 * @return an executable command
+		 */
+	Command createRemoveEventBindingCommand(IEventBinding eventBinding);
+	
+		/**
+		 * Returns a list of the resources for this data model.
+		 * The list contains only the primary resources involved with saving
+		 * the model data and not other resources generated from it, i.e.
+		 * generated source code.
+		 */
+	Resource[] getResources();
+	
+		/**
+		 * Returns a list of the read-only resources for this data model.
+		 * A null return value implies the model can be saved, non-null
+		 * that it cannot.
+		 */
+	Resource[] getReadOnlyResources();
+	
+		/**
+		 * Saves the data model to its storage. Throws an exception 
+		 * upon failure.
+		 * @param monitor 
+		 */
+	void	saveModel(IProgressMonitor monitor) throws Exception;
+	
+		/**
+		 * Save the data model to a new file. Future calls
+		 * to saveModel will save to the new file
+		 */
+	void	saveModelAs(IDesignerDataModelSpecifier modelSpecifier, IProgressMonitor monitor) throws Exception;
+	
+		/**
+		 * Return the id of the name property.
+		 */
+	Object getNamePropertyId();
+	
+		/**
+		 * Searches the model for a component instance with the given 
+		 * name.
+		 */
+	EObject findByNameProperty(String name);
+	
+		/**
+		 * Provide a base name for a new component instance.
+		 * The name may subsequently have a suffix added to
+		 * ensure uniqueness within the model.
+		 */
+	String getInstanceNameRoot(IComponent component);
+
+		/**
+		 * Returns the IDesignerDataModelProvider that
+		 * created this model. May be used to
+		 * create temporary models compatible
+		 * with this model
+		 */
+	IDesignerDataModelProvider getProvider();
+    
+        /**
+         * Return a string property from the data model.
+         * @param propertyId the property name
+         * @return the property value, or null if property does not exist
+         */
+    String getProperty(String propertyId);
+
+        /**
+         * Set a string property in the data model.
+         * @param propertyId the property name
+         * @param value the property value (must not be null)
+         */
+    void setProperty(String propertyId, String value);
+    
+        /**
+         * Remove a string property from the data model.
+         * @param propertyId the property name
+         */
+    void removeProperty(String propertyId);
+    
+    	/**
+    	 * Get the root component instances
+    	 */
+    IComponentInstance[] getRootComponentInstances();
+    
+		/**
+    	 * Set the source gen session.  Setting the session
+    	 * does not guarantee source will be generated
+    	 * if the model does not have a source gen provider
+    	 * property set.
+    	 */
+    void setSourceGenSession(ISourceGenSession session);
+
+		/**
+		 * Get the source gen session.  May be null.
+		 */
+	ISourceGenSession getSourceGenSession();
+	
+		/**
+		 * Get the data model's local cache map.  This is created
+		 * on demand and disposed when the data model is disposed.
+		 */
+	CacheMap getCache();
+	
+	
+		/**
+		 * @return true if the data model version is up to date and all
+		 * referenced components are up to date with respect to the currently
+		 * installed components.
+		 */
+	boolean isModelUpToDate();
+	
+		/**
+		 * Call this routine prior to initiating changes that might modify files
+		 * on disk. This would include UI changes or batch changes that might write files.
+		 * @return IStatus indicating if editing operations are OK. The IStatus details
+		 * depend on the underlying version control, but IStatus.isOK will return true if 
+		 * it's ok to proceed.
+		 * @param context as with {@link IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], Object)},
+		 * this is either null or a Shell. If a Shell, this signals UI interaction is allowed and the shell
+		 * is used as the context for that UI. If null, no UI interaction will happen.
+		 * @see IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], Object)
+		 */
+	IStatus validateEdit(Object context);
+	
+	/**
+	 * A listener for notifying that a data model was disposed
+	 */
+	interface IDisposeListener {
+		void dataModelDisposed(IDesignerDataModel model);
+	}
+	
+	/**
+	 * Add a dispose listener
+	 * @param listener IDisposeListener
+	 */
+	void addDisposeListener(IDisposeListener listener);
+	
+	/**
+	 * Remove a dispose listener
+	 * @param listener IDisposeListener
+	 */
+	void removeDisposeListener(IDisposeListener listener);
+	
+	/**
+	 * @param object EObject
+	 * @return the component id String
+	 */
+	String getComponentId(EObject object);
+}