/**
 * Copyright (c) 2009 Borland Software Corporation
 * 
 * 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
 */
modeltype GMFMAP uses mappings('http://www.eclipse.org/gmf/2006/mappings');
modeltype GMFGEN uses gmfgen('http://www.eclipse.org/gmf/2009/GenModel');

transformation PreferencePages(in mapModel : GMFMAP, inout gmfgenModel : GMFGEN);

main() {
	var canvasMapping := mapModel.rootObjects()![GMFMAP::Mapping].diagram;
	var gd := gmfgenModel.rootObjects()![GMFGEN::GenEditorGenerator].diagram;
	gd.preferencePages += canvasMapping.map preferencePages(gd);
	--gd.preferences := canvasMapping.map preferences(gd);
}

mapping GMFMAP::CanvasMapping::preferencePages(in genDiagram : GMFGEN::GenDiagram) : List(GMFGEN::GenPreferencePage) {
	var general := StandardPreferencePages::General.createPage('general', genDiagram.editorGen.modelID + ' Diagram', genDiagram.editorGen);
	general.children += StandardPreferencePages::Appearance.createPage('appearance', 'Appearance', genDiagram.editorGen);
	general.children += StandardPreferencePages::Connections.createPage('connections', 'Connections', genDiagram.editorGen);
	general.children += StandardPreferencePages::Printing.createPage('printing', 'Printing', genDiagram.editorGen);
	general.children += StandardPreferencePages::RulersAndGrid.createPage('rulersAndGrid', 'Rulers And Grid', genDiagram.editorGen);
	result->add(general);
}

helper GMFGEN::StandardPreferencePages::createPage(in id : String, in n: String, in editorGen : GMFGEN::GenEditorGenerator) : GMFGEN::GenPreferencePage {
	return object GMFGEN::GenStandardPreferencePage {
		name := n;
		iD := editorGen.plugin.iD + '.' + id;
		kind := self;
	};
} 

mapping GMFMAP::CanvasMapping::preferences(in genDiagram : GMFGEN::GenDiagram) : GMFGEN::GenDiagramPreferences {
	
}