diff dwtx/jface/text/templates/TemplateVariableResolver.d @ 129:eb30df5ca28b

Added JFace Text sources
author Frank Benoit <benoit@tionex.de>
date Sat, 23 Aug 2008 19:10:48 +0200
parents
children c4fb132a086c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtx/jface/text/templates/TemplateVariableResolver.d	Sat Aug 23 19:10:48 2008 +0200
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwtx.jface.text.templates.TemplateVariableResolver;
+
+import dwt.dwthelper.utils;
+
+import dwtx.core.runtime.Assert;
+
+/**
+ * A <code>TemplateVariableResolver</code> resolves <code>TemplateVariables</code>
+ * of a certain type inside a <code>TemplateContext</code>.
+ * <p>
+ * Clients may instantiate and extend this class.
+ * </p>
+ *
+ * @see TemplateVariable
+ * @since 3.0
+ */
+public class TemplateVariableResolver {
+
+    /** Type of this resolver. */
+    private String fType= null;
+
+    /** Description of the type resolved by this resolver. */
+    private String fDescription= null;
+
+    /**
+     * Creates an instance of <code>TemplateVariableResolver</code>.
+     *
+     * @param type the name of the type
+     * @param description the description for the type
+     */
+    protected TemplateVariableResolver(String type, String description) {
+        setType(type);
+        setDescription(description);
+    }
+
+    /**
+     * Creates an empty instance.
+     * <p>
+     * This is a framework-only constructor that exists only so that resolvers
+     * can be contributed via an extension point and that should not be called
+     * in client code except for subclass constructors; use
+     * {@link #TemplateVariableResolver(String, String)} instead.
+     * </p>
+     */
+    public TemplateVariableResolver() {
+    }
+
+    /**
+     * Returns the type of this resolver.
+     *
+     * @return the type
+     */
+    public String getType() {
+        return fType;
+    }
+
+    /**
+     * Returns the description for the resolver.
+     *
+     * @return the description for the resolver
+     */
+    public String getDescription() {
+        return fDescription;
+    }
+
+    /**
+     * Returns an instance of the type resolved by the receiver available in <code>context</code>.
+     * To resolve means to provide a binding to a concrete text object (a
+     * <code>String</code>) in the given context.
+     * <p>
+     * The default implementation looks up the type in the context.</p>
+     *
+     * @param context the context in which to resolve the type
+     * @return the name of the text object of this type, or <code>null</code> if it cannot be determined
+     */
+    protected String resolve(TemplateContext context) {
+        return context.getVariable(getType());
+    }
+
+    /**
+     * Returns all possible bindings available in <code>context</code>. The default
+     * implementation simply returns an array which contains the result of
+     * {@link #resolve(TemplateContext)}, or an empty array if that call returns
+     * <code>null</code>.
+     *
+     * @param context the context in which to resolve the type
+     * @return an array of possible bindings of this type in <code>context</code>
+     */
+    protected String[] resolveAll(TemplateContext context) {
+        String binding= resolve(context);
+        if (binding is null)
+            return new String[0];
+        return new String[] { binding };
+    }
+
+    /**
+     * Resolves <code>variable</code> in <code>context</code>. To resolve
+     * means to find a valid binding of the receiver's type in the given <code>TemplateContext</code>.
+     * If the variable can be successfully resolved, its value is set using
+     * {@link TemplateVariable#setValues(String[])}.
+     *
+     * @param context the context in which variable is resolved
+     * @param variable the variable to resolve
+     */
+    public void resolve(TemplateVariable variable, TemplateContext context) {
+        String[] bindings= resolveAll(context);
+        if (bindings.length !is 0)
+            variable.setValues(bindings);
+        if (bindings.length > 1)
+            variable.setUnambiguous(false);
+        else
+            variable.setUnambiguous(isUnambiguous(context));
+        variable.setResolved(true);
+    }
+
+    /**
+     * Returns whether this resolver is able to resolve unambiguously. When
+     * resolving a <code>TemplateVariable</code>, its <code>isUmambiguous</code>
+     * state is set to the one of this resolver. By default, this method
+     * returns <code>false</code>. Clients can overwrite this method to give
+     * a hint about whether there should be e.g. prompting for input values for
+     * ambiguous variables.
+     *
+     * @param context the context in which the resolved check should be
+     *        evaluated
+     * @return <code>true</code> if the receiver is unambiguously resolvable
+     *         in <code>context</code>, <code>false</code> otherwise
+     */
+    protected bool isUnambiguous(TemplateContext context) {
+        return false;
+    }
+
+    /**
+     * Sets the description.
+     * <p>
+     * This is a framework-only method that exists only so that resolvers
+     * can be contributed via an extension point and that should not be called
+     * in client code; use {@link #TemplateVariableResolver(String, String)} instead.
+     * </p>
+     *
+     * @param description the description of this resolver
+     */
+    public final void setDescription(String description) {
+        Assert.isNotNull(description);
+        Assert.isTrue(fDescription is null); // may only be called once when initialized
+        fDescription= description;
+    }
+
+    /**
+     * Sets the type name.
+     * <p>
+     * This is a framework-only method that exists only so that resolvers
+     * can be contributed via an extension point and that should not be called
+     * in client code; use {@link #TemplateVariableResolver(String, String)} instead.
+     * </p>
+     *
+     * @param type the type name of this resolver
+     */
+    public final void setType(String type) {
+        Assert.isNotNull(type);
+        Assert.isTrue(fType is null); // may only be called once when initialized
+        fType= type;
+    }
+}