package org.jboss.tools.smooks.gef.tree.model; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.swt.graphics.Image; import org.jboss.tools.smooks.configuration.editors.xml.TagObject; import org.jboss.tools.smooks.configuration.editors.xml.TagPropertyObject; import org.jboss.tools.smooks.gef.model.AbstractSmooksGraphicalModel; import org.jboss.tools.smooks.templating.template.CollectionMapping; public class TreeNodeModel extends AbstractSmooksGraphicalModel { protected ITreeContentProvider contentProvider; protected ILabelProvider labelProvider; protected List<TreeNodeConnection> connections; public TreeNodeModel(Object data, ITreeContentProvider contentProvider, ILabelProvider labelProvider) { super(data); setContentProvider(contentProvider); setLabelProvider(labelProvider); setData(data); } public boolean hasChildren() { if (contentProvider != null && data != null) { return contentProvider.hasChildren(data); } return true; } public ITreeContentProvider getContentProvider() { return contentProvider; } public void setContentProvider(ITreeContentProvider contentProvider) { this.contentProvider = contentProvider; } public ILabelProvider getLabelProvider() { return labelProvider; } public void setLabelProvider(ILabelProvider labelProvider) { this.labelProvider = labelProvider; } protected TreeNodeModel createChildModel(Object model, ITreeContentProvider contentProvider, ILabelProvider labelProvider) { return new TreeNodeModel(model, contentProvider, labelProvider); } public List<AbstractSmooksGraphicalModel> getChildren() { if (children == null) { if (this.contentProvider != null && data != null) { Object[] models = contentProvider.getChildren(data); if (models != null) { children = new ArrayList<AbstractSmooksGraphicalModel>(); for (int i = 0; i < models.length; i++) { Object model = models[i]; TreeNodeModel n = createChildModel(model, contentProvider, labelProvider); if (n != null) { children.add(n); n.setParent(this); } } return children; } } return Collections.emptyList(); } else { if (this.contentProvider != null && data != null) { Object[] models = contentProvider.getChildren(data); if (models != null) { for (int i = 0; i < models.length; i++) { Object model = models[i]; // model = AdapterFactoryEditingDomain.unwrap(model); if (!childExsit(model)) { TreeNodeModel n = createChildModel(model, contentProvider, labelProvider); if (n != null) { children.add(n); n.setParent(this); } } } List<AbstractSmooksGraphicalModel> temp = new ArrayList<AbstractSmooksGraphicalModel>(children); for (Iterator<?> iterator = temp.iterator(); iterator.hasNext();) { AbstractSmooksGraphicalModel node = (AbstractSmooksGraphicalModel) iterator.next(); Object data = node.getData(); if (!graphicalChildExist(data, models)) { disconnectAllConnections(node); children.remove(node); node.setParent(null); } } temp.clear(); temp = null; } } } return children; } public String getText() { if (data != null && labelProvider != null) { return labelProvider.getText(data); } return ""; //$NON-NLS-1$ } public Image getImage() { if (data != null && labelProvider != null) { return labelProvider.getImage(data); } return null; } // public boolean isLinkable() { // return linkable; // } // // public void setLinkable(boolean linkable) { // this.linkable = linkable; // } public boolean canLinkWithSource(Object model) { return true; } public boolean canLinkWithTarget(Object model) { return true; } public boolean isValidValueNode() { Object unwrappedData = AdapterFactoryEditingDomain.unwrap(data); if (unwrappedData instanceof TagPropertyObject) { return true; } else if(unwrappedData instanceof TagObject) { TagObject tagObject = (TagObject) unwrappedData; return tagObject.getChildren().isEmpty(); } return false; } public boolean isValidCollectionNode() { Object unwrappedData = AdapterFactoryEditingDomain.unwrap(data); if(unwrappedData instanceof TagObject) { TagObject tagObject = (TagObject) unwrappedData; return !tagObject.getChildren().isEmpty(); } return false; } public List<TreeNodeConnection> getConnections() { if(connections == null) { connections = new ArrayList<TreeNodeConnection>(); } return connections; } public void setConnections(List<TreeNodeConnection> connections) { this.connections = connections; } protected TreeNodeConnection getConnection() { if(connections == null || connections.isEmpty()) { return null; } else if(connections.size() > 1) { throw new IllegalStateException("Invalid call to getConnection() for node that has multiple connections. May be a source node? Use getConnections()."); //$NON-NLS-1$ } return connections.get(0); } protected TreeNodeConnection getParentCollectionConnection() { AbstractSmooksGraphicalModel parentObj = getParent(); if(parentObj == null || !(parentObj instanceof TreeNodeModel)) { return null; } TreeNodeModel parentNode = (TreeNodeModel) parentObj; TreeNodeConnection parentConnection = parentNode.getConnection(); if(parentConnection != null && parentConnection.getData() instanceof CollectionMapping) { return parentConnection; } return parentNode.getParentCollectionConnection(); } // public void reAddMappingConnections(List<Mapping> removeMappings){ // if(removeMappings == null || removeMappings.isEmpty()) { // return; // } // // // Remove from all the children first... // for(AbstractSmooksGraphicalModel child : children) { // if(child instanceof TreeNodeModel) { // ((TreeNodeModel)child).reAddMappingConnections(removeMappings); // } // } // for (Mapping mapping : removeMappings) { // Object mappingObj = mapping.getMappingNode(); // if(this.data == mappingObj){ // // } // } // // Now remove from this node... // if(targetConnections != null && !targetConnections.isEmpty()) { // List<TreeNodeConnection> connectionsToAdd = new ArrayList<TreeNodeConnection>(); // for(TreeNodeConnection connection : targetConnections) { // Object connectionData = connection.getData(); // if(connectionData instanceof Mapping) { // if(removeMappings.contains(connectionData)) { // connectionsToAdd.add(connection); // } // } // } // for(TreeNodeConnection connection : connectionsToAdd) { // connection.connect(); // } // } // } // public void removeMappingConnections(List<Mapping> removeMappings) { // if(removeMappings == null || removeMappings.isEmpty()) { // return; // } // // // Remove from all the children first... // for(AbstractSmooksGraphicalModel child : children) { // if(child instanceof TreeNodeModel) { // ((TreeNodeModel)child).removeMappingConnections(removeMappings); // } // } // // // Now remove from this node... // if(targetConnections != null && !targetConnections.isEmpty()) { // List<TreeNodeConnection> connectionsToRemove = new ArrayList<TreeNodeConnection>(); // for(TreeNodeConnection connection : targetConnections) { // Object connectionData = connection.getData(); // if(connectionData instanceof Mapping) { // if(removeMappings.contains(connectionData)) { // connectionsToRemove.add(connection); // } // } // } // for(TreeNodeConnection connection : connectionsToRemove) { // connection.disconnect(); // } // } // } public void setText(String text) { // if (text != null && !text.equals(this.text)) { // String oldtext = this.text; // this.text = text; // support.firePropertyChange(PRO_TEXT_CHANGED, oldtext, this.text); // } } }