001: /*******************************************************************************
002: * Copyright (c) 2005, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.internal.operations;
011:
012: import org.eclipse.core.commands.operations.DefaultOperationHistory;
013: import org.eclipse.core.commands.operations.IOperationApprover;
014: import org.eclipse.core.commands.operations.IOperationHistory;
015: import org.eclipse.core.commands.operations.IUndoContext;
016: import org.eclipse.core.commands.operations.ObjectUndoContext;
017: import org.eclipse.core.commands.operations.OperationHistoryFactory;
018: import org.eclipse.ui.PlatformUI;
019: import org.eclipse.ui.internal.misc.Policy;
020: import org.eclipse.ui.operations.IWorkbenchOperationSupport;
021:
022: /**
023: * <p>
024: * Provides undoable operation support for the workbench. This includes providing access to the default
025: * operation history and installing a workbench-specific operation approver that enforces a linear
026: * undo strategy.
027: * </p>
028: *
029: * @since 3.1
030: */
031: public class WorkbenchOperationSupport implements
032: IWorkbenchOperationSupport {
033:
034: private ObjectUndoContext undoContext;
035: private IOperationApprover approver;
036:
037: // initialize debug options
038: static {
039: DefaultOperationHistory.DEBUG_OPERATION_HISTORY_UNEXPECTED = Policy.DEBUG_OPERATIONS;
040: DefaultOperationHistory.DEBUG_OPERATION_HISTORY_OPENOPERATION = Policy.DEBUG_OPERATIONS;
041: DefaultOperationHistory.DEBUG_OPERATION_HISTORY_APPROVAL = Policy.DEBUG_OPERATIONS;
042: DefaultOperationHistory.DEBUG_OPERATION_HISTORY_NOTIFICATION = Policy.DEBUG_OPERATIONS
043: && Policy.DEBUG_OPERATIONS_VERBOSE;
044: DefaultOperationHistory.DEBUG_OPERATION_HISTORY_DISPOSE = Policy.DEBUG_OPERATIONS
045: && Policy.DEBUG_OPERATIONS_VERBOSE;
046: }
047:
048: /**
049: * Disposes of anything created by the operation support.
050: */
051: public void dispose() {
052: /*
053: * uninstall the operation approver that we added to the operation history
054: */
055: getOperationHistory().removeOperationApprover(approver);
056: /*
057: * dispose of all operations using our context
058: */
059: getOperationHistory().dispose(getUndoContext(), true, true,
060: true);
061: }
062:
063: /**
064: * Returns the undo context for workbench operations.
065: * The workbench configures an undo context with the appropriate policies
066: * for the workbench undo model.
067: *
068: * @return the workbench operation context.
069: * @since 3.1
070: */
071: public IUndoContext getUndoContext() {
072: if (undoContext == null) {
073: undoContext = new ObjectUndoContext(PlatformUI
074: .getWorkbench(), "Workbench Context"); //$NON-NLS-1$
075: }
076: return undoContext;
077: }
078:
079: /**
080: * Returns the workbench operation history.
081: *
082: * @return the operation history for workbench operations.
083: * @since 3.1
084: */
085: public IOperationHistory getOperationHistory() {
086: IOperationHistory history = OperationHistoryFactory
087: .getOperationHistory();
088: /*
089: * Set up the history if we have not done so before.
090: */
091: if (approver == null) {
092: /*
093: * install an operation approver that prevents linear undo violations
094: * in any context
095: */
096: approver = new AdvancedValidationUserApprover(
097: getUndoContext());
098: history.addOperationApprover(approver);
099: /*
100: * set a limit for the workbench undo context
101: */
102: history.setLimit(getUndoContext(), 25);
103: }
104: return history;
105: }
106:
107: }
|