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