/******************************************************************************* * Copyright (c) 2010 CodeSourcery 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: * Dmitry Kozlov (CodeSourcery) - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.ui.buildconsole; import org.eclipse.jface.text.ITypedRegion; import org.eclipse.cdt.core.ProblemMarkerInfo; /** * Manages current position of highlighted error in BuildConsole */ class DocumentMarkerManager { BuildConsoleDocument fDocument; BuildConsolePartitioner fPartitioner; int highlightedPartitionIndex = -1; DocumentMarkerManager(BuildConsoleDocument document, BuildConsolePartitioner partitioner) { fDocument = document; fPartitioner = partitioner; } /** Increment index */ void moveToNextError() { if ( fPartitioner.fPartitions.size() == 0 ) return; if ( highlightedPartitionIndex == -1 ) { moveToFirstError(); return; } int i = highlightedPartitionIndex + 1; do { if ( i == fPartitioner.fPartitions.size() ) { i = 0; } String type = fPartitioner.fPartitions.get(i).getType(); if (BuildConsolePartition.isProblemPartitionType(type)) { highlightedPartitionIndex = i; return; } else { i++; } } while ( highlightedPartitionIndex != i); } /** Decrement index */ void moveToPreviousError() { if ( fPartitioner.fPartitions.size() == 0 ) return; if ( highlightedPartitionIndex == -1 ) { moveToFirstError(); return; } int i = highlightedPartitionIndex - 1; do { if ( i == -1 ) { i = fPartitioner.fPartitions.size() - 1; } String type = fPartitioner.fPartitions.get(i).getType(); if (BuildConsolePartition.isProblemPartitionType(type)) { highlightedPartitionIndex = i; return; } else { i--; } } while ( highlightedPartitionIndex != i); } void moveToFirstError() { for (int i=0; i<fPartitioner.fPartitions.size(); i++) { String type = fPartitioner.fPartitions.get(i).getType(); if (BuildConsolePartition.isProblemPartitionType(type)) { highlightedPartitionIndex = i; return; } } highlightedPartitionIndex = -1; } /** Returns true if offset points to error partition and false otherwise */ boolean moveToErrorByOffset(int offset) { ITypedRegion p = fPartitioner.getPartition(offset); String type = p.getType(); if (BuildConsolePartition.isProblemPartitionType(type)) { highlightedPartitionIndex = fPartitioner.fPartitions.indexOf(p); return true; } return false; } /** Get marker for current error */ ProblemMarkerInfo getCurrentErrorMarker() { BuildConsolePartition p = getCurrentPartition(); if ( p != null ) { return p.getMarker(); } else { return null; } } /** Get partition for current error */ BuildConsolePartition getCurrentPartition() { if ( 0 <= highlightedPartitionIndex && highlightedPartitionIndex < fPartitioner.fPartitions.size() ) { BuildConsolePartition p = (BuildConsolePartition)fPartitioner.fPartitions.get(highlightedPartitionIndex); return p; } return null; } void clear() { highlightedPartitionIndex = -1; } }