| /* |
| * Copyright 2000-2012 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 com.intellij.ui; |
| |
| import com.intellij.openapi.components.*; |
| import com.intellij.openapi.components.StoragePathMacros; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.util.containers.HashMap; |
| import org.jdom.Element; |
| import org.jetbrains.annotations.NonNls; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.util.*; |
| |
| /** |
| * @author ven |
| */ |
| @State( |
| name="RecentsManager", |
| storages= { |
| @Storage( |
| file = StoragePathMacros.WORKSPACE_FILE |
| )} |
| ) |
| public class RecentsManager implements PersistentStateComponent<Element> { |
| private final Map<String, LinkedList<String>> myMap = new HashMap<String, LinkedList<String>>(); |
| |
| private int myRecentsNumberToKeep = 5; |
| @NonNls private static final String KEY_ELEMENT_NAME = "key"; |
| @NonNls private static final String RECENT_ELEMENT_NAME = "recent"; |
| @NonNls protected static final String NAME_ATTR = "name"; |
| |
| public static RecentsManager getInstance(Project project) { |
| return ServiceManager.getService(project, RecentsManager.class); |
| } |
| |
| @Nullable |
| public List<String> getRecentEntries(String key) { |
| return myMap.get(key); |
| } |
| |
| public void registerRecentEntry(String key, String recentEntry) { |
| LinkedList<String> recents = myMap.get(key); |
| if (recents == null) { |
| recents = new LinkedList<String>(); |
| myMap.put(key, recents); |
| } |
| |
| add(recents, recentEntry); |
| } |
| |
| private void add(final LinkedList<String> recentEntrues, final String newEntry) { |
| final int oldIndex = recentEntrues.indexOf(newEntry); |
| if (oldIndex >= 0) { |
| recentEntrues.remove(oldIndex); |
| } |
| else if (recentEntrues.size() == myRecentsNumberToKeep) { |
| recentEntrues.removeLast(); |
| } |
| |
| recentEntrues.addFirst(newEntry); |
| } |
| |
| public void loadState(Element element) { |
| myMap.clear(); |
| final List keyElements = element.getChildren(KEY_ELEMENT_NAME); |
| for (Iterator iterator = keyElements.iterator(); iterator.hasNext();) { |
| Element keyElement = (Element)iterator.next(); |
| final String key = keyElement.getAttributeValue(NAME_ATTR); |
| LinkedList<String> recents = new LinkedList<String>(); |
| final List children = keyElement.getChildren(RECENT_ELEMENT_NAME); |
| for (Iterator<Element> iterator1 = children.iterator(); iterator1.hasNext();) { |
| recents.addLast(iterator1.next().getAttributeValue(NAME_ATTR)); |
| } |
| |
| myMap.put(key, recents); |
| } |
| } |
| |
| public Element getState() { |
| Element element = new Element("state"); |
| final Set<Map.Entry<String, LinkedList<String>>> entries = myMap.entrySet(); |
| for (Map.Entry<String, LinkedList<String>> entry : entries) { |
| final Element keyElement = new Element(KEY_ELEMENT_NAME); |
| keyElement.setAttribute(NAME_ATTR, entry.getKey()); |
| final LinkedList<String> recents = entry.getValue(); |
| for (String recent : recents) { |
| final Element recentElement = new Element(RECENT_ELEMENT_NAME); |
| recentElement.setAttribute(NAME_ATTR, recent); |
| keyElement.addContent(recentElement); |
| } |
| element.addContent(keyElement); |
| } |
| return element; |
| } |
| |
| public void setRecentsNumberToKeep(final int recentsNumberToKeep) { |
| myRecentsNumberToKeep = recentsNumberToKeep; |
| } |
| } |