/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.foundation.viewpoint;
import java.util.List;
import java.util.Vector;
import java.util.logging.Logger;
import org.openflexo.antar.binding.BindingDefinition;
import org.openflexo.antar.binding.BindingDefinition.BindingDefinitionType;
import org.openflexo.antar.binding.TypeUtils;
import org.openflexo.foundation.validation.FixProposal;
import org.openflexo.foundation.validation.ValidationError;
import org.openflexo.foundation.validation.ValidationIssue;
import org.openflexo.foundation.validation.ValidationRule;
import org.openflexo.foundation.view.ViewConnector;
import org.openflexo.foundation.view.ViewElement;
import org.openflexo.foundation.view.ViewObject;
import org.openflexo.foundation.view.ViewShape;
import org.openflexo.foundation.view.action.EditionSchemeAction;
import org.openflexo.foundation.viewpoint.ViewPoint.ViewPointBuilder;
import org.openflexo.foundation.viewpoint.binding.ViewPointDataBinding;
public class GraphicalAction extends EditionAction {
private static final Logger logger = Logger.getLogger(GraphicalAction.class.getPackage().getName());
private GraphicalFeature<?, ?> graphicalFeature = null;
private ViewPointDataBinding value;
private BindingDefinition VALUE = new BindingDefinition("value", Object.class, BindingDefinitionType.GET, true) {
@Override
public java.lang.reflect.Type getType() {
if (getGraphicalFeature() != null) {
return getGraphicalFeature().getType();
}
return Object.class;
}
};
public GraphicalAction(ViewPointBuilder builder) {
super(builder);
}
@Override
public EditionActionType getEditionActionType() {
return EditionActionType.GraphicalAction;
}
/*@Override
public List<GraphicalElementPatternRole> getAvailablePatternRoles() {
return getEditionPattern().getPatternRoles(GraphicalElementPatternRole.class);
}*/
@Override
public String getInspectorName() {
// TODO Auto-generated method stub
return null;
}
public Object getValue(EditionSchemeAction action) {
return getValue().getBindingValue(action);
}
public BindingDefinition getValueBindingDefinition() {
return VALUE;
}
public ViewPointDataBinding getValue() {
if (value == null) {
value = new ViewPointDataBinding(this, EditionActionBindingAttribute.value, getValueBindingDefinition());
}
return value;
}
public void setValue(ViewPointDataBinding value) {
value.setOwner(this);
value.setBindingAttribute(EditionActionBindingAttribute.object);
value.setBindingDefinition(getValueBindingDefinition());
this.value = value;
}
public GraphicalFeature getGraphicalFeature() {
if (graphicalFeature == null) {
if (_graphicalFeatureName != null) {
for (GraphicalFeature<?, ?> GF : getAvailableGraphicalFeatures()) {
if (GF.getName().equals(_graphicalFeatureName)) {
return GF;
}
}
}
}
return graphicalFeature;
}
public void setGraphicalFeature(GraphicalFeature graphicalFeature) {
this.graphicalFeature = graphicalFeature;
}
private List<GraphicalFeature<?, ?>> availableFeatures = null;
/*@Override
public GraphicalElementPatternRole getPatternRole() {
try {
return super.getPatternRole();
} catch (ClassCastException e) {
logger.warning("Unexpected pattern role type");
setPatternRole(null);
return null;
}
}
@Override
public void setPatternRole(GraphicalElementPatternRole patternRole) {
System.out.println("set pattern role with " + patternRole);
super.setPatternRole(patternRole);
availableFeatures = null;
}*/
public List<GraphicalFeature<?, ?>> getAvailableGraphicalFeatures() {
if (availableFeatures == null) {
availableFeatures = new Vector<GraphicalFeature<?, ?>>();
if (getSubject().isSet() && getSubject().isValid()) {
Class accessedClass = TypeUtils.getBaseClass(getSubject().getBinding().getAccessedType());
if (ViewObject.class.isAssignableFrom(accessedClass)) {
for (GraphicalFeature<?, ?> GF : GraphicalElementPatternRole.AVAILABLE_FEATURES) {
availableFeatures.add(GF);
}
if (ViewShape.class.isAssignableFrom(accessedClass)) {
for (GraphicalFeature<?, ?> GF : ShapePatternRole.AVAILABLE_FEATURES) {
availableFeatures.add(GF);
}
}
if (ViewConnector.class.isAssignableFrom(accessedClass)) {
for (GraphicalFeature<?, ?> GF : ConnectorPatternRole.AVAILABLE_FEATURES) {
availableFeatures.add(GF);
}
}
}
}
}
return availableFeatures;
}
private String _graphicalFeatureName = null;
public String _getGraphicalFeatureName() {
if (getGraphicalFeature() == null) {
return _graphicalFeatureName;
}
return getGraphicalFeature().getName();
}
public void _setGraphicalFeatureName(String featureName) {
_graphicalFeatureName = featureName;
}
private ViewPointDataBinding subject;
private BindingDefinition SUBJECT = new BindingDefinition("subject", ViewElement.class, BindingDefinitionType.GET, true);
public BindingDefinition getSubjectBindingDefinition() {
return SUBJECT;
}
public ViewPointDataBinding getSubject() {
if (subject == null) {
subject = new ViewPointDataBinding(this, EditionActionBindingAttribute.subject, getSubjectBindingDefinition());
}
return subject;
}
public void setSubject(ViewPointDataBinding subject) {
if (subject != null) {
subject.setOwner(this);
subject.setBindingAttribute(EditionActionBindingAttribute.subject);
subject.setBindingDefinition(getSubjectBindingDefinition());
}
this.subject = subject;
}
public ViewElement getSubject(EditionSchemeAction action) {
return (ViewElement) getSubject().getBindingValue(action);
}
/*@Deprecated
public String _getPatternRoleName() {
return getSubject().toString();
}
@Deprecated
public void _setPatternRoleName(String patternRole) {
getSubject().setUnparsedBinding(patternRole);
}*/
@Override
public void notifyBindingChanged(ViewPointDataBinding binding) {
super.notifyBindingChanged(binding);
if (binding == getSubject()) {
availableFeatures = null;
}
}
@Override
public String getStringRepresentation() {
return getClass().getSimpleName() + " (" + getSubject() + "." + _getGraphicalFeatureName() + "=" + getValue() + ")";
}
public static class GraphicalActionMustHaveASubject extends ValidationRule<GraphicalActionMustHaveASubject, GraphicalAction> {
public GraphicalActionMustHaveASubject() {
super(GraphicalAction.class, "graphical_action_must_have_a_subject");
}
@Override
public ValidationIssue<GraphicalActionMustHaveASubject, GraphicalAction> applyValidation(GraphicalAction graphicalAction) {
if (graphicalAction.getSubject().isSet() && graphicalAction.getSubject().isValid()) {
return null;
} else {
Vector<FixProposal<GraphicalActionMustHaveASubject, GraphicalAction>> v = new Vector<FixProposal<GraphicalActionMustHaveASubject, GraphicalAction>>();
for (ShapePatternRole pr : graphicalAction.getEditionPattern().getShapePatternRoles()) {
v.add(new SetsPatternRoleForSubject(pr));
}
for (ConnectorPatternRole pr : graphicalAction.getEditionPattern().getConnectorPatternRoles()) {
v.add(new SetsPatternRoleForSubject(pr));
}
return new ValidationError<GraphicalActionMustHaveASubject, GraphicalAction>(this, graphicalAction,
"graphical_action_has_no_valid_subject", v);
}
}
protected static class SetsPatternRoleForSubject extends FixProposal<GraphicalActionMustHaveASubject, GraphicalAction> {
private GraphicalElementPatternRole patternRole;
public SetsPatternRoleForSubject(GraphicalElementPatternRole patternRole) {
super("set_subject_to_($patternRole.patternRoleName)");
this.patternRole = patternRole;
}
public GraphicalElementPatternRole getPatternRole() {
return patternRole;
}
@Override
protected void fixAction() {
GraphicalAction graphicalAction = getObject();
graphicalAction.setSubject(new ViewPointDataBinding(patternRole.getPatternRoleName()));
}
}
}
public static class GraphicalActionMustDefineAValue extends BindingIsRequiredAndMustBeValid<GraphicalAction> {
public GraphicalActionMustDefineAValue() {
super("'value'_binding_is_not_valid", GraphicalAction.class);
}
@Override
public ViewPointDataBinding getBinding(GraphicalAction object) {
return object.getValue();
}
@Override
public BindingDefinition getBindingDefinition(GraphicalAction object) {
return object.getValueBindingDefinition();
}
}
}