package org.xmind.ui.internal.outline.resource; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.Assert; import org.xmind.core.ISheet; import org.xmind.core.ITopic; import org.xmind.core.marker.IMarker; import org.xmind.core.marker.IMarkerRef; public class MarkerResourceForSheet extends AbstractIndexResource implements IMarkerResource { private Set<String> markerIds = new HashSet<String>(); private Map<String, Set<ITopic>> idToTopics = new HashMap<String, Set<ITopic>>(); private Map<String, IMarker> idToMarker = new HashMap<String, IMarker>(); private ISheet sheet; public MarkerResourceForSheet(ISheet sheet) { Assert.isNotNull(sheet); this.sheet = sheet; init(false); } private void init(boolean update) { if (update) { markerIds.clear(); idToTopics.clear(); idToMarker.clear(); } collectResourceForSheet(sheet); } public Set<String> getMarkerIds() { return markerIds; } public IMarker getMarker(String markerId) { return idToMarker.get(markerId); } public Set<ITopic> getTopics(String markerId) { return idToTopics.get(markerId); } public Object getSource() { return sheet; } public void reset(Object source, boolean update) { Assert.isNotNull(source); this.sheet = (ISheet) source; init(update); } protected void collectResourceForTopic(ITopic topic) { Set<IMarkerRef> markerRefs = topic.getMarkerRefs(); for (IMarkerRef markerRef : markerRefs) { IMarker marker = markerRef.getMarker(); String markerId = marker.getId(); markerIds.add(markerId); Set<String> keySet = idToTopics.keySet(); if (keySet.contains(markerId)) { Set<ITopic> topicsCollected = idToTopics.get(markerId); if (topicsCollected == null) topicsCollected = new HashSet<ITopic>(); topicsCollected.add(topic); idToTopics.put(markerId, topicsCollected); idToMarker.put(markerId, marker); } else { Set<ITopic> topicsCollected = new HashSet<ITopic>(); topicsCollected.add(topic); idToTopics.put(markerId, topicsCollected); idToMarker.put(markerId, marker); } } } }