/**************************************************************************** * Copyright (c) 2012 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: * Patrick Tesseir (CEA LIST) - Initial API and implementation * *****************************************************************************/ package org.eclipse.papyrus.extensionpoints.editors.definition; import java.util.ArrayList; import java.util.Iterator; import java.util.TreeMap; import org.eclipse.papyrus.extensionpoints.editors.Activator; import org.eclipse.papyrus.extensionpoints.editors.utils.IDirectEditorsIds; /** * the goal of this class is to store all direct editors and to provides them by taking account * object to edit, constraint, and priority * */ public class DirectEditorRegistry { // map of direct editor indexed by priorities protected TreeMap<Integer, ArrayList<DirectEditorExtensionPoint>> editorMap=new TreeMap<Integer, ArrayList<DirectEditorExtensionPoint>>(); //list of objects that can be edited protected ArrayList<String> objectToEdits= new ArrayList<String>(); /** * add a direct editor * if this direct editor is already used as default in preferences, its priority becomes 0 * @param directEditor a direct editor, cannot be null */ public void add(DirectEditorExtensionPoint directEditor){ assert(directEditor!=null); objectToEdits.add(directEditor.getObjectToEdit()); Integer priority=directEditor.getPriority(); //take in account priority of preferences String preferedLanguage = Activator.getDefault().getPreferenceStore().getString(IDirectEditorsIds.EDITOR_FOR_ELEMENT + directEditor.getObjectToEdit()); //if the language equals is store in preferences this is the default direct editor if(preferedLanguage.equals(directEditor.getLanguage())) { priority=new Integer(0); } ArrayList<DirectEditorExtensionPoint> currentValue=editorMap.get(priority); if( currentValue==null){ currentValue= new ArrayList<DirectEditorExtensionPoint>(); } currentValue.add(directEditor); editorMap.put(priority, currentValue); } /** * put in preferences the editor with the more important priority */ protected void adaptPreferences(){ Iterator<String> iter= objectToEdits.iterator(); DirectEditorExtensionPoint defaultDirectEditor=null; while(iter.hasNext()) { String objectToEdit = (String)iter.next(); defaultDirectEditor= getDefaultDirectEditor(objectToEdit); String id= IDirectEditorsIds.EDITOR_FOR_ELEMENT + defaultDirectEditor.getObjectToEdit(); String language= defaultDirectEditor.getLanguage(); //if preference set direct editor as default, do nothing if(!Activator.getDefault().getPreferenceStore().getString(id).equals(IDirectEditorsIds.SIMPLE_DIRECT_EDITOR)){ Activator.getDefault().getPreferenceStore().setValue(id, language); } } } @Override public String toString() { String out=""; Iterator<Integer> keyIterator=editorMap.keySet().iterator(); while(keyIterator.hasNext()) { Integer index = (Integer)keyIterator.next(); out=out+"\n["+index+"]"+ "=["+editorMap.get(index)+"]"; } return out; } /** * used to fill the registry with an array of direct editors * @param directEditors cannot be null */ public void init(DirectEditorExtensionPoint[] directEditors){ editorMap= new TreeMap<Integer, ArrayList<DirectEditorExtensionPoint>>(); objectToEdits= new ArrayList<String>(); for(int i = 0; i < directEditors.length; i++) { add(directEditors[i]); } adaptPreferences(); } /** * get the direct editor with the higher priority for a given object to edit. * @param ObjectToEdit the string that represents the element to edit * @return a direct editor, it can be null */ public DirectEditorExtensionPoint getDefaultDirectEditor (String ObjectToEdit){ Iterator<Integer> keyIterator=editorMap.keySet().iterator(); while(keyIterator.hasNext()) { Integer index = (Integer)keyIterator.next(); Iterator<DirectEditorExtensionPoint> iter=editorMap.get(index).iterator(); while(iter.hasNext()) { DirectEditorExtensionPoint directEditorExtensionPoint = (DirectEditorExtensionPoint)iter.next(); if( directEditorExtensionPoint.getObjectToEdit().equals(ObjectToEdit)){ return directEditorExtensionPoint; } } } return null; } }