package org.erlide.ui.editors.internal.reconciling; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import com.google.common.collect.Lists; /** * Queue used by {@link org.eclipse.jface.text.reconciler.Reconciler} to manage * dirty regions. When a dirty region is inserted into the queue, the queue * tries to fold it into the neighbouring dirty region. * * @see org.eclipse.jface.text.reconciler.Reconciler * @see org.eclipse.jface.text.reconciler.DirtyRegion */ public class ErlDirtyRegionQueue { /** The list of dirty regions. */ private final LinkedList<ErlDirtyRegion> fDirtyRegions = Lists.newLinkedList(); /** * Creates a new empty dirty region. */ public ErlDirtyRegionQueue() { super(); } /** * Adds a dirty region to the end of the dirty-region queue. * * @param dr * the dirty region to add * @return true if the region is added, false if it's merged to previous * */ public boolean addDirtyRegion(final ErlDirtyRegion dr) { // If the dirty region being added is directly adjacent to the last // dirty region on the queue then merge the two dirty regions together. final ErlDirtyRegion lastDR = fDirtyRegions.peekLast(); if (lastDR != null && lastDR.isMergable(dr)) { lastDR.mergeWith(dr); return false; } fDirtyRegions.addLast(dr); return true; } /** * Throws away all entries in the queue. */ public void purgeQueue() { fDirtyRegions.clear(); } public ErlDirtyRegion extractNextDirtyRegion() { return fDirtyRegions.pollFirst(); } public List<ErlDirtyRegion> extractAllDirtyRegions() { final List<ErlDirtyRegion> d = new ArrayList<>(fDirtyRegions); fDirtyRegions.clear(); return d; } public boolean isEmpty() { return fDirtyRegions.isEmpty(); } }