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