[wip] FlatQVTpivot UI
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtbase/META-INF/MANIFEST.MF b/plugins/org.eclipse.qvtd.pivot.qvtbase/META-INF/MANIFEST.MF
index d7ee6cb..935b888 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtbase/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.qvtd.pivot.qvtbase/META-INF/MANIFEST.MF
@@ -18,4 +18,4 @@
  org.eclipse.ocl.examples.pivot;bundle-version="[3.4.0,4.0.0)";visibility:=reexport
 Bundle-ActivationPolicy: lazy
 Import-Package: com.google.inject,
- org.apache.log4j
+ org.apache.log4j;version="1.2.15"
diff --git a/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/plugin.properties b/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/plugin.properties
index 403ce28..18fba93 100644
--- a/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/plugin.properties
+++ b/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/plugin.properties
@@ -19,6 +19,7 @@
 MF_OpenQuickOutline = Open the quick outline.
 MF_QuickOutline = Quick Outline
 MF_Save_AS = Abstract Syntax
+MF_Save_ModelMorf_AS = ModelMorf Abstract Syntax
 MF_Save_CS = Concrete (Xtext) Syntax
 MF_TriggerExpensiveValidation = Trigger expensive validation
 MF_Validate = Validate
diff --git a/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/plugin.xml b/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/plugin.xml
index 0d0d3d3..5d0d6d1 100644
--- a/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/plugin.xml
+++ b/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/plugin.xml
@@ -237,6 +237,15 @@
         </markerResolutionGenerator>
     </extension>
 
+	<extension point="org.eclipse.ui.commands">
+	  <command id="org.eclipse.qvtd.xtext.qvtrelation.ui.SaveModelMorfASCommand"
+	    name="%MF_Save_ModelMorf_AS_Command" description="%MF_Save_ModelMorf_AS_Description"/>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+	  <handler commandId="org.eclipse.qvtd.xtext.qvtrelation.ui.SaveModelMorfASCommand"
+	    class="org.eclipse.qvtd.xtext.qvtrelation.ui.commands.SaveModelMorfASHandler"/>
+	</extension>
+
 	<extension point="org.eclipse.ui.menus">
 	  <menuContribution locationURI="popup:org.eclipse.ocl.examples.xtext.base.ui.Save?after=additions">
 	    <command commandId="org.eclipse.ocl.examples.xtext.base.ui.SaveASCommand"
@@ -249,6 +258,16 @@
 	    </command>
 	  </menuContribution>
 	  <menuContribution locationURI="popup:org.eclipse.ocl.examples.xtext.base.ui.Save?after=additions">
+	    <command commandId="org.eclipse.qvtd.xtext.qvtrelation.ui.SaveModelMorfASCommand"
+	      label="%MF_Save_ModelMorf_AS">
+            <visibleWhen checkEnabled="false">
+                <reference
+                    definitionId="org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.Editor.opened">
+                </reference>
+            </visibleWhen>
+	    </command>
+	  </menuContribution>
+	  <menuContribution locationURI="popup:org.eclipse.ocl.examples.xtext.base.ui.Save?after=additions">
 	    <command commandId="org.eclipse.ocl.examples.xtext.base.ui.SaveCSCommand"
 	      label="%MF_Save_CS">
             <visibleWhen checkEnabled="false">
diff --git a/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/src/org/eclipse/qvtd/xtext/qvtrelation/ui/commands/SaveModelMorfASHandler.java b/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/src/org/eclipse/qvtd/xtext/qvtrelation/ui/commands/SaveModelMorfASHandler.java
new file mode 100644
index 0000000..4b769c4
--- /dev/null
+++ b/plugins/org.eclipse.qvtd.xtext.qvtrelation.ui/src/org/eclipse/qvtd/xtext/qvtrelation/ui/commands/SaveModelMorfASHandler.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2011 E.D.Willink 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.qvtd.xtext.qvtrelation.ui.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.ocl.examples.xtext.base.ui.messages.BaseUIMessages;
+import org.eclipse.ocl.examples.xtext.base.utilities.BaseCSResource;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.ui.editor.XtextEditor;
+import org.eclipse.xtext.ui.editor.model.IXtextDocument;
+import org.eclipse.xtext.util.concurrent.IUnitOfWork;
+
+public class SaveModelMorfASHandler extends AbstractHandler
+{
+	public SaveModelMorfASHandler() {}
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
+		if (window == null) {
+			return null;
+		}
+		IEditorPart editor = HandlerUtil.getActiveEditor(event);
+		if (!(editor instanceof XtextEditor)) {
+			return null;
+		}
+		IEditorInput editorInput = editor.getEditorInput();
+		if (!(editorInput instanceof IFileEditorInput)) {
+			return null;
+		}
+		IXtextDocument document = ((XtextEditor)editor).getDocument();
+		URI asURI = null;
+		try {
+			asURI = document.readOnly(new IUnitOfWork<URI, XtextResource>()
+			{
+				public URI exec(@Nullable XtextResource resource) throws Exception {
+					if (resource instanceof BaseCSResource) {
+						Resource asResource = ((BaseCSResource)resource).getASResource(null);
+						return asResource.getURI();
+					}
+					else {
+						return null;
+					}
+				}
+			});
+		} catch (Exception e) {}
+		if (asURI == null) {
+			return null;
+		}
+		IFile srcFile = ((IFileEditorInput)editorInput).getFile();
+		IProject srcProject = srcFile.getProject();
+        URI projectURI = URI.createPlatformResourceURI(srcProject.getFullPath().toString() + "/", true);
+        URI outURI = asURI.deresolve(projectURI);
+        IPath outPath = new Path(outURI.toString());
+		IFile outFile = srcProject.getFile(outPath);
+		Shell shell = editor.getEditorSite().getShell();
+		SaveAsDialog dlg = new SaveAsDialog(shell);
+		dlg.setOriginalFile(outFile);
+		dlg.create();
+		dlg.getShell().setText(BaseUIMessages.SaveAS_ShellTitle);
+		dlg.setTitle(BaseUIMessages.SaveAS_Title);
+		dlg.setMessage(NLS.bind(BaseUIMessages.SaveAS_Description, asURI));
+		int status = dlg.open();
+		if (status != SaveAsDialog.OK) {
+			return null;
+		}
+		final IPath file = dlg.getResult();
+		if (file == null) {
+			return null;
+		}
+        final URI newURI = URI.createPlatformResourceURI(file.toString(), true);
+		try {
+			document.modify(new IUnitOfWork<Object, XtextResource>()
+			{
+				public Object exec(@Nullable XtextResource resource) throws Exception {
+					if (resource instanceof BaseCSResource) {
+						Resource asResource = ((BaseCSResource)resource).getASResource(null);
+						URI oldURI = asResource.getURI();
+						try {
+							asResource.setURI(newURI);
+							asResource.save(null);
+						} finally {
+							asResource.setURI(oldURI);
+						}
+					}
+					return null;
+				}
+			});
+		} catch (Throwable e) {
+			MessageDialog.openError( shell, BaseUIMessages.SaveError_Title,
+				e.getLocalizedMessage());
+		}
+		return null;
+	}
+	
+//	public Resource createFlatObjects(@NonNull Collection asResource, @NonNull URI flatURI) {
+//		for (TreeIterator<EObject> tit = asResource.getAllContents(); tit.hasNext(); ) {
+//			EObject = tit.next();
+//		}
+//	}
+}