/*
* Copyright (c) 2012, 2013 Hemanta Sapkota.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Hemanta Sapkota (laex.pearl@gmail.com)
*/
package com.laex.cg2d.screeneditor.editparts.tree;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.RootEditPart;
import org.eclipse.gef.TreeEditPart;
import org.eclipse.gef.editparts.AbstractTreeEditPart;
import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import com.laex.cg2d.model.model.Layer;
import com.laex.cg2d.model.model.ModelElement;
import com.laex.cg2d.model.model.Shape;
import com.laex.cg2d.model.model.ShapesDiagram;
/**
* The Class ScreenTreeEP.
*/
public class ScreenTreeEP extends AbstractTreeEditPart implements PropertyChangeListener {
/**
* Instantiates a new screen tree ep.
*
* @param model
* the model
*/
public ScreenTreeEP(ShapesDiagram model) {
super(model);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#activate()
*/
public void activate() {
if (!isActive()) {
super.activate();
((ModelElement) getModel()).addPropertyChangeListener(this);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#deactivate()
*/
public void deactivate() {
if (isActive()) {
super.deactivate();
((ModelElement) getModel()).removePropertyChangeListener(this);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
*/
@Override
protected List<?> getModelChildren() {
Object[] arr = getCastedModel().getLayers().toArray();
/* Add the layers in reverse order for displaying in the correct order in Tree Editpart view. */
List<Layer> reverseList = new ArrayList<Layer>();
for (int i=arr.length - 1; i>=0; i--) {
reverseList.add((Layer) arr[i]);
}
return reverseList;
}
/**
* Gets the casted model.
*
* @return the casted model
*/
private ShapesDiagram getCastedModel() {
return (ShapesDiagram) getModel();
}
/**
* Gets the edits the part for child.
*
* @param child
* the child
* @return the edits the part for child
*/
private EditPart getEditPartForChild(Object child) {
return (EditPart) getViewer().getEditPartRegistry().get(child);
}
/*
* (non-Javadoc)
*
* @see
* java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent
* )
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
if (ShapesDiagram.CHILD_ADDED_PROP.equals(prop) || ShapesDiagram.LAYER_ADDED.equals(prop)) {
// add a child to this edit part
addChild(createChild(evt.getNewValue()), -1);
} else if (ShapesDiagram.CHILD_REMOVED_PROP.equals(prop) || ShapesDiagram.LAYER_REMOVED.equals(prop)) {
// remove a child from this edit part
EditPart ep = getEditPartForChild(evt.getNewValue());
if (ep != null) {
removeChild(ep);
}
} else {
refreshVisuals();
}
}
/* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractEditPart#removeChild(org.eclipse.gef.EditPart)
*/
@Override
protected void removeChild(EditPart child) {
/* Special treatment for removing ShapeTreeEP */
if (child instanceof ShapeTreeEP) {
int index = child.getParent().getChildren().indexOf(child);
fireRemovingChild(child, index);
if (isActive())
child.deactivate();
child.removeNotify();
removeChildVisual(child);
child.getParent().getChildren().remove(child);
child.setParent(null);
}
super.removeChild(child);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.gef.editparts.AbstractTreeEditPart#addChildVisual(org.eclipse
* .gef.EditPart, int)
*/
@Override
protected void addChildVisual(EditPart childEditPart, int index) {
Widget widget = getWidget();
TreeItem item = null;
if (childEditPart.getModel() instanceof Layer) {
Tree t = (Tree) widget;
int trueIndex = index;
if (trueIndex >= t.getItemCount()) {
trueIndex = (t.getItemCount() == 0) ? 0 : t.getItemCount() - 1;
}
item = new TreeItem(t, 0, trueIndex);
}
// If it is shape model, then we put it inside its layer
Object model = childEditPart.getModel();
if (model instanceof Shape) {
Shape shpM = (Shape) childEditPart.getModel();
Layer layer = shpM.getParentLayer();
LayerTreeEP ltep = (LayerTreeEP) getViewer().getEditPartRegistry().get(layer);
int trueIndex = (ltep.getChildren().size() == 0) ? 0 : ltep.getChildren().size() - 1;
item = new TreeItem((TreeItem) ltep.getWidget(), 0, (trueIndex <= 0) ? 0 : trueIndex);
}
((TreeEditPart) childEditPart).setWidget(item);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractTreeEditPart#createEditPolicies()
*/
@Override
protected void createEditPolicies() {
if (getParent() instanceof RootEditPart) {
installEditPolicy(EditPolicy.COMPONENT_ROLE, new RootComponentEditPolicy());
}
}
}