Author: elvisisking
Date: 2012-04-18 09:34:31 -0400 (Wed, 18 Apr 2012)
New Revision: 40288
Added:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameProposalProvider.java
Modified:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/ChildNodeDialog.java
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/CndFormsEditorPage.java
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameDialog.java
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameEditor.java
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/cndMessages.properties
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/WorkspaceRegistry.java
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/cnd/CndValidator.java
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/cnd/CompactNodeTypeDefinition.java
Log:
JBIDE-11553 QualifiedNameEditor Should Propose Valid Qualified Names. For a node type
definition's supertypes and a child node definition's required types, the
QualifiedNameEditor now shows "look ahead" valid values based on the qualifier
and the text in the name field.
Modified:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/WorkspaceRegistry.java
===================================================================
---
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/WorkspaceRegistry.java 2012-04-18
13:32:49 UTC (rev 40287)
+++
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/WorkspaceRegistry.java 2012-04-18
13:34:31 UTC (rev 40288)
@@ -55,15 +55,15 @@
File builtInsCndFile = null;
if (Platform.isRunning()) {
- Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);
- URL url = bundle.getEntry(BUILT_INS_CND_FILE_NAME);
-
+ final Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);
+ final URL url = bundle.getEntry(BUILT_INS_CND_FILE_NAME);
+
if (url == null) {
throw new Exception(NLS.bind(Messages.jsrBuiltInsCndFileNotFound,
BUILT_INS_CND_FILE_NAME));
}
-
+
builtInsCndFile = new
File(org.eclipse.core.runtime.FileLocator.toFileURL(url).getFile());
-
+
if (!builtInsCndFile.exists()) {
throw new
Exception(NLS.bind(Messages.jsrBuiltInsCndFileNotFoundInFilesystem,
BUILT_INS_CND_FILE_NAME));
}
@@ -129,6 +129,26 @@
}
/**
+ * Obtains the node type definitions registered to the specified namespace.
+ *
+ * @param namespacePrefix the namespace prefix of the node type definitions being
requested (cannot be <code>null</code> or
+ * empty)
+ * @return the requested node type definitions (never <code>null</code>
but can be empty)
+ */
+ public List<NodeTypeDefinition> getMatchingNodeTypeDefinitions( final String
namespacePrefix ) {
+ Utils.verifyIsNotEmpty(namespacePrefix, "namespacePrefix");
//$NON-NLS-1$
+ final List<NodeTypeDefinition> matches = new
ArrayList<NodeTypeDefinition>();
+
+ for (final NodeTypeDefinition nodeType : getNodeTypeDefinitions()) {
+ if (namespacePrefix.equals(nodeType.getQualifiedName().getQualifier())) {
+ matches.add(nodeType);
+ }
+ }
+
+ return matches;
+ }
+
+ /**
* @param prefix the prefix whose namespace mapping is being requested (cannot be
<code>null</code> or empty)
* @return thre requested namespace mapping or <code>null</code> if not
found
*/
@@ -265,9 +285,9 @@
* @param namespaceMapping the namespace mapping being checked (cannot be
<code>null</code>)
* @return <code>true</code> if a built-in namespace mapping
*/
- public boolean isBuiltIn(NamespaceMapping namespaceMapping) {
+ public boolean isBuiltIn( final NamespaceMapping namespaceMapping ) {
Utils.verifyIsNotNull(namespaceMapping, "namespaceMapping");
//$NON-NLS-1$
- NamespaceMapping builtIn = getNamespaceMapping(namespaceMapping.getPrefix());
+ final NamespaceMapping builtIn =
getNamespaceMapping(namespaceMapping.getPrefix());
return ((builtIn != null) && builtIn.equals(namespaceMapping));
}
@@ -275,7 +295,7 @@
* @param prefix the prefix being checked (cannot be <code>null</code> or
empty)
* @return <code>true</code> if the prefix matches one of a built-in
namespace mapping
*/
- public boolean isBuiltInNamespacePrefix(String prefix) {
+ public boolean isBuiltInNamespacePrefix( final String prefix ) {
Utils.verifyIsNotNull(prefix, "prefix"); //$NON-NLS-1$
return (getUri(prefix) != null);
}
@@ -284,7 +304,7 @@
* @param uri the URI being checked (cannot be <code>null</code> or
empty)
* @return <code>true</code> if the URI matches one of a built-in
namespace mapping
*/
- public boolean isBuiltInNamespaceUri(String uri) {
+ public boolean isBuiltInNamespaceUri( final String uri ) {
Utils.verifyIsNotNull(uri, "uri"); //$NON-NLS-1$
return (getPrefix(uri) != null);
}
Modified:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/cnd/CndValidator.java
===================================================================
---
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/cnd/CndValidator.java 2012-04-18
13:32:49 UTC (rev 40287)
+++
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/cnd/CndValidator.java 2012-04-18
13:34:31 UTC (rev 40288)
@@ -40,6 +40,11 @@
*/
public final class CndValidator {
+ /**
+ * The valid characters allowed in a local name.
+ */
+ public static final String LOCAL_NAME_VALID_CHARS =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.";
//$NON-NLS-1$
+
private static final String PARENT_PATH_SEGMENT = ".."; //$NON-NLS-1$
private static final String SELF_PATH_SEGMENT = "."; //$NON-NLS-1$
Modified:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/cnd/CompactNodeTypeDefinition.java
===================================================================
---
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/cnd/CompactNodeTypeDefinition.java 2012-04-18
13:32:49 UTC (rev 40287)
+++
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr/src/org/jboss/tools/modeshape/jcr/cnd/CompactNodeTypeDefinition.java 2012-04-18
13:34:31 UTC (rev 40288)
@@ -15,6 +15,9 @@
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.jboss.tools.modeshape.jcr.Activator;
import org.jboss.tools.modeshape.jcr.ChildNodeDefinition;
import org.jboss.tools.modeshape.jcr.ItemDefinition;
import org.jboss.tools.modeshape.jcr.NamespaceMapping;
@@ -271,6 +274,36 @@
}
/**
+ * @param namespacePrefix the namespace prefix of the node type definitions being
requested (cannot be <code>null</code> or
+ * empty)
+ * @param includeInherited indicates if inherited node type definitions should be
included
+ * @return the requested node type definitions (never <code>null</code>
but can be empty)
+ */
+ public List<NodeTypeDefinition> getMatchingNodeTypeDefinitions( final String
namespacePrefix,
+ final boolean
includeInherited ) {
+ Utils.verifyIsNotEmpty(namespacePrefix, "namespacePrefix");
//$NON-NLS-1$
+ final List<NodeTypeDefinition> matches = new
ArrayList<NodeTypeDefinition>();
+
+ // collect local matches
+ for (final NodeTypeDefinition nodeType : getNodeTypeDefinitions()) {
+ if (namespacePrefix.equals(nodeType.getQualifiedName().getQualifier())) {
+ matches.add(nodeType);
+ }
+ }
+
+ // collect inherited matches
+ if (includeInherited) {
+ try {
+
matches.addAll(WorkspaceRegistry.get().getMatchingNodeTypeDefinitions(namespacePrefix));
+ } catch (final Exception e) {
+ Activator.get().getLog().log(new Status(IStatus.ERROR,
Activator.PLUGIN_ID, null, e));
+ }
+ }
+
+ return matches;
+ }
+
+ /**
* @return the namespace mappings (never <code>null</code>)
*/
public List<NamespaceMapping> getNamespaceMappings() {
@@ -393,7 +426,7 @@
try {
((PropertyChangeListener)listener).propertyChange(event);
} catch (final Exception e) {
- // TODO log this
+ Activator.get().getLog().log(new Status(IStatus.ERROR,
Activator.PLUGIN_ID, null, e));
this.listeners.remove(listener);
}
}
Modified:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/ChildNodeDialog.java
===================================================================
---
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/ChildNodeDialog.java 2012-04-18
13:32:49 UTC (rev 40287)
+++
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/ChildNodeDialog.java 2012-04-18
13:34:31 UTC (rev 40288)
@@ -98,6 +98,9 @@
private final ErrorMessage nameError;
private ChildNodeDefinition originalChildNode;
+
+ private QualifiedNameProposalProvider requiredTypeProposalProvider;
+
private final ErrorMessage requiredTypesError;
private TableViewer requiredTypesViewer;
@@ -645,6 +648,7 @@
Messages.requiredTypeName,
this.existingNamespacePrefixes);
dialog.setExistingQNames(this.childNodeBeingEdited.getRequiredTypes());
+ dialog.setProposalProvider(this.requiredTypeProposalProvider);
dialog.create();
dialog.getShell().pack();
@@ -693,6 +697,7 @@
this.existingNamespacePrefixes,
QualifiedName.parse(selectedRequiredType));
dialog.setExistingQNames(this.childNodeBeingEdited.getRequiredTypes());
+ dialog.setProposalProvider(this.requiredTypeProposalProvider);
dialog.create();
dialog.getShell().pack();
@@ -811,6 +816,13 @@
}
}
+ /**
+ * @param proposalProvider the required type proposal provider (can be
<code>null</code>)
+ */
+ public void setRequiredTypeProposalProvider( final QualifiedNameProposalProvider
proposalProvider ) {
+ this.requiredTypeProposalProvider = proposalProvider;
+ }
+
private void updateMessage( final ValidationStatus status,
final ErrorMessage errorMsg ) {
JcrUiUtils.setMessage(status, errorMsg);
Modified:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/CndFormsEditorPage.java
===================================================================
---
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/CndFormsEditorPage.java 2012-04-18
13:32:49 UTC (rev 40287)
+++
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/CndFormsEditorPage.java 2012-04-18
13:34:31 UTC (rev 40288)
@@ -1754,6 +1754,41 @@
return propDefnNames;
}
+ private QualifiedNameProposalProvider getProposalProvider() {
+ return new QualifiedNameProposalProvider() {
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see
org.jboss.tools.modeshape.jcr.ui.cnd.QualifiedNameProposalProvider#qnameStartsWith(java.lang.String,
+ * java.lang.String)
+ */
+ @Override
+ protected List<QualifiedName> qnameStartsWith( final String qualifier,
+ final String namePattern ) {
+ final List<NodeTypeDefinition> nodeTypes =
getCnd().getMatchingNodeTypeDefinitions(qualifier, true);
+
+ if (nodeTypes.isEmpty()) {
+ return Collections.emptyList();
+ }
+
+ final List<QualifiedName> matches = new
ArrayList<QualifiedName>();
+ final boolean acceptAll = Utils.isEmpty(namePattern);
+
+ for (final NodeTypeDefinition nodeType : nodeTypes) {
+ final QualifiedName qname = nodeType.getQualifiedName();
+
+ if (acceptAll
+ || (!Utils.isEmpty(qname.getUnqualifiedName()) &&
qname.getUnqualifiedName().startsWith(namePattern))) {
+ matches.add(qname);
+ }
+ }
+
+ return matches;
+ }
+ };
+ }
+
/**
* @return the selected child node definition or <code>null</code> if the
viewer has an empty selection
*/
@@ -1840,6 +1875,7 @@
getSelectedNodeType(),
getChildNodeNames(),
getCnd().getNamespacePrefixes());
+ dialog.setRequiredTypeProposalProvider(getProposalProvider());
dialog.create();
dialog.getShell().pack();
@@ -1962,6 +1998,7 @@
Messages.superTypeName,
getCnd().getNamespacePrefixes());
dialog.setExistingQNames(getSelectedNodeType().getSupertypes());
+ dialog.setProposalProvider(getProposalProvider());
dialog.create();
dialog.getShell().pack();
@@ -2144,6 +2181,7 @@
getChildNodeNames(),
getCnd().getNamespacePrefixes(),
childNodeBeingEdited);
+ dialog.setRequiredTypeProposalProvider(getProposalProvider());
dialog.create();
dialog.getShell().pack();
@@ -2260,6 +2298,7 @@
getCnd().getNamespacePrefixes(),
QualifiedName.parse(selectedSupertype));
dialog.setExistingQNames(getSelectedNodeType().getSupertypes());
+ dialog.setProposalProvider(getProposalProvider());
dialog.create();
dialog.getShell().pack();
Modified:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameDialog.java
===================================================================
---
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameDialog.java 2012-04-18
13:32:49 UTC (rev 40287)
+++
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameDialog.java 2012-04-18
13:34:31 UTC (rev 40288)
@@ -53,6 +53,8 @@
private final String qualifiedNameType;
+ private QualifiedNameProposalProvider proposalProvider;
+
private ScrolledForm scrolledForm;
private final String title;
@@ -172,6 +174,7 @@
handleNameChanged(e.text);
}
});
+ this.nameEditor.setProposalProvider(this.proposalProvider);
}
/**
@@ -202,6 +205,17 @@
}
}
+ /**
+ * @param proposalProvider the proposal provider (can be
<code>null</code>)
+ */
+ public void setProposalProvider( final QualifiedNameProposalProvider proposalProvider
) {
+ if (this.nameEditor == null) {
+ this.proposalProvider = proposalProvider;
+ } else {
+ this.nameEditor.setProposalProvider(proposalProvider);
+ }
+ }
+
private void updateState() {
final QualifiedName modifiedQName = this.nameEditor.getQualifiedName();
final ValidationStatus status = this.nameEditor.getStatus();
Modified:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameEditor.java
===================================================================
---
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameEditor.java 2012-04-18
13:32:49 UTC (rev 40287)
+++
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameEditor.java 2012-04-18
13:34:31 UTC (rev 40288)
@@ -12,6 +12,9 @@
import java.util.Collection;
import java.util.List;
+import org.eclipse.jface.bindings.keys.KeyStroke;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.ModifyEvent;
@@ -58,6 +61,10 @@
private String qualifier;
+ private ContentProposalAdapter proposalAdapter;
+
+ private QualifiedNameProposalProvider proposalProvider;
+
private boolean residualNameAllowed = false;
private ValidationStatus status;
@@ -154,6 +161,13 @@
}
});
+ this.proposalAdapter = new ContentProposalAdapter(this.txtName,
+ new TextContentAdapter(),
+ null,
+
KeyStroke.getInstance(SWT.CTRL, ' '),
+
CndValidator.LOCAL_NAME_VALID_CHARS.toCharArray());
+
this.proposalAdapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
+
this.txtName.setFocus();
}
}
@@ -184,6 +198,11 @@
this.qualifier = newQualifier;
}
+ // let the proposal provider know
+ if (this.proposalProvider != null) {
+ this.proposalProvider.setQualifier(this.qualifier);
+ }
+
validate();
}
@@ -194,7 +213,7 @@
/**
* @param newValue indicates if and unqualified name equal to {@link
ItemDefinition#RESIDUAL_NAME} is allowed.
*/
- public void setAllowsResidualName(boolean newValue) {
+ public void setAllowsResidualName( final boolean newValue ) {
this.residualNameAllowed = newValue;
validate();
}
@@ -249,6 +268,14 @@
}
/**
+ * @param proposalProvider the proposal provider (can be
<code>null</code>)
+ */
+ public void setProposalProvider( final QualifiedNameProposalProvider proposalProvider
) {
+ this.proposalProvider = proposalProvider;
+ this.proposalAdapter.setContentProposalProvider(proposalProvider);
+ }
+
+ /**
* @param validQualifiers the valid qualifiers (can be <code>null</code>
or empty)
*/
void setValidQualifiers( final Collection<String> validQualifiers ) {
@@ -267,7 +294,7 @@
// only reload qualifiers if different
if ((this.validQualifiers.size() != currentItems.length) ||
!this.validQualifiers.containsAll(Arrays.asList(currentItems))) {
- String[] newQualifiers = this.validQualifiers.toArray(new
String[this.validQualifiers.size()]);
+ final String[] newQualifiers = this.validQualifiers.toArray(new
String[this.validQualifiers.size()]);
Arrays.sort(newQualifiers);
this.cbxQualifiers.setItems(newQualifiers);
}
Added:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameProposalProvider.java
===================================================================
---
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameProposalProvider.java
(rev 0)
+++
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameProposalProvider.java 2012-04-18
13:34:31 UTC (rev 40288)
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ *
+ * See the LEGAL.txt file distributed with this work for information regarding copyright
ownership and licensing.
+ *
+ * See the AUTHORS.txt file distributed with this work for a full listing of individual
contributors.
+ */
+package org.jboss.tools.modeshape.jcr.ui.cnd;
+
+import java.util.List;
+
+import org.eclipse.jface.fieldassist.ContentProposal;
+import org.eclipse.jface.fieldassist.IContentProposal;
+import org.eclipse.jface.fieldassist.IContentProposalProvider;
+import org.jboss.tools.modeshape.jcr.QualifiedName;
+import org.jboss.tools.modeshape.jcr.Utils;
+
+/**
+ * Provides proposals based on the qualifier part of a qualified name.
+ */
+abstract class QualifiedNameProposalProvider implements IContentProposalProvider {
+
+ private String qualifier;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see
org.eclipse.jface.fieldassist.IContentProposalProvider#getProposals(java.lang.String,
int)
+ */
+ @Override
+ public final IContentProposal[] getProposals( final String contents,
+ final int position ) {
+ final List<QualifiedName> matches = qnameStartsWith(this.qualifier,
contents);
+
+ if (Utils.isEmpty(matches)) {
+ return new IContentProposal[0];
+ }
+
+ final IContentProposal[] proposals = new IContentProposal[matches.size()];
+ int i = 0;
+
+ for (final QualifiedName qname : matches) {
+ proposals[i++] = new ContentProposal(qname.getUnqualifiedName());
+ }
+
+ return proposals;
+ }
+
+ /**
+ * @param qualifier the qualifier to match (can be <code>null</code> or
empty)
+ * @param namePattern the text to match (can be <code>null</code> or
empty)
+ * @return a collection of <code>QualifiedName</code>s whose qualifier
matches and whose unqualified name starts with the
+ * specified name pattern (never <code>null</code> but can be
empty)
+ */
+ protected abstract List<QualifiedName> qnameStartsWith( String qualifier,
+ String namePattern );
+
+ /**
+ * @param qualifier the qualifier the proposals should be based on (can be
<code>null</code> or empty)
+ */
+ public void setQualifier( final String qualifier ) {
+ this.qualifier = qualifier;
+ }
+}
\ No newline at end of file
Property changes on:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/QualifiedNameProposalProvider.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified:
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/cndMessages.properties
===================================================================
---
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/cndMessages.properties 2012-04-18
13:32:49 UTC (rev 40287)
+++
trunk/modeshape/plugins/org.jboss.tools.modeshape.jcr.ui/src/org/jboss/tools/modeshape/jcr/ui/cnd/cndMessages.properties 2012-04-18
13:34:31 UTC (rev 40288)
@@ -244,7 +244,7 @@
supertypesToolTip = The supertypes (node types and mixins) whose property definitions and
child node definitions are inherited
typeHeaderText = Type
typeLabel = Type:
-unqualifiedNameToolTip = The name part of the qualified name (cannot be empty)
+unqualifiedNameToolTip = The name part of the qualified name (cannot be empty). If
available, Ctrl-space to see valid choices.
uriLabel = URI:
validQualifiersToolTip = The qualifiers known to this CND
valueConstraintDialogCreateMsg = Create Value Constraint