/*
* (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.Vector;
import java.util.logging.Logger;
import org.openflexo.antar.binding.BindingModel;
import org.openflexo.antar.binding.BindingVariable;
import org.openflexo.foundation.viewpoint.ViewPoint.ViewPointBuilder;
import org.openflexo.foundation.viewpoint.binding.EditionSchemeParameterListPathElement;
import org.openflexo.foundation.viewpoint.binding.GraphicalElementPathElement;
import org.openflexo.foundation.viewpoint.binding.PatternRolePathElement;
import org.openflexo.foundation.viewpoint.binding.ViewPointDataBinding;
import org.openflexo.logging.FlexoLogger;
import org.openflexo.toolbox.StringUtils;
/**
* An EditionScheme represents a behavioural feature attached to an EditionPattern
*
* @author sylvain
*
*/
public abstract class EditionScheme extends EditionSchemeObject implements ActionContainer {
protected BindingModel _bindingModel;
//
protected static final Logger logger = FlexoLogger.getLogger(EditionScheme.class.getPackage().getName());
public static final String TOP_LEVEL = "topLevel";
public static final String TARGET = "target";
public static final String FROM_TARGET = "fromTarget";
public static final String TO_TARGET = "toTarget";
public static final String THIS = "this";
public static enum EditionSchemeType {
CreationScheme, DropScheme, LinkScheme, ActionScheme, NavigationScheme, DeletionScheme, CloningScheme
}
private String name;
private String label;
private String description;
private Vector<EditionAction> actions;
private Vector<EditionSchemeParameter> parameters;
private boolean skipConfirmationPanel = false;
private EditionPattern _editionPattern;
private boolean definePopupDefaultSize = false;
private int width = 800;
private int height = 600;
public EditionScheme(ViewPointBuilder builder) {
super(builder);
actions = new Vector<EditionAction>();
parameters = new Vector<EditionSchemeParameter>();
}
@Override
public String getFullyQualifiedName() {
return (getEditionPattern() != null ? getEditionPattern().getFullyQualifiedName() : "null") + "." + getName();
}
@Override
public String getURI() {
return getEditionPattern().getURI() + "." + getName();
}
@Override
public EditionScheme getEditionScheme() {
return this;
}
public abstract EditionSchemeType getEditionSchemeType();
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
public String getLabel() {
if (label == null || StringUtils.isEmpty(label) || label.equals(name)) {
return getName();
}
return label;
}
public void setLabel(String label) {
this.label = label;
}
@Override
public EditionPattern getEditionPattern() {
return _editionPattern;
}
public void setEditionPattern(EditionPattern editionPattern) {
_editionPattern = editionPattern;
updateBindingModels();
}
@Override
public String getDescription() {
return description;
}
@Override
public void setDescription(String description) {
this.description = description;
}
/*public EditionAction getAction(PatternRole role) {
for (EditionAction a : getActions()) {
if (a.getPatternRole() == role) {
return a;
}
}
return null;
}*/
@Override
public Vector<EditionAction> getActions() {
return actions;
}
@Override
public void setActions(Vector<EditionAction> actions) {
this.actions = actions;
setChanged();
notifyObservers();
}
@Override
public void addToActions(EditionAction action) {
// action.setScheme(this);
action.setActionContainer(this);
actions.add(action);
setChanged();
notifyObservers();
notifyChange("actions", null, actions);
}
@Override
public void removeFromActions(EditionAction action) {
// action.setScheme(null);
action.setActionContainer(null);
actions.remove(action);
setChanged();
notifyObservers();
notifyChange("actions", null, actions);
}
@Override
public int getIndex(EditionAction action) {
return actions.indexOf(action);
}
@Override
public void insertActionAtIndex(EditionAction action, int index) {
// action.setScheme(this);
action.setActionContainer(this);
actions.insertElementAt(action, index);
setChanged();
notifyObservers();
notifyChange("actions", null, actions);
}
@Override
public void actionFirst(EditionAction a) {
actions.remove(a);
actions.insertElementAt(a, 0);
setChanged();
notifyObservers();
}
@Override
public void actionUp(EditionAction a) {
int index = actions.indexOf(a);
if (index > 0) {
actions.remove(a);
actions.insertElementAt(a, index - 1);
setChanged();
notifyObservers();
}
}
@Override
public void actionDown(EditionAction a) {
int index = actions.indexOf(a);
if (index > -1) {
actions.remove(a);
actions.insertElementAt(a, index + 1);
setChanged();
notifyObservers();
}
}
@Override
public void actionLast(EditionAction a) {
actions.remove(a);
actions.add(a);
setChanged();
notifyObservers();
}
public Vector<EditionSchemeParameter> getParameters() {
return parameters;
}
public void setParameters(Vector<EditionSchemeParameter> someParameters) {
parameters = someParameters;
updateBindingModels();
}
public void addToParameters(EditionSchemeParameter parameter) {
parameter.setScheme(this);
parameters.add(parameter);
updateBindingModels();
for (EditionSchemeParameter p : parameters) {
p.notifyBindingModelChanged();
}
}
public void removeFromParameters(EditionSchemeParameter parameter) {
parameter.setScheme(null);
parameters.remove(parameter);
updateBindingModels();
}
public void parameterFirst(EditionSchemeParameter p) {
parameters.remove(p);
parameters.insertElementAt(p, 0);
setChanged();
notifyObservers();
}
public void parameterUp(EditionSchemeParameter p) {
int index = parameters.indexOf(p);
if (index > 0) {
parameters.remove(p);
parameters.insertElementAt(p, index - 1);
setChanged();
notifyObservers();
}
}
public void parameterDown(EditionSchemeParameter p) {
int index = parameters.indexOf(p);
if (index > -1) {
parameters.remove(p);
parameters.insertElementAt(p, index + 1);
setChanged();
notifyObservers();
}
}
public void parameterLast(EditionSchemeParameter p) {
parameters.remove(p);
parameters.add(p);
setChanged();
notifyObservers();
}
public EditionSchemeParameter getParameter(String name) {
if (name == null) {
return null;
}
for (EditionSchemeParameter p : parameters) {
if (name.equals(p.getName())) {
return p;
}
}
return null;
}
@Override
public ViewPoint getViewPoint() {
if (getEditionPattern() != null) {
return getEditionPattern().getViewPoint();
}
return null;
}
@Override
public AddShape createAddShapeAction() {
AddShape newAction = new AddShape(null);
if (getEditionPattern().getDefaultShapePatternRole() != null) {
newAction.setAssignation(new ViewPointDataBinding(getEditionPattern().getDefaultShapePatternRole().getPatternRoleName()));
}
addToActions(newAction);
return newAction;
}
@Override
public AddClass createAddClassAction() {
AddClass newAction = new AddClass(null);
addToActions(newAction);
return newAction;
}
@Override
public AddIndividual createAddIndividualAction() {
AddIndividual newAction = new AddIndividual(null);
addToActions(newAction);
return newAction;
}
@Override
public AddObjectPropertyStatement createAddObjectPropertyStatementAction() {
AddObjectPropertyStatement newAction = new AddObjectPropertyStatement(null);
addToActions(newAction);
return newAction;
}
@Override
public AddDataPropertyStatement createAddDataPropertyStatementAction() {
AddDataPropertyStatement newAction = new AddDataPropertyStatement(null);
addToActions(newAction);
return newAction;
}
@Override
public AddIsAStatement createAddIsAPropertyAction() {
AddIsAStatement newAction = new AddIsAStatement(null);
addToActions(newAction);
return newAction;
}
@Override
public AddRestrictionStatement createAddRestrictionAction() {
AddRestrictionStatement newAction = new AddRestrictionStatement(null);
addToActions(newAction);
return newAction;
}
@Override
public AddConnector createAddConnectorAction() {
AddConnector newAction = new AddConnector(null);
if (getEditionPattern().getDefaultConnectorPatternRole() != null) {
newAction.setAssignation(new ViewPointDataBinding(getEditionPattern().getDefaultConnectorPatternRole().getPatternRoleName()));
}
addToActions(newAction);
return newAction;
}
@Override
public DeclarePatternRole createDeclarePatternRoleAction() {
DeclarePatternRole newAction = new DeclarePatternRole(null);
addToActions(newAction);
return newAction;
}
@Override
public GraphicalAction createGraphicalAction() {
GraphicalAction newAction = new GraphicalAction(null);
addToActions(newAction);
return newAction;
}
@Override
public AddDiagram createAddDiagramAction() {
AddDiagram newAction = new AddDiagram(null);
addToActions(newAction);
return newAction;
}
@Override
public AddEditionPattern createAddEditionPatternAction() {
AddEditionPattern newAction = new AddEditionPattern(null);
addToActions(newAction);
return newAction;
}
@Override
public ConditionalAction createConditionalAction() {
ConditionalAction newAction = new ConditionalAction(null);
addToActions(newAction);
return newAction;
}
@Override
public IterationAction createIterationAction() {
IterationAction newAction = new IterationAction(null);
addToActions(newAction);
return newAction;
}
public CloneShape createCloneShapeAction() {
CloneShape newAction = new CloneShape(null);
if (getEditionPattern().getDefaultShapePatternRole() != null) {
newAction.setAssignation(new ViewPointDataBinding(getEditionPattern().getDefaultShapePatternRole().getPatternRoleName()));
}
addToActions(newAction);
return newAction;
}
public CloneConnector createCloneConnectorAction() {
CloneConnector newAction = new CloneConnector(null);
if (getEditionPattern().getDefaultConnectorPatternRole() != null) {
newAction.setAssignation(new ViewPointDataBinding(getEditionPattern().getDefaultConnectorPatternRole().getPatternRoleName()));
}
addToActions(newAction);
return newAction;
}
public CloneIndividual createCloneIndividualAction() {
CloneIndividual newAction = new CloneIndividual(null);
addToActions(newAction);
return newAction;
}
@Override
public DeleteAction createDeleteAction() {
DeleteAction newAction = new DeleteAction(null);
addToActions(newAction);
return newAction;
}
@Override
public EditionAction deleteAction(EditionAction anAction) {
removeFromActions(anAction);
anAction.delete();
return anAction;
}
public EditionSchemeParameter createURIParameter() {
EditionSchemeParameter newParameter = new URIParameter(null);
newParameter.setName("uri");
// newParameter.setLabel("uri");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createTextFieldParameter() {
EditionSchemeParameter newParameter = new TextFieldParameter(null);
newParameter.setName("textField");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createTextAreaParameter() {
EditionSchemeParameter newParameter = new TextAreaParameter(null);
newParameter.setName("textArea");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createIntegerParameter() {
EditionSchemeParameter newParameter = new IntegerParameter(null);
newParameter.setName("integer");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createCheckBoxParameter() {
EditionSchemeParameter newParameter = new CheckboxParameter(null);
newParameter.setName("checkbox");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createDropDownParameter() {
EditionSchemeParameter newParameter = new DropDownParameter(null);
newParameter.setName("dropdown");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createIndividualParameter() {
EditionSchemeParameter newParameter = new IndividualParameter(null);
newParameter.setName("individual");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createClassParameter() {
EditionSchemeParameter newParameter = new ClassParameter(null);
newParameter.setName("class");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createPropertyParameter() {
EditionSchemeParameter newParameter = new PropertyParameter(null);
newParameter.setName("property");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createObjectPropertyParameter() {
EditionSchemeParameter newParameter = new ObjectPropertyParameter(null);
newParameter.setName("property");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createDataPropertyParameter() {
EditionSchemeParameter newParameter = new DataPropertyParameter(null);
newParameter.setName("property");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createFlexoObjectParameter() {
EditionSchemeParameter newParameter = new FlexoObjectParameter(null);
newParameter.setName("flexoObject");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createListParameter() {
EditionSchemeParameter newParameter = new ListParameter(null);
newParameter.setName("list");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter createEditionPatternParameter() {
EditionSchemeParameter newParameter = new EditionPatternParameter(null);
newParameter.setName("editionPattern");
// newParameter.setLabel("label");
addToParameters(newParameter);
return newParameter;
}
public EditionSchemeParameter deleteParameter(EditionSchemeParameter aParameter) {
removeFromParameters(aParameter);
aParameter.delete();
return aParameter;
}
public void finalizeEditionSchemeDeserialization() {
updateBindingModels();
}
public boolean getSkipConfirmationPanel() {
return skipConfirmationPanel;
}
public void setSkipConfirmationPanel(boolean skipConfirmationPanel) {
this.skipConfirmationPanel = skipConfirmationPanel;
}
@Override
public BindingModel getBindingModel() {
if (_bindingModel == null) {
createBindingModel();
}
return _bindingModel;
}
@Override
public BindingModel getInferedBindingModel() {
return getBindingModel();
}
public void updateBindingModels() {
logger.fine("updateBindingModels()");
_bindingModel = null;
createBindingModel();
rebuildActionsBindingModel();
}
protected void rebuildActionsBindingModel() {
for (EditionAction action : getActions()) {
action.rebuildInferedBindingModel();
}
}
private final void createBindingModel() {
_bindingModel = new BindingModel();
_bindingModel.addToBindingVariables(new EditionSchemeParameterListPathElement(this, null));
appendContextualBindingVariables(_bindingModel);
if (getEditionPattern() != null) {
for (PatternRole pr : getEditionPattern().getPatternRoles()) {
BindingVariable<?> newPathElement = PatternRolePathElement.makePatternRolePathElement(pr, this);
_bindingModel.addToBindingVariables(newPathElement);
}
}
notifyBindingModelChanged();
}
protected void appendContextualBindingVariables(BindingModel bindingModel) {
bindingModel.addToBindingVariables(new GraphicalElementPathElement.ViewPathElement(TOP_LEVEL, null));
}
/**
* Duplicates this EditionScheme, given a new name<br>
* Newly created EditionScheme is added to parent EditionPattern
*
* @param newName
* @return
*/
public EditionScheme duplicate(String newName) {
EditionScheme newEditionScheme = (EditionScheme) cloneUsingXMLMapping();
newEditionScheme.setName(newName);
getEditionPattern().addToEditionSchemes(newEditionScheme);
return newEditionScheme;
}
public boolean getDefinePopupDefaultSize() {
return definePopupDefaultSize;
}
public void setDefinePopupDefaultSize(boolean definePopupDefaultSize) {
this.definePopupDefaultSize = definePopupDefaultSize;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}