/***************************************************************************** * Copyright (c) 2011 CEA LIST. * * 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: * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.uml.properties.preferences; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IPath; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.papyrus.infra.emf.utils.EMFHelper; import org.eclipse.papyrus.infra.tools.util.ClassLoaderHelper; import org.eclipse.papyrus.uml.properties.Activator; import org.eclipse.papyrus.uml.properties.languagepreferences.Editor; import org.eclipse.papyrus.uml.properties.languagepreferences.Language; import org.eclipse.papyrus.uml.properties.languagepreferences.Preferences; import org.eclipse.papyrus.uml.properties.languagepreferences.languagepreferencesFactory; import org.eclipse.papyrus.uml.properties.widgets.BodyEditor; /** * A Registry to manage associations between a language and a language * editor for UML Expressions * * @author Camille Letavernier */ public class LanguageRegistry { /** * The singleton instance for the LanguageRegistry */ public static LanguageRegistry instance = new LanguageRegistry(); private LanguageRegistry() { languageMapping = new HashMap<String, List<Editor>>(); IPath path = Activator.getDefault().getPreferencesPath(); String preferencesPath = path.toString() + "/languagePreferences.xmi"; //$NON-NLS-1$ URI preferencesURI = URI.createFileURI(preferencesPath); try { ResourceSet resourceSet = new ResourceSetImpl(); Object preferencesObject = EMFHelper.loadEMFModel(resourceSet, preferencesURI); if(preferencesObject instanceof Preferences) { preferences = (Preferences)preferencesObject; } else { createPreferences(preferencesURI); } } catch (IOException e) { createPreferences(preferencesURI); } //Init } private void createPreferences(URI preferencesURI) { preferences = languagepreferencesFactory.eINSTANCE.createPreferences(); Editor defaultEditor = languagepreferencesFactory.eINSTANCE.createEditor(); defaultEditor.setClass("org.eclipse.papyrus.uml.properties.widgets.NaturalLanguageEditor"); //$NON-NLS-1$ preferences.getEditors().add(defaultEditor); preferences.setDefaultEditor(defaultEditor); ResourceSet resourceSet = new ResourceSetImpl(); Resource resource = resourceSet.createResource(preferencesURI); resource.getContents().add(preferences); persist(); } private void persist() { try { preferences.eResource().save(Collections.EMPTY_MAP); } catch (IOException ex) { Activator.log.error(ex); } } /** * Gets the editor associated to the given language * * @param language * The language for which we want to edit an expression * @return The BodyEditor for the given language */ public BodyEditor getEditorFor(String language) { if(languageMapping.containsKey(language)) { List<Editor> editors = languageMapping.get(language); if(editors != null && !editors.isEmpty()) { return getInstance(editors.get(0)); } } return getEditorFor(""); //$NON-NLS-1$ } /** * Sets the default editor for a language * * @param languageName * The name of the language * @param editor * The editor to associate to the language */ public void setDefaultEditorFor(String languageName, Editor editor) { if(!languageMapping.containsKey(languageName)) { languageMapping.put(languageName, new LinkedList<Editor>()); } List<Editor> availableEditors = languageMapping.get(languageName); availableEditors.removeAll(Collections.singleton(editor)); availableEditors.add(0, editor); Language language = getLanguage(languageName); language.setPreferedEditor(editor); } /** * @return the preferences associated to the registry */ public Preferences getPreferences() { return preferences; } /** * Registers a new editor for a given language * * @param language * The language name * @param editor * The editor to associate to the language */ public void registerEditor(String language, Editor editor) { if(language == null) { language = ""; //$NON-NLS-1$ } if(!languageMapping.containsKey(language)) { languageMapping.put(language, new LinkedList<Editor>()); } List<Editor> editors = languageMapping.get(language); if(!editors.contains(editors)) { editors.add(editor); } } private Language getLanguage(String name) { for(Language language : preferences.getLanguages()) { if(language.getName().equals(name)) { return language; } } Language language = languagepreferencesFactory.eINSTANCE.createLanguage(); language.setName(name); preferences.getLanguages().add(language); return language; } private BodyEditor getInstance(Editor editor) { String className = editor.getClass_(); return ClassLoaderHelper.newInstance(className, BodyEditor.class); } private Map<String, List<Editor>> languageMapping; private Preferences preferences; /** * * @return the list of all known languages */ public List<String> getLanguages() { List<String> result = new LinkedList<String>(languageMapping.keySet()); result.remove(""); //$NON-NLS-1$ Collections.sort(result); return result; } }