/******************************************************************************* * Copyright (c) 2009, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.sse.ui.internal.rules; import java.util.AbstractCollection; import java.util.Iterator; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.text.TextPresentation; import org.eclipse.swt.custom.StyleRange; import org.eclipse.wst.sse.ui.internal.Logger; /** * Passed to LineStyleProviders as the Collection for which StyleRanges are to * be added. This class provides additional sanity checks on the incoming * StyleRanges so that we do not rely upon SWT to report Errors with no record * of the StyleRange or contributing LineStyleProvider, as well as a slight * performance increase by not allocating a redundant collection for the * StyleRanges. * * This class intentionally violates the contract for java.util.Collection. */ class PresentationCollector extends AbstractCollection { private final TextPresentation fPresentation; private int lastOffset; /** * @param presentation * - the Presentation being added to * @param applyOnAdd */ PresentationCollector(TextPresentation presentation) { super(); Assert.isNotNull(presentation); fPresentation = presentation; lastOffset = 0; } /* * (non-Javadoc) * * @see java.util.Collection#add(java.lang.Object) */ public boolean add(Object o) { StyleRange range = (StyleRange) o; if (lastOffset > range.start) { Logger.log(Logger.ERROR, "Overlapping start in StyleRange " + range.start + ":" + range.length); //$NON-NLS-1$ //$NON-NLS-2$ return false; } else if (range.length < 0) { Logger.log(Logger.ERROR, "StyleRange with negative length" + range.start + ":" + range.length); //$NON-NLS-1$ //$NON-NLS-2$ return false; } lastOffset = range.start + range.length; fPresentation.addStyleRange(range); return true; } /* * (non-Javadoc) * * @see java.util.AbstractCollection#iterator() */ public Iterator iterator() { return fPresentation.getNonDefaultStyleRangeIterator(); } /* * (non-Javadoc) * * @see java.util.AbstractCollection#size() */ public int size() { throw new UnsupportedOperationException(); } }