/******************************************************************************* * Copyright (c) 2002, 2010 QNX Software Systems 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: * QNX Software Systems - Initial API and implementation * Dmitry Kozlov (CodeSourcery) - Build error highlighting and navigation *******************************************************************************/ package org.eclipse.cdt.internal.ui.buildconsole; import org.eclipse.cdt.core.ProblemMarkerInfo; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.jface.text.TypedRegion; public class BuildConsolePartition extends TypedRegion { /** Associated stream */ private BuildConsoleStreamDecorator fStream; /** Marker associated with this partition if any */ private ProblemMarkerInfo fMarker; /** Partition type */ public static final String CONSOLE_PARTITION_TYPE = CUIPlugin.getPluginId() + ".CONSOLE_PARTITION_TYPE"; //$NON-NLS-1$ /** Partition types to report build problems in the console */ public static final String ERROR_PARTITION_TYPE = CUIPlugin.getPluginId() + ".ERROR_PARTITION_TYPE"; //$NON-NLS-1$ public static final String INFO_PARTITION_TYPE = CUIPlugin.getPluginId() + ".INFO_PARTITION_TYPE"; //$NON-NLS-1$ public static final String WARNING_PARTITION_TYPE = CUIPlugin.getPluginId() + ".WARNING_PARTITION_TYPE"; //$NON-NLS-1$ public BuildConsolePartition(BuildConsoleStreamDecorator stream, int offset, int length, String type) { super(offset, length, type); fStream = stream; } public BuildConsolePartition(BuildConsoleStreamDecorator stream, int offset, int length, String type, ProblemMarkerInfo marker) { super(offset, length, type); fStream = stream; fMarker = marker; } /** * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object partition) { if (super.equals(partition)) { return fStream.equals(((BuildConsolePartition) partition).getStream()); } return false; } /** * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return super.hashCode() + fStream.hashCode(); } /** * Returns this partition's stream * * @return this partition's stream */ public BuildConsoleStreamDecorator getStream() { return fStream; } /** * Returns whether this partition is allowed to be combined with the given * partition. * * @param partition * @return boolean */ public boolean canBeCombinedWith(BuildConsolePartition partition) { // Error partitions never can be combined together String type = getType(); if (isProblemPartitionType(type)) { return false; } int start = getOffset(); int end = start + getLength(); int otherStart = partition.getOffset(); int otherEnd = otherStart + partition.getLength(); boolean overlap = (otherStart >= start && otherStart <= end) || (start >= otherStart && start <= otherEnd); return getStream() != null && overlap && type.equals(partition.getType()) && getStream().equals(partition.getStream()); } /** * Returns a new partition representing this and the given parition * combined. * * @param partition * @return partition */ public BuildConsolePartition combineWith(BuildConsolePartition partition) { int start = getOffset(); int end = start + getLength(); int otherStart = partition.getOffset(); int otherEnd = otherStart + partition.getLength(); int theStart = Math.min(start, otherStart); int theEnd = Math.max(end, otherEnd); return createNewPartition(theStart, theEnd - theStart, CONSOLE_PARTITION_TYPE); } /** * Creates a new partition of this type with the given offset, and length. * @param offset * @param length * @return a new partition with the given range */ public BuildConsolePartition createNewPartition(int offset, int length, String type) { return new BuildConsolePartition(getStream(), offset, length, type, getMarker()); } public ProblemMarkerInfo getMarker() { return fMarker; } public static boolean isProblemPartitionType(String type) { return type==BuildConsolePartition.ERROR_PARTITION_TYPE || type==BuildConsolePartition.WARNING_PARTITION_TYPE || type==BuildConsolePartition.INFO_PARTITION_TYPE; } }