WIP Prettier Xtext labels
diff --git a/plugins/org.eclipse.ocl.xtext.base/plugin.xml b/plugins/org.eclipse.ocl.xtext.base/plugin.xml
index 70a5f0b..6c3ebf6 100644
--- a/plugins/org.eclipse.ocl.xtext.base/plugin.xml
+++ b/plugins/org.eclipse.ocl.xtext.base/plugin.xml
@@ -19,6 +19,14 @@
    <extension point="org.eclipse.ocl.pivot.label_generator">
       <generator for="org.eclipse.ocl.xtext.basecs.NamedElementCS"
       	class="org.eclipse.ocl.xtext.base.utilities.NamedElementCSLabelGenerator"/>
+      <generator for="org.eclipse.xtext.AbstractElement"
+      	class="org.eclipse.ocl.xtext.base.utilities.XtextAbstractElementLabelGenerator"/>
+      <generator for="org.eclipse.xtext.AbstractMetamodelDeclaration"
+      	class="org.eclipse.ocl.xtext.base.utilities.XtextAbstractMetamodelDeclarationLabelGenerator"/>
+      <generator for="org.eclipse.xtext.AbstractRule"
+      	class="org.eclipse.ocl.xtext.base.utilities.XtextAbstractRuleLabelGenerator"/>
+      <generator for="org.eclipse.xtext.Grammar"
+      	class="org.eclipse.ocl.xtext.base.utilities.XtextGrammarLabelGenerator"/>
    </extension>
 
 </plugin>
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/BaseStandaloneSetup.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/BaseStandaloneSetup.java
index be3a36b..8a66697 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/BaseStandaloneSetup.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/BaseStandaloneSetup.java
@@ -19,6 +19,10 @@
 import org.eclipse.ocl.pivot.utilities.PivotStandaloneSetup;
 import org.eclipse.ocl.xtext.base.scoping.BaseScoping;
 import org.eclipse.ocl.xtext.base.utilities.NamedElementCSLabelGenerator;
+import org.eclipse.ocl.xtext.base.utilities.XtextAbstractElementLabelGenerator;
+import org.eclipse.ocl.xtext.base.utilities.XtextAbstractMetamodelDeclarationLabelGenerator;
+import org.eclipse.ocl.xtext.base.utilities.XtextAbstractRuleLabelGenerator;
+import org.eclipse.ocl.xtext.base.utilities.XtextGrammarLabelGenerator;
 import org.eclipse.ocl.xtext.basecs.BaseCSPackage;
 import org.eclipse.ocl.xtext.basecs.util.BaseCSValidator;
 
@@ -48,6 +52,10 @@
 		EPackage.Registry.INSTANCE.put(BaseCSPackage.eNS_URI, BaseCSPackage.eINSTANCE);
 		EValidator.Registry.INSTANCE.put(BaseCSPackage.eINSTANCE, BaseCSValidator.INSTANCE);
 		NamedElementCSLabelGenerator.initialize(ILabelGenerator.Registry.INSTANCE);
+		XtextAbstractElementLabelGenerator.initialize(ILabelGenerator.Registry.INSTANCE);
+		XtextAbstractMetamodelDeclarationLabelGenerator.initialize(ILabelGenerator.Registry.INSTANCE);
+		XtextAbstractRuleLabelGenerator.initialize(ILabelGenerator.Registry.INSTANCE);
+		XtextGrammarLabelGenerator.initialize(ILabelGenerator.Registry.INSTANCE);
 	}
 	
 	/**
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextAbstractElementLabelGenerator.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextAbstractElementLabelGenerator.java
new file mode 100644
index 0000000..c813e10
--- /dev/null
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextAbstractElementLabelGenerator.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Willink Transformations 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:
+ *   E.D.Willink - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ocl.xtext.base.utilities;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.ocl.pivot.labels.AbstractLabelGenerator;
+import org.eclipse.xtext.AbstractElement;
+import org.eclipse.xtext.AbstractRule;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Alternatives;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.Group;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.TypeRef;
+import org.eclipse.xtext.util.XtextSwitch;
+
+public final class XtextAbstractElementLabelGenerator extends AbstractLabelGenerator<AbstractElement>
+{
+	private class Xtext2String extends XtextSwitch<Object>
+	{
+		protected final @NonNull Builder labelBuilder;
+		
+		public Xtext2String(@NonNull Builder labelBuilder) {
+			this.labelBuilder = labelBuilder;
+		}
+		
+		@Override
+		public Object caseAbstractRule(AbstractRule object) {
+			String name = object.getName();
+			if (name != null) {
+				labelBuilder.appendString(name);
+				return this;
+			}
+			return null;
+		}
+
+		@Override
+		public Object caseAction(Action object) {
+			String feature = object.getFeature();
+			String operator = object.getOperator();
+			TypeRef type = object.getType();
+			labelBuilder.appendString("{");
+			if (type != null) {
+				labelBuilder.appendString(type.getClassifier().getName());
+			}
+			if (feature != null) {
+				labelBuilder.appendString(".");
+				labelBuilder.appendString(feature);
+			}
+			if (operator != null) {
+				labelBuilder.appendString(operator);
+				labelBuilder.appendString("current");
+			}
+			labelBuilder.appendString("}");
+			labelBuilder.appendString(object.getCardinality());
+			return this;
+		}
+
+		@Override
+		public Object caseAlternatives(Alternatives object) {
+			labelBuilder.appendString("(");
+			boolean isFirst = true;
+			for (AbstractElement element : object.getElements()) {
+				if (!isFirst) {
+					labelBuilder.appendString(" | ");
+				}
+				doSwitch(element);
+				isFirst = false;
+			}
+			labelBuilder.appendString(")");
+			labelBuilder.appendString(object.getCardinality());
+			return this;
+		}
+
+		@Override
+		public Object caseAssignment(Assignment object) {
+			String feature = object.getFeature();
+			if (feature != null) {
+				labelBuilder.appendString(feature);
+			}
+			String operator = object.getOperator();
+			if (operator != null) {
+				labelBuilder.appendString(operator);
+			}
+			AbstractElement terminal = object.getTerminal();
+			if (terminal != null) {
+				doSwitch(terminal);
+				labelBuilder.appendString(object.getCardinality());
+				return this;
+			}
+			return null;
+		}
+
+		@Override
+		public Object caseGroup(Group object) {
+			labelBuilder.appendString("(");
+			boolean isFirst = true;
+			for (AbstractElement element : object.getElements()) {
+				if (!isFirst) {
+					labelBuilder.appendString(" ");
+				}
+				doSwitch(element);
+				isFirst = false;
+			}
+			labelBuilder.appendString(")");
+			labelBuilder.appendString(object.getCardinality());
+			return this;
+		}
+
+		@Override
+		public Object caseKeyword(Keyword object) {
+			String value = object.getValue();
+			if (value != null) {
+				labelBuilder.appendString("'");
+				labelBuilder.appendString(value);
+				labelBuilder.appendString("'");
+				labelBuilder.appendString(object.getCardinality());
+				return this;
+			}
+			return null;
+		}
+
+		@Override
+		public Object caseRuleCall(RuleCall object) {
+			AbstractRule rule = object.getRule();
+			if (rule != null) {
+				doSwitch(rule);
+				labelBuilder.appendString(object.getCardinality());
+				return this;
+			}
+			return null;
+		}
+
+		@Override
+		public Object defaultCase(EObject object) {
+			labelBuilder.appendString(object.getClass().getSimpleName());
+			return this;
+		}
+
+	}
+	
+	public static void initialize(Registry registry) {
+		registry.install(AbstractElement.class, new XtextAbstractElementLabelGenerator());		
+	}
+	
+	public XtextAbstractElementLabelGenerator() {
+		super(AbstractElement.class);
+	}
+
+	@Override
+	public void buildLabelFor(@NonNull Builder labelBuilder, @NonNull AbstractElement object) {
+		new Xtext2String(labelBuilder).doSwitch(object);
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextAbstractMetamodelDeclarationLabelGenerator.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextAbstractMetamodelDeclarationLabelGenerator.java
new file mode 100644
index 0000000..359e07c
--- /dev/null
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextAbstractMetamodelDeclarationLabelGenerator.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Willink Transformations 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:
+ *   E.D.Willink - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ocl.xtext.base.utilities;
+
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.ocl.pivot.labels.AbstractLabelGenerator;
+import org.eclipse.xtext.AbstractMetamodelDeclaration;
+
+public final class XtextAbstractMetamodelDeclarationLabelGenerator extends AbstractLabelGenerator<AbstractMetamodelDeclaration>
+{
+	public static void initialize(Registry registry) {
+		registry.install(AbstractMetamodelDeclaration.class, new XtextAbstractMetamodelDeclarationLabelGenerator());		
+	}
+	
+	public XtextAbstractMetamodelDeclarationLabelGenerator() {
+		super(AbstractMetamodelDeclaration.class);
+	}
+
+	@Override
+	public void buildLabelFor(@NonNull Builder labelBuilder, @NonNull AbstractMetamodelDeclaration object) {
+		EPackage ePackage = object.getEPackage();
+		String nsURI = ePackage != null ? ePackage.getNsURI() : null;
+		if (nsURI != null)
+			labelBuilder.appendString(nsURI);
+		else {
+			labelBuilder.appendString("<null-nsURI-");
+			labelBuilder.appendString(object.getClass().getSimpleName());
+			labelBuilder.appendString(">");
+		}
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextAbstractRuleLabelGenerator.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextAbstractRuleLabelGenerator.java
new file mode 100644
index 0000000..7cdb1aa
--- /dev/null
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextAbstractRuleLabelGenerator.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Willink Transformations 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:
+ *   E.D.Willink - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ocl.xtext.base.utilities;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.ocl.pivot.labels.AbstractLabelGenerator;
+import org.eclipse.xtext.AbstractRule;
+
+public final class XtextAbstractRuleLabelGenerator extends AbstractLabelGenerator<AbstractRule>
+{
+	public static void initialize(Registry registry) {
+		registry.install(AbstractRule.class, new XtextAbstractRuleLabelGenerator());		
+	}
+	
+	public XtextAbstractRuleLabelGenerator() {
+		super(AbstractRule.class);
+	}
+
+	@Override
+	public void buildLabelFor(@NonNull Builder labelBuilder, @NonNull AbstractRule object) {
+		String name = object.getName();
+		if (name != null)
+			labelBuilder.appendString(name);
+		else {
+			labelBuilder.appendString("<null-named-");
+			labelBuilder.appendString(object.getClass().getSimpleName());
+			labelBuilder.appendString(">");
+		}
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextActionLabelGenerator.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextActionLabelGenerator.java
new file mode 100644
index 0000000..5090e21
--- /dev/null
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextActionLabelGenerator.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Willink Transformations 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:
+ *   E.D.Willink - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ocl.xtext.base.utilities;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.ocl.pivot.labels.AbstractLabelGenerator;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.TypeRef;
+
+public final class XtextActionLabelGenerator extends AbstractLabelGenerator<Action>
+{
+	public static void initialize(Registry registry) {
+		registry.install(Action.class, new XtextActionLabelGenerator());		
+	}
+	
+	public XtextActionLabelGenerator() {
+		super(Action.class);
+	}
+
+	@Override
+	public void buildLabelFor(@NonNull Builder labelBuilder, @NonNull Action object) {
+		String feature = object.getFeature();
+		String operator = object.getOperator();
+		TypeRef type = object.getType();
+		if (type != null) {
+			labelBuilder.appendString(type.getClassifier().getName());
+		}
+		if (feature != null) {
+			labelBuilder.appendString(".");
+			labelBuilder.appendString(feature);
+		}
+		if (feature != null) {
+			labelBuilder.appendString(operator);
+			labelBuilder.appendString("current");
+		}
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextGrammarLabelGenerator.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextGrammarLabelGenerator.java
new file mode 100644
index 0000000..349840d
--- /dev/null
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/utilities/XtextGrammarLabelGenerator.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Willink Transformations 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:
+ *   E.D.Willink - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ocl.xtext.base.utilities;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.ocl.pivot.labels.AbstractLabelGenerator;
+import org.eclipse.xtext.Grammar;
+
+public final class XtextGrammarLabelGenerator extends AbstractLabelGenerator<Grammar>
+{
+	public static void initialize(Registry registry) {
+		registry.install(Grammar.class, new XtextGrammarLabelGenerator());		
+	}
+	
+	public XtextGrammarLabelGenerator() {
+		super(Grammar.class);
+	}
+
+	@Override
+	public void buildLabelFor(@NonNull Builder labelBuilder, @NonNull Grammar object) {
+		String name = object.getName();
+		if (name != null)
+			labelBuilder.appendString(name);
+		else {
+			labelBuilder.appendString("<null-named-");
+			labelBuilder.appendString(object.getClass().getSimpleName());
+			labelBuilder.appendString(">");
+		}
+	}
+}
\ No newline at end of file