trace/tracebuilder/com.nokia.tracebuilder/src/com/nokia/tracebuilder/engine/source/TraceLocationRemover.java
changeset 10 ed1c9f64298a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trace/tracebuilder/com.nokia.tracebuilder/src/com/nokia/tracebuilder/engine/source/TraceLocationRemover.java	Wed Jun 23 14:35:40 2010 +0300
@@ -0,0 +1,178 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+* Removes a location from source
+*
+*/
+package com.nokia.tracebuilder.engine.source;
+
+import com.nokia.tracebuilder.engine.TraceLocation;
+import com.nokia.tracebuilder.source.SourceConstants;
+import com.nokia.tracebuilder.source.SourceEditor;
+import com.nokia.tracebuilder.source.SourceExcludedArea;
+import com.nokia.tracebuilder.source.SourceLocationBase;
+import com.nokia.tracebuilder.source.SourceParserException;
+
+/**
+ * Removes a location from source
+ * 
+ */
+class TraceLocationRemover extends SourceEditorUpdater {
+
+	/**
+	 * The trace location to be removed
+	 */
+	TraceLocation location;
+
+	/**
+	 * Creates a new location remover for given location
+	 * 
+	 * @param location
+	 *            the location to be written to source
+	 */
+	TraceLocationRemover(TraceLocation location) {
+		super(location.getSource());
+		this.location = location;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.engine.source.SourceEditorUpdater#runUpdate()
+	 */
+	@Override
+	protected boolean runUpdate() throws SourceParserException {
+		// If the location was already deleted by some other operation while
+		// waiting for this asynchronous operation to run, there is no need to
+		// remove it
+		boolean updated;
+		if (!location.isDeleted()) {
+			removeLocation(location);
+			updated = true;
+		} else {
+			updated = false;
+		}
+		return updated;
+	}
+
+	/**
+	 * Removes a location
+	 * 
+	 * @param location
+	 *            the location to be removed
+	 * @return the offset where the removed location started
+	 * @throws SourceParserException
+	 *             if remove fails
+	 */
+	static int removeLocation(TraceLocation location)
+			throws SourceParserException {
+
+		SourceEditor sourceEditor = location.getSource().getSourceEditor();
+		int start;
+		int end;
+
+		// Old Symbian traces could include comment associated with the location
+		// If it exists, it is also removed
+		String listTitle = location.getLocationList().getListTitle();
+		if (listTitle != null && listTitle.equals("SymbianTrace")) { //$NON-NLS-1$
+			SourceExcludedArea area = TraceLocationWriter
+					.findLocationComment(location);
+			if (area != null) {
+				if (area.getOffset() < location.getOffset()
+						&& area.getType() == SourceExcludedArea.LINE_COMMENT) {
+					start = area.getOffset();
+					end = location.getOffset() + location.getLength();
+				} else if (area.getOffset() > location.getOffset()
+						&& area.getType() == SourceExcludedArea.LINE_COMMENT) {
+					start = location.getOffset();
+					end = area.getOffset() + area.getLength();
+				} else {
+					start = location.getOffset();
+					end = start + location.getLength();
+				}
+			} else {
+				start = location.getOffset();
+				end = start + location.getLength();
+			}
+		} else {
+			start = location.getOffset();
+			end = start + location.getLength();
+		}
+
+		// If there is a line feed after the trace, the line feed is
+		// also removed
+		int lflen = SourceConstants.LINE_FEED.length();
+		if (end <= (sourceEditor.getDataLength() - lflen)) {
+			String data = sourceEditor.getData(end, lflen);
+			if (data.equals(SourceConstants.LINE_FEED)) {
+				end += lflen;
+			}
+		}
+		start = sourceEditor.findStartOfLine(start, true, true);
+		int len = end - start;
+		sourceEditor.updateSource(start, len, ""); //$NON-NLS-1$
+		return start;
+	}
+
+	/**
+	 * Finds the start offset of given location
+	 * 
+	 * @param location
+	 *            the location to be checked
+	 * @return the offset where the location starts
+	 * @throws SourceParserException
+	 *             if operation fails
+	 */
+	static int findStartOffset(TraceLocation location)
+			throws SourceParserException {
+		int start;
+		SourceEditor sourceEditor = location.getSource().getSourceEditor();
+
+		// Old Symbian traces could include comment associated with the location
+		// If it exists before location, it is also included
+		String listTitle = location.getLocationList().getListTitle();
+		if (listTitle != null && listTitle.equals("SymbianTrace")) { //$NON-NLS-1$
+			SourceExcludedArea area = TraceLocationWriter
+					.findLocationComment(location);
+
+			if (area != null) {
+				if (area.getOffset() < location.getOffset()
+						&& area.getType() == SourceExcludedArea.LINE_COMMENT) {
+					start = area.getOffset();
+				} else {
+					start = location.getOffset();
+				}
+			} else {
+				start = location.getOffset();
+			}
+		} else {
+			start = location.getOffset();
+		}
+
+		start = sourceEditor.findStartOfLine(start, true, true);
+		return start;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.nokia.tracebuilder.engine.source.SourceEditorUpdater#getPosition()
+	 */
+	@Override
+	protected SourceLocationBase getPosition() {
+		return location;
+	}
+
+}