package org.plantuml.idea.toolwindow;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.components.StoragePathMacros;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.jetbrains.annotations.NotNull;
import org.plantuml.idea.rendering.RenderCacheItem;
import java.util.LinkedHashMap;
import java.util.Map;
@State(name = "PlantUmlSelectedPages", storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/plantuml-selectedPages.xml")})
public class SelectedPagePersistentStateComponent implements PersistentStateComponent<SelectedPagePersistentStateComponent.SelectedPages> {
public static final int MAX_ENTRIES = 50;
private SelectedPages state = new SelectedPages();
public SelectedPagePersistentStateComponent() {
}
@Override
@NotNull
public SelectedPages getState() {
return state;
}
@Override
public void loadState(@NotNull SelectedPages state) {
this.state = state;
}
public int getPage(String sourceFilePath) {
Integer integer = state.map.get(sourceFilePath);
if (integer == null) {
integer = -1;
}
return integer;
}
public void setPage(int selectedPage, RenderCacheItem displayedItem) {
if (displayedItem != null) {
if (selectedPage == -1) {
state.map.remove(displayedItem.getSourceFilePath());
} else {
state.map.put(displayedItem.getSourceFilePath(), selectedPage);
}
}
}
public static class SelectedPages {
private Map<String, Integer> map = new MyLinkedHashMap<String, Integer>(MAX_ENTRIES);
public Map<String, Integer> getMap() {
return map;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
}
private static class MyLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
private final int maxEntries;
public MyLinkedHashMap(int maxEntries) {
super(maxEntries + 1, 1, true);
this.maxEntries = maxEntries;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > maxEntries;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("maxEntries", maxEntries)
.toString();
}
}
}