| /******************************************************************************* |
| * 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(); |
| } |
| } |