blob: 01235524cbb618b84dd6b7106d95d503900e9496 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.editor.client.impl;
import com.google.gwt.editor.client.CompositeEditor;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.EditorContext;
import com.google.gwt.editor.client.EditorDelegate;
import com.google.gwt.editor.client.EditorVisitor;
import com.google.gwt.editor.client.HasEditorDelegate;
import com.google.gwt.editor.client.HasEditorErrors;
import com.google.gwt.editor.client.LeafValueEditor;
import com.google.gwt.editor.client.ValueAwareEditor;
/**
* Base implementation of EditorContext.
*
* @param <T> the type of data being edited
*/
public abstract class AbstractEditorContext<T> implements EditorContext<T> {
private final String path;
private final CompositeEditor<?, ?, ?> compositeEditor;
private AbstractEditorDelegate<T, ?> delegate;
private final Editor<T> editor;
private final HasEditorDelegate<T> hasEditorDelegate;
private final HasEditorErrors<T> hasEditorErrors;
private boolean isHalted;
private final LeafValueEditor<T> leafValueEditor;
private final ValueAwareEditor<T> valueAwareEditor;
public AbstractEditorContext(Editor<T> editor, String path) {
this.editor = editor;
this.path = path;
/*
* TODO(bobv): Determine if pre-casting is better than demand-casting or
* generating the asFoo methods.
*/
compositeEditor = editor instanceof CompositeEditor<?, ?, ?>
? (CompositeEditor<?, ?, ?>) editor : null;
hasEditorDelegate = editor instanceof HasEditorDelegate<?>
? (HasEditorDelegate<T>) editor : null;
hasEditorErrors = editor instanceof HasEditorErrors<?>
? (HasEditorErrors<T>) editor : null;
leafValueEditor = editor instanceof LeafValueEditor<?>
? (LeafValueEditor<T>) editor : null;
valueAwareEditor = editor instanceof ValueAwareEditor<?>
? (ValueAwareEditor<T>) editor : null;
}
@SuppressWarnings("unchecked")
public CompositeEditor<T, ?, ?> asCompositeEditor() {
return (CompositeEditor<T, ?, ?>) compositeEditor;
}
public HasEditorDelegate<T> asHasEditorDelegate() {
return hasEditorDelegate;
}
public HasEditorErrors<T> asHasEditorErrors() {
return hasEditorErrors;
}
public LeafValueEditor<T> asLeafValueEditor() {
return leafValueEditor;
}
public ValueAwareEditor<T> asValueAwareEditor() {
return valueAwareEditor;
}
public abstract boolean canSetInModel();
public abstract T checkAssignment(Object value);
@SuppressWarnings(value = {"rawtypes", "unchecked"})
public void doTraverseSyntheticCompositeEditor(EditorVisitor visitor) {
Editor<?> sample = this.asCompositeEditor().createEditorForTraversal();
AbstractEditorDelegate subDelegate = delegate.createComposedDelegate();
delegate.addSubDelegate(subDelegate, path, sample);
delegate.getEditorChain().traverse(visitor, subDelegate);
}
public String getAbsolutePath() {
// Not delegate.getPath() since delegate might be null for a leaf editor
return path;
}
public abstract Class<T> getEditedType();
public Editor<T> getEditor() {
return editor;
}
public EditorDelegate<T> getEditorDelegate() {
return delegate;
}
public abstract T getFromModel();
public void halt() {
isHalted = true;
}
public boolean isHalted() {
return isHalted;
}
public void setEditorDelegate(AbstractEditorDelegate<T, ?> delegate) {
this.delegate = delegate;
}
public abstract void setInModel(T data);
public void traverse(EditorVisitor visitor, AbstractEditorDelegate<?, ?> next) {
if (visitor.visit(this) && next != null) {
next.accept(visitor);
}
visitor.endVisit(this);
}
public void traverseSyntheticCompositeEditor(EditorVisitor visitor) {
if (asCompositeEditor() == null) {
throw new IllegalStateException();
}
doTraverseSyntheticCompositeEditor(visitor);
}
}