/* * Copyright 2003-2013 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.nodeEditor.hintsSettings; import jetbrains.mps.openapi.editor.descriptor.ConceptEditorHint; import jetbrains.mps.openapi.editor.descriptor.EditorAspectDescriptor; import jetbrains.mps.openapi.editor.descriptor.EditorHintsProvider; import jetbrains.mps.smodel.language.LanguageRuntime; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * Semen Alperovich * 05 15, 2013 */ public class ConceptEditorHintSettings { private final Map<String, Map<ConceptEditorHint, Boolean>> mySettings = new ConcurrentHashMap<String, Map<ConceptEditorHint, Boolean>>(); public ConceptEditorHintSettings() { } public ConceptEditorHintSettings(Iterable<LanguageRuntime> availableLanguages) { for (LanguageRuntime language : availableLanguages) { EditorAspectDescriptor editorDescriptor = language.getAspect(EditorAspectDescriptor.class); if (editorDescriptor instanceof EditorHintsProvider) { String lang = language.getNamespace(); for (ConceptEditorHint hint : ((EditorHintsProvider) editorDescriptor).getHints()) { if (hint.showInUI()) { put(lang, hint, false); } } } } } @NotNull public Set<String> getEnabledHints() { Set<String> enabledHints = new HashSet<String>(); for (String lang : getLanguagesNames()) { for (ConceptEditorHint hint : getHints(lang)) { if (get(lang, hint)) { enabledHints.add(hint.getFQName()); } } } return enabledHints; } public synchronized void updateSettings(Set<String> enabledHints) { for (String lang : getLanguagesNames()) { for (ConceptEditorHint hint : getHints(lang)) { if (enabledHints.contains(hint.getFQName())) { put(lang, hint, true); } } } } public Set<ConceptEditorHint> getHints(String lang) { if (!mySettings.containsKey(lang)) { return Collections.emptySet(); } return mySettings.get(lang).keySet(); } public Set<String> getLanguagesNames() { return mySettings.keySet(); } public synchronized Boolean put(String lang, ConceptEditorHint hint, boolean value) { if (!mySettings.containsKey(lang)) { mySettings.put(lang, Collections.synchronizedMap(new LinkedHashMap<ConceptEditorHint, Boolean>())); } return mySettings.get(lang).put(hint, value); } public synchronized void putAll(ConceptEditorHintSettings settings) { for (String langName : settings.getLanguagesNames()) { mySettings.put(langName, Collections.synchronizedMap(new LinkedHashMap<ConceptEditorHint, Boolean>())); mySettings.get(langName).putAll(settings.mySettings.get(langName)); } } public void clear() { mySettings.clear(); } public int size() { return mySettings.size(); } public synchronized Boolean remove(String lang, ConceptEditorHint hint) { if (!mySettings.containsKey(lang)) { return null; } else { Boolean result = mySettings.get(lang).remove(hint); if (mySettings.get(lang).isEmpty()) { mySettings.remove(lang); } return result; } } public Boolean get(String lang, ConceptEditorHint hint) { if (!mySettings.containsKey(lang)) { return null; } return mySettings.get(lang).get(hint); } public boolean containsKey(String lang, ConceptEditorHint hint) { return mySettings.containsKey(lang) && mySettings.get(lang).containsKey(hint); } }