/**
 * Copyright (c) 2009, 2011, 2012 Borland Software Corporation & 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:
 *    Artem Tikhomirov (Borland) - initial API and implementation
 *    Guillaume Hillairet (Montages A.G.)
 */
import Utils;
import Mappings;
import DiagramRunTimeModel;
import PropertySheet;
import PreferencePages;
import Navigator;
import Actions;
import RichClientPlatformApp;
import Audits;
import Parsers;

modeltype GMFMAP uses mappings('http://www.eclipse.org/gmf/2006/mappings');
modeltype GMFGEN uses gmfgen('http://www.eclipse.org/gmf/2009/GenModel');
modeltype GENMODEL uses genmodel('http://www.eclipse.org/emf/2002/GenModel');

transformation Map2Gen(
	in mapModel: GMFMAP, 
	in domainGenModel: GENMODEL, 
	in diagramRuntimeGenModel: GENMODEL, 
	out gmfgenModel: GMFGEN);

configuration property rcp: Boolean;
configuration property useMapMode: Boolean;
configuration property useFullRunTime: Boolean;
configuration property useInTransformationCodeGen: Boolean;

main() {
	var mapRoot := mapModel.rootObjects()![GMFMAP::Mapping]; 
	genModel := domainGenModel.rootObjects()![GENMODEL::GenModel];
	
	Viewmaps::setMapMode(useMapMode);
	useModeledViewmaps := not useInTransformationCodeGen;
	
	var genEditor := mapRoot.map structure();
	genEditor.diagram.palette := mapRoot.diagram.map palette();
	genEditor.domainGenModel := mapRoot.diagram.domainModel.findGenPackage().genModel;
	genEditor.plugin := mapRoot.map editorPlugin();
	genEditor.editor := object GenEditorView {};
			
	genEditor.diagramUpdater := object GenDiagramUpdater {};
	genEditor.audits := mapRoot.audits.map audits(); -- these two should go before expression providers collection
	genEditor.metrics := mapRoot.metrics.map metrics();
	
	if not GMFGEN::GenParserImplementation.allInstances()->isEmpty() then {
		genEditor.labelParsers := mapRoot.map createGenParsers()
	} endif;
	
	new DiagramRunTimeModel(diagramRuntimeGenModel, gmfgenModel).transform();
	
	if not rcp then new Navigator(mapModel, gmfgenModel).transform() endif;
	
	new PropertySheet(mapModel, gmfgenModel).transform();
	new PreferencePages(mapModel, gmfgenModel).transform();
	new Actions(mapModel, gmfgenModel).transform();
	
	if rcp then new RichClientPlatformApp(mapModel, gmfgenModel).transform() endif;
	
	-- collect orphan palette items and add them to the Default group.
	var toolGroup :=  GMFGEN::ToolGroup.allInstances()->any(title = 'Default');
	GMFGEN::ToolGroupItem.allInstances()->select(e | e.container().oclIsUndefined())->forEach(element) {
		toolGroup.entries += element;
	}
}

-- 
-- Editor Plugin
-- 

mapping GMFMAP::Mapping::editorPlugin() : GMFGEN::GenPlugin {
	requiredPlugins := Set{'org.eclipse.gmf.tooling.runtime', 'org.eclipse.draw2d'};
	
	if self.links->notEmpty() or GMFMAP::LabelMapping.allInstances()->notEmpty() then
		
		requiredPlugins += 'org.eclipse.gmf.runtime.draw2d.ui'
	endif;
	
	self.diagram.diagramCanvas.figures->forEach(fg) {
		if not fg.implementationBundle.oclIsUndefined() then {
			result.requiredPlugins += fg.implementationBundle
		} endif;
	}
}
