uidesigner/com.nokia.sdt.sourcegen/src/com/nokia/sdt/sourcegen/core/VariableProvider.java
changeset 0 fb279309251b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uidesigner/com.nokia.sdt.sourcegen/src/com/nokia/sdt/sourcegen/core/VariableProvider.java	Fri Apr 03 23:33:03 2009 +0100
@@ -0,0 +1,171 @@
+/*
+* Copyright (c) 2005 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.sourcegen.core;
+
+import com.nokia.sdt.component.event.EventUtils;
+import com.nokia.sdt.datamodel.IDesignerDataModel;
+import com.nokia.sdt.datamodel.adapter.IComponentInstance;
+import com.nokia.sdt.datamodel.adapter.IEventBinding;
+import com.nokia.sdt.datamodel.util.ModelUtils;
+import com.nokia.sdt.sourcegen.ISourceGenSession;
+import com.nokia.sdt.sourcegen.IVariableProvider;
+import com.nokia.sdt.symbian.ISymbianSourceGenSession;
+import com.nokia.sdt.symbian.dm.DesignerDataModel;
+import com.nokia.cpp.internal.api.utils.core.Check;
+import com.nokia.cpp.internal.api.utils.core.TextUtils;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.ui.views.properties.IPropertySource;
+
+import java.util.Map;
+
+/**
+ * Provide variables for script and sourcegen. 
+ * 
+ *
+ */
+public class VariableProvider implements IVariableProvider {
+	private ISourceGenSession sourceGenSession;
+	
+	public VariableProvider(ISourceGenSession session, String projectName) {
+		Check.checkArg(session);
+		Check.checkArg(projectName);
+		this.sourceGenSession = session;
+	}
+
+    /* (non-Javadoc)
+     * @see com.nokia.sdt.sourcegen.INameGenerator#defineInstanceVariables(java.util.Map, org.eclipse.emf.ecore.EObject)
+     */
+    public void defineInstanceVariables(Map variables, EObject instanceObj) {
+        IComponentInstance instance = (IComponentInstance) EcoreUtil.getRegisteredAdapter(instanceObj, IComponentInstance.class);
+        Check.checkArg(instance);
+        IDesignerDataModel dataModel = instance.getDesignerDataModel();
+        
+        variables.put("projectName", sourceGenSession.getSourceGenProvider().getProjectName()); //$NON-NLS-1$
+        
+        variables.put("instanceName", instance.getName()); //$NON-NLS-1$
+        variables.put("instanceMemberName", "i" + TextUtils.titleCase(instance.getName())); //$NON-NLS-1$ //$NON-NLS-2$
+        variables.put("instanceName$title", TextUtils.titleCase(instance.getName())); //$NON-NLS-1$
+        variables.put("instanceName$upper", instance.getName().toUpperCase()); //$NON-NLS-1$
+        variables.put("instanceName$lower", instance.getName().toLowerCase()); //$NON-NLS-1$
+       
+        if (sourceGenSession instanceof ISymbianSourceGenSession) {
+            // define the name of the resource, if any, created for this instance
+            ISymbianSourceGenSession symSession = (ISymbianSourceGenSession) sourceGenSession;
+            String name = symSession.getGeneratedResource(instance);
+            variables.put("resourceName", name); //$NON-NLS-1$
+            variables.put("resourceName$upper", name != null ? name.toUpperCase() : null); //$NON-NLS-1$
+            
+            // define the filename for this file's resources
+            name = symSession.getResourceFileNameBase();
+            variables.put("resourceFileNameBase", name); //$NON-NLS-1$
+        }
+
+        // Define the name of the class, if there is one.
+        String className = getClassName(instance);
+        if (className != null)
+        	variables.put("className", className); //$NON-NLS-1$
+
+        // Define the parent's class name, if there is one. 
+        // This is in case the instance has a class, and it wants to define a location
+        // in its parent's class. Otherwise, it would always find its own class.
+        EObject parent = instance.getParent();
+        if (parent != null) {
+        	IComponentInstance parentInstance = ModelUtils.getComponentInstance(parent);
+        	if (parentInstance != null) {
+        		String parentClassName = getClassName(parentInstance);
+        		if (parentClassName != null)
+        			variables.put("parentClassName", parentClassName); //$NON-NLS-1$
+        	}
+        }
+        
+        
+        
+        // Define the name of the event handler class, if any.
+        String handlerClassName = EventUtils.getHandlerClassName(instance);
+        if (handlerClassName != null)
+        	variables.put("handlerClassName", handlerClassName); //$NON-NLS-1$
+        IComponentInstance handlerInstance = EventUtils.getHandlerInstance(instance);
+        if (handlerInstance != null) {
+        	// TODO: I wanted to expose "handlerInstance" as a WrappedInstance, but
+        	// that's not currently accessible from this plugin
+        	variables.put("handlerInstanceName", handlerInstance.getName()); //$NON-NLS-1$
+        }
+        
+        // directory variables for locations
+        variables.put("src", getPropertyOrDot(dataModel, DesignerDataModel.SOURCE_DIRECTORY_ID)); //$NON-NLS-1$
+        variables.put("inc", getPropertyOrDot(dataModel, DesignerDataModel.INCLUDE_DIRECTORY_ID)); //$NON-NLS-1$
+        variables.put("build", getPropertyOrDot(dataModel, DesignerDataModel.BUILD_DIRECTORY_ID)); //$NON-NLS-1$
+        variables.put("resource", getPropertyOrDot(dataModel, DesignerDataModel.RESOURCE_DIRECTORY_ID)); //$NON-NLS-1$
+
+    }
+    
+    
+    private String getClassName(IComponentInstance instance) {
+        // get the name of the class, if there is one.
+        // This is either the instance's own "className" property or that of an enclosing parent.
+        IComponentInstance ci = instance;
+        while (ci != null) {
+            IPropertySource propSource = ModelUtils.getPropertySource(ci.getEObject());
+            if (propSource != null) {
+                Object val = propSource.getPropertyValue("className"); //$NON-NLS-1$
+                if (val != null) {
+                    if (val.equals("")) //$NON-NLS-1$
+                        return "CUnnamedClass"; //$NON-NLS-1$
+                    else
+                        return val.toString();
+                }
+            }
+            EObject parentObj = ci.getParent();
+            if (parentObj != null)
+                ci = ModelUtils.getComponentInstance(parentObj);
+            else
+                ci = null;
+        }
+    	
+        return null;
+    }
+
+	/* (non-Javadoc)
+	 * @see com.nokia.sdt.sourcegen.INameGenerator#defineEventVariables(java.util.Map, com.nokia.sdt.datamodel.adapter.IEventBinding)
+	 * 
+	 */
+	public void defineEventVariables(Map variables, IEventBinding binding) {
+		// @see WrappedEventBinding for naming convention
+		if (binding != null) {
+			variables.put("event.eventId", binding.getEventDescriptor().getId()); //$NON-NLS-1$
+			variables.put("event.eventName", binding.getEventDescriptor().getDisplayText()); //$NON-NLS-1$
+			variables.put("event.handlerName", binding.getHandlerName()); //$NON-NLS-1$
+			variables.put("event.handlerSymbol", binding.getHandlerSymbolInformation()); //$NON-NLS-1$
+		} else {
+			variables.remove("event.eventId"); //$NON-NLS-1$
+			variables.remove("event.eventName"); //$NON-NLS-1$
+			variables.remove("event.handlerName"); //$NON-NLS-1$
+			variables.remove("event.handlerSymbol"); //$NON-NLS-1$
+		}
+	}
+
+	protected String getPropertyOrDot(IDesignerDataModel dataModel, String propertyId) {
+	    String value = dataModel.getProperty(propertyId);
+	    if (value != null)
+	        return value;
+	    else
+	        return "."; //$NON-NLS-1$
+	}
+}