blob: e36dae2d1aeed662dc340b10552ab43d29b4c296 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2007 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.ui.ide.undo;
import java.util.Map;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.ui.internal.ide.undo.UndoMessages;
/**
* An UpdateMarkersOperation represents an undoable operation for updating one
* or more markers in the workspace with one or more sets of attributes. Clients
* may call the public API from a background thread.
*
* This class is intended to be instantiated and used by clients. It is not
* intended to be subclassed by clients.
*
* @since 3.3
*
*/
public class UpdateMarkersOperation extends AbstractMarkersOperation {
// Whether attributes should be merged with existing attributes when
// updated, or considered to be complete replacements.
private boolean mergeAttributes;
/**
* Create an undoable operation that can update the specified marker with
* the specified attributes.
*
* @param marker
* the marker to be updated
* @param attributes
* the map of attributes to be assigned to the marker. This map
* does not replace the attribute map of the marker, but instead,
* each attribute in the map is added or updated with the current
* value in the map. In other words
* @param name
* the name used to describe this operation
* @param mergeAttributes
* <code>true</code> if the specified map of attributes for the
* marker is to be merged with the attributes already specified
* for the marker, or <code>false</code> if the specified map
* of attributes is to be considered a complete replacement of
* all attributes of the marker
*/
public UpdateMarkersOperation(IMarker marker, Map attributes, String name,
boolean mergeAttributes) {
super(new IMarker[] { marker }, null, attributes, name);
this.mergeAttributes = mergeAttributes;
}
/**
* Create an undoable operation that updates many markers to have the same
* set of attributes.
*
* @param markers
* the markers to be updated
* @param attributes
* the map of attributes to be assigned to each marker
* @param name
* the name used to describe this operation
* @param mergeAttributes
* <code>true</code> if the specified map of attributes for
* each marker is to be merged with the attributes already
* specified for that marker, or <code>false</code> if the
* specified map of attributes is to be considered a complete
* replacement of all attributes for each marker
*/
public UpdateMarkersOperation(IMarker[] markers, Map attributes,
String name, boolean mergeAttributes) {
super(markers, null, attributes, name);
this.mergeAttributes = mergeAttributes;
}
/*
* (non-Javadoc)
*
* Map execution to updating the markers.
*
* @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doExecute(org.eclipse.core.runtime.IProgressMonitor,
* org.eclipse.core.runtime.IAdaptable)
*/
protected void doExecute(IProgressMonitor monitor, IAdaptable info)
throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
monitor.beginTask("", 100); //$NON-NLS-1$
monitor.setTaskName(UndoMessages.MarkerOperation_UpdateProgress);
updateMarkers(100, monitor, mergeAttributes);
monitor.done();
}
/*
* (non-Javadoc)
*
* Map undo to execute (since both operations update the markers).
*
* @see org.eclipse.ui.ide.undo.AbstractWorkspaceOperation#doUndo(org.eclipse.core.runtime.IProgressMonitor,
* org.eclipse.core.runtime.IAdaptable)
*/
protected void doUndo(IProgressMonitor monitor, IAdaptable info)
throws CoreException {
// doExecute simply swaps the current and remembered attributes,
// so it can also be used for undo
doExecute(monitor, info);
}
/*
* (non-Javadoc)
*
* Map undo status to marker update status.
*
* @see org.eclipse.ui.ide.undo.AbstractMarkersOperation#getBasicUndoStatus()
*/
protected IStatus getBasicUndoStatus() {
return getMarkerUpdateStatus();
}
/*
* (non-Javadoc)
*
* Map redo status to marker update status.
*
* @see org.eclipse.ui.ide.undo.AbstractMarkersOperation#getBasicRedoStatus()
*/
protected IStatus getBasicRedoStatus() {
return getMarkerUpdateStatus();
}
}