blob: f7bf6b9dbe405b7ebdebdaa192d32302c6d401e6 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2004, 2009 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.gmf.runtime.diagram.ui.properties.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.gmf.runtime.common.core.util.RequestCollapser;
import org.eclipse.gmf.runtime.common.ui.util.DisplayUtils;
/**
* The receiver will collapse all requests into one and invoke it by the
* user-interface thread at the next reasonable opportunity. Each thread which
* calls this collapser is suspended until the runnable completes.
*
* @author nbalaba
*/
public class SectionUpdateRequestCollapser
extends RequestCollapser {
private Map sectionsUpdateRequests = null;
private List requestors = null;
protected void executeRequest(Runnable request) {
DisplayUtils.getDisplay().syncExec(request);
}
/**
* posts the request from the client to run in the thread at the next
* possible chance. The posted request will overwrite any previous one
*
* @param runnable
* the Runnable request to run
*/
public synchronized void postRequest(Runnable runnable) {
notify();
}
/**
* @param requester
* @param request
*/
public synchronized void postRequest(Object requester, Runnable request) {
if (!requestors.contains(requester))
requestors.add(requester);
sectionsUpdateRequests.put(requester, request);
postRequest(request);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gmf.runtime.common.core.internal.util.RequestCollapser#getRequest()
*/
protected synchronized Runnable getRequest() {
Runnable request = null;
if (requestors.size() > 0) {
Object requester = requestors.get(0);
requestors.remove(0);
request = (Runnable) sectionsUpdateRequests.get(requester);
sectionsUpdateRequests.remove(requester);
}
return request;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gmf.runtime.common.core.internal.util.RequestCollapser#start()
*/
public synchronized void start() {
sectionsUpdateRequests = new HashMap();
requestors = new ArrayList();
super.start();
}
/**
* stops this automaton pbject by interrupting the thread
*/
public synchronized void stop() {
super.stop();
sectionsUpdateRequests = null;
requestors = null;
}
}