/******************************************************************************* | |
* 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 2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
* 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(); | |
} | |
} |