/*******************************************************************************
* Copyright (c) 2012 Google, Inc.
* 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:
* Google, Inc. - initial API and implementation
*******************************************************************************/
package com.windowtester.runtime.gef.internal;
import org.eclipse.draw2d.IFigure;
import com.windowtester.internal.runtime.util.Invariants;
import com.windowtester.runtime.gef.IFigureReference;
import com.windowtester.runtime.gef.internal.hierarchy.IConnectionList;
import com.windowtester.runtime.gef.internal.hierarchy.IFigureInfoBuilder;
/**
* A container for state that may be pre- or lazily computed.
*/
public abstract class FigureInfoState {
public static FigureInfoState lazy(IFigure figure) {
return new LazyState(figure, new FigureInfoBuilder());
}
public static FigureInfoState eager(IFigure figure) {
return new EagerState(figure, new FigureInfoBuilder());
}
protected IEditPartReference _part;
protected IFigureList _children;
protected IFigureReference _parent;
protected IConnectionList _connections;
public abstract IEditPartReference getEditPart();
public abstract IFigureList getChildren();
public abstract IFigureReference getParent();
public abstract IConnectionList getConnections();
protected static class EagerState extends FigureInfoState {
protected EagerState(IFigure figure, IFigureInfoBuilder builder) {
Invariants.notNull(figure);
Invariants.notNull(builder);
_children = getChildren(figure, builder);
//_parent = getParent(figure, builder); //TODO: this is causing stack overflows...
_part = getPart(figure, builder);
_connections = getConnections(figure, builder);
}
public IFigureList getChildren() {
return _children;
}
public IEditPartReference getEditPart() {
return _part;
}
public IConnectionList getConnections() {
return _connections;
}
public IFigureReference getParent() {
return _parent;
}
}
protected static class LazyState extends FigureInfoState {
private final IFigure _figure;
private final IFigureInfoBuilder _builder;
protected LazyState(IFigure figure, IFigureInfoBuilder builder) {
Invariants.notNull(figure);
Invariants.notNull(builder);
_figure = figure;
_builder = builder;
}
public IFigureList getChildren() {
if (_children == null)
_children = getChildren(getFigure(), getBuilder());
return _children;
}
public IFigureReference getParent() {
if (_parent == null)
_parent = getParent(getFigure(), getBuilder());
return _parent;
}
public IEditPartReference getEditPart() {
if (_part == null)
_part = getPart(getFigure(), getBuilder());
return _part;
}
public IConnectionList getConnections() {
if (_connections == null)
_connections = getConnections(getFigure(), getBuilder());
return _connections;
}
private IFigure getFigure() {
return _figure;
}
private IFigureInfoBuilder getBuilder() {
return _builder;
}
}
protected IFigureList getChildren(IFigure figure, IFigureInfoBuilder builder) {
return builder.getChildren(figure);
}
protected IFigureReference getParent(IFigure figure, IFigureInfoBuilder builder) {
return builder.getParent(figure);
}
protected IEditPartReference getPart(IFigure figure, IFigureInfoBuilder builder) {
return builder.getPart(figure);
}
protected IConnectionList getConnections(IFigure figure, IFigureInfoBuilder builder) {
return builder.getConnections(figure);
}
}