blob: 41e86ea0a2e4cdd4c93f2921a06caffa182107a9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 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.bpel.ui.util;
import java.util.HashSet;
/**
* This class provides some support for batching of EMF change notifications
* while an execute/undo/redo is in progress on the CommandStack.
*/
public class CommandStackChangeBatcher extends AbstractSharedCommandStackListener {
protected static boolean batchingChanges;
// Note that when the batches are fired off to each adapter, the adapters
// will
// be finish()ed in a random order. (This is only bad if adapters depend on
// their
// behaviour being run before/after that of other adapters!).
// TODO: is this being static, a problem now that we can share the
// resourceSet across
// multiple editors? What if adapters in more than one editor are responding
// to the
// changes?
public static HashSet<IBatchedAdapter> liveBatchedAdapters = new HashSet<IBatchedAdapter>();
static final IBatchedAdapter[] EMPTY = {};
protected void startBatch() {
if (batchingChanges) {
// System.out.println("WARNING: Re-entered
// CommandStackChangeBatcher.startBatch()! Merging with existing
// batch!");
return;
}
batchingChanges = true;
// TODO: this is a little unsafe?. but it works for now.
liveBatchedAdapters.clear();
}
protected void finishBatch() {
batchingChanges = false;
for (IBatchedAdapter adapter : liveBatchedAdapters.toArray( EMPTY )) {
adapter.finish();
}
liveBatchedAdapters.clear();
}
/**
* @return whether we are batching changes.
*/
public static boolean isBatchingChanges() {
return batchingChanges;
}
/**
* @param adapter
*/
public static void registerBatchChange (IBatchedAdapter adapter) {
liveBatchedAdapters.add(adapter);
}
@Override
protected void startExecute() {
startBatch();
}
@Override
protected void startRedo() {
startBatch();
}
@Override
protected void startUndo() {
startBatch();
}
@Override
protected void finishExecute() {
finishBatch();
}
@Override
protected void finishRedo() {
finishBatch();
}
@Override
protected void finishUndo() {
finishBatch();
}
}