/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.gef;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.xmind.gef.command.ICommandStack;
import org.xmind.gef.part.IPart;
/**
* @author Brian Sun
* @version 2005
*/
public class Request {
private static final List<IPart> EMPTY_SOURCES = Collections.emptyList();
private static final Map<String, Object> EMPTY_PARAMETERS = Collections
.emptyMap();
private static final Map<String, Object> EMPTY_RESULTS = Collections
.emptyMap();
private static final Collection<String> EMPTY_NAMES = Collections
.emptyList();
private String type;
private EditDomain domain;
private IViewer viewer;
private List<IPart> targets;
private Map<String, Object> parameters = null;
private Map<String, Object> results = null;
private boolean handled = false;
/**
* @param type
*/
public Request(String type) {
if (type == null)
throw new IllegalArgumentException(
"A request's type must not be null."); //$NON-NLS-1$
this.type = type;
}
/**
* @return
*/
public String getType() {
return type;
}
// /**
// * Change the type of this request.
// * <p>
// * <b>NOTE:</b> FOR INTERNAL USE ONLY!!
// * </p>
// *
// * @param type
// */
// public void internalChangeType(String type) {
// this.type = type;
// }
public EditDomain getDomain() {
return domain;
}
public EditDomain getTargetDomain() {
if (domain != null)
return domain;
if (getTargetViewer() != null)
return getTargetViewer().getEditDomain();
return null;
}
public ICommandStack getTargetCommandStack() {
EditDomain targetDomain = getTargetDomain();
if (targetDomain != null)
return targetDomain.getCommandStack();
return null;
}
public Request setDomain(EditDomain domain) {
this.domain = domain;
return this;
}
public Request setViewer(IViewer viewer) {
this.viewer = viewer;
return this;
}
public IViewer getTargetViewer() {
if (viewer != null)
return viewer;
IPart target = getPrimaryTarget();
if (target != null)
return target.getSite().getViewer();
return null;
}
public List<IPart> getTargets() {
return targets == null ? EMPTY_SOURCES : targets;
}
public boolean hasTargets() {
return targets != null && !targets.isEmpty();
}
public Request setTargets(List<? extends IPart> parts) {
if (this.targets == null) {
if (!parts.isEmpty())
this.targets = new ArrayList<IPart>(parts);
} else {
this.targets.clear();
this.targets.addAll(parts);
}
return this;
}
public IPart getPrimaryTarget() {
return targets == null || targets.isEmpty() ? null : targets.get(0);
}
public Request setPrimaryTarget(IPart part) {
if (part != null) {
if (targets == null) {
targets = new ArrayList<IPart>(1);
targets.add(part);
} else {
targets.remove(part);
targets.add(0, part);
}
}
return this;
}
public Map<String, Object> getParameters() {
return parameters == null ? EMPTY_PARAMETERS : Collections
.unmodifiableMap(parameters);
}
public Request setParameter(String paramName, Object paramValue) {
if (parameters == null)
parameters = new HashMap<String, Object>();
parameters.put(paramName, paramValue);
return this;
}
public Request removeParameter(String paramName) {
if (parameters != null) {
parameters.remove(paramName);
if (parameters.isEmpty())
parameters = null;
}
return this;
}
public Request removeAllParameters() {
parameters = null;
return this;
}
public Collection<String> getParameterNames() {
if (parameters != null)
return parameters.keySet();
return EMPTY_NAMES;
}
public Request setParameters(Map<String, Object> parameters) {
if (parameters.isEmpty()) {
this.parameters = null;
} else {
if (this.parameters == null) {
this.parameters = new HashMap<String, Object>(parameters);
} else {
this.parameters.putAll(parameters);
}
}
return this;
}
public Object getParameter(String paramName) {
return parameters == null ? null : parameters.get(paramName);
}
public boolean isParameter(String paramName) {
if (parameters == null)
return false;
return Boolean.TRUE.equals(parameters.get(paramName));
}
public int getIntParameter(String paramName, int defaultValue) {
Object param = getParameter(paramName);
if (param instanceof Integer)
return ((Integer) param).intValue();
return defaultValue;
}
public double getDoubleParameter(String paramName, double defaultValue) {
Object param = getParameter(paramName);
if (param instanceof Double)
return ((Double) param).doubleValue();
return defaultValue;
}
public boolean hasParameter(String paramName) {
return parameters != null && parameters.containsKey(paramName);
}
public Map<String, Object> getResults() {
return results == null ? EMPTY_RESULTS : Collections
.unmodifiableMap(results);
}
public Request setResult(String resultName, Object resultValue) {
if (results == null)
results = new HashMap<String, Object>();
results.put(resultName, resultValue);
return this;
}
public Request removeResult(String resultName) {
if (results != null) {
results.remove(resultName);
if (results.isEmpty())
results = null;
}
return this;
}
public Request removeAllResults() {
results = null;
return this;
}
public Request setResults(Map<String, Object> results) {
if (results.isEmpty()) {
this.results = null;
} else {
if (this.results == null) {
this.results = new HashMap<String, Object>(results);
} else {
this.results.putAll(results);
}
}
return this;
}
public Object getResult(String resultName) {
return results == null ? null : results.get(resultName);
}
public boolean hasResult(String resultName) {
return results != null && results.containsKey(resultName);
}
public boolean isHandled() {
return this.handled;
}
public void markHandled() {
this.handled = true;
}
}