/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.editor.edit;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.*;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.jboss.tools.common.model.ui.dnd.DnDUtil;
import org.eclipse.gef.*;
import org.eclipse.gef.requests.DropRequest;
import org.eclipse.swt.accessibility.AccessibleControlEvent;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.jboss.tools.common.meta.action.XAction;
import org.jboss.tools.common.model.XModelException;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.jsf.ui.JsfUiPlugin;
import org.jboss.tools.jsf.ui.editor.figures.GroupFigure;
import org.jboss.tools.jsf.ui.editor.figures.NodeFigure;
import org.jboss.tools.jsf.ui.editor.model.IGroup;
import org.jboss.tools.jsf.ui.editor.model.IGroupListener;
import org.jboss.tools.jsf.ui.editor.model.ILink;
import org.jboss.tools.jsf.ui.editor.model.IPage;
public class GroupEditPart extends JSFEditPart implements PropertyChangeListener, IGroupListener, EditPartListener {
private GroupFigure fig = null;
private boolean single = true;
public boolean isSingle() {
return single;
}
public void doControlUp() {
}
public void doControlDown() {
}
public void doMouseHover(boolean cf) {
}
public void doDoubleClick(boolean cf) {
try {
XAction action = DnDUtil.getEnabledAction(
(XModelObject) getGroupModel().getSource(), null,
"OpenPage"); //$NON-NLS-1$
if (action != null)
action.executeHandler((XModelObject) getGroupModel()
.getSource(), null);
} catch (XModelException e) {
JsfUiPlugin.getPluginLog().logError(e);
}
}
public void setModel(Object model) {
super.setModel(model);
((IGroup) model).addPropertyChangeListener(this);
((IGroup) model).addGroupListener(this);
addEditPartListener(this);
if (getGroupModel().getPageList().size() <= 1)
single = true;
else
single = false;
layoutPages();
}
public void childAdded(EditPart child, int index) {
}
public void partActivated(EditPart editpart) {
}
public void partDeactivated(EditPart editpart) {
}
public void removingChild(EditPart child, int index) {
}
public void selectedStateChanged(EditPart editpart) {
if (this.getSelected() == EditPart.SELECTED_PRIMARY) {
((JSFDiagramEditPart) GroupEditPart.this.getParent())
.setToFront(this);
}
}
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("name")) { //$NON-NLS-1$
fig.setPath(getGroupModel().getVisiblePath());
} else if (evt.getPropertyName().equals("path")) { //$NON-NLS-1$
fig.setPath(getGroupModel().getVisiblePath());
} else if (evt.getPropertyName().equals("selected")) { //$NON-NLS-1$
} else if (evt.getPropertyName().equals("shape")) { //$NON-NLS-1$
refreshVisuals();
}
}
public boolean isGroupListenerEnable() {
return true;
}
public void groupChange() {
layoutPages();
refresh();
fig.setIcon(getGroupModel().getImage());
fig.refreshFont();
fig.repaint();
}
public void pageAdd(IGroup group, IPage page) {
if (getGroupModel().getPageList().size() > 1) {
if (single) {
single = false;
}
layoutPages();
refresh();
}
}
public void pageRemove(IGroup group, IPage page) {
if (getGroupModel().getPageList().size() == 1 && !single) {
fig.init(getGroupModel().getListOutputLinks().size());
single = true;
}
layoutPages();
refresh();
}
public void pageChange(IGroup group, IPage page, PropertyChangeEvent evet) {
layoutPages();
refresh();
}
public void linkAdd(IPage page, ILink link) {
layoutPages();
if (single) {
fig
.addConnectionAnchor(getGroupModel().getListOutputLinks()
.size());
}
refreshTargetLink(link);
refresh();
}
private void refreshTargetLink(ILink link) {
if (link == null)
return;
GroupEditPart gep = (GroupEditPart) getViewer().getEditPartRegistry()
.get(link.getToGroup());
if (gep == null)
return;
gep.refreshTargetConnections();
}
public void linkRemove(IPage page, ILink link) {
layoutPages();
refresh();
if (single) {
fig.removeConnectionAnchor();
}
refreshTargetLink(link);
refresh();
}
public void linkChange(IPage page, ILink link, PropertyChangeEvent evet) {
refresh();
}
protected AccessibleEditPart createAccessible() {
return new AccessibleGraphicalEditPart() {
public void getName(AccessibleEvent e) {
e.result = "EditPart"; //$NON-NLS-1$
}
public void getValue(AccessibleControlEvent e) {
}
};
}
protected List getModelTargetConnections() {
return getGroupModel().getListInputLinks();
}
protected List getModelSourceConnections() {
if (single) {
return getGroupModel().getListOutputLinks();
} else {
return Collections.EMPTY_LIST;
}
}
protected void createEditPolicies() {
super.createEditPolicies();
installEditPolicy(EditPolicy.NODE_ROLE, null);
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
installEditPolicy(EditPolicy.COMPONENT_ROLE, new GroupEditPolicy());
installEditPolicy(EditPolicy.LAYOUT_ROLE, new JSFFlowEditPolicy());
installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE,
new GroupEditPolicy());
}
/**
* Returns a newly created Figure to represent this.
*
* @return Figure of this.
*/
protected IFigure createFigure() {
fig = new GroupFigure(getGroupModel());
((GroupFigure) fig).setGroupEditPart(this);
return fig;
}
public GroupFigure getGroupFigure() {
return (GroupFigure) getFigure();
}
/**
* Returns the model of this as a LED.
*
* @return Model of this as an LED.
*/
public IGroup getGroupModel() {
return (IGroup) getModel();
}
Dimension size;
public void layoutPages() {
size = new Dimension();
int start = 0;
int height;
size.width = 50;
size.height = 23;
if (getGroupModel().isPattern()) {
size.width += 3;
start += 3;
}
IPage page;
for (int i = 0; i < getGroupModel().getPageList().size(); i++) {
page = (IPage) getGroupModel().getPageList().get(i);
height = page.getLinkList().size() * NodeFigure.LINK_HEIGHT - 1;
if (page.getLinkList().size() == 0)
height = NodeFigure.LINK_HEIGHT - 1;
if (getGroupModel().isPattern())
page.setBounds(start, size.height, size.width - 6, height);
else
page.setBounds(start, size.height, size.width - 3, height);
size.height += height + 1;
}
size.height += 2;
if (getGroupModel().isPattern()) {
size.height += 1;
}
}
protected void refreshVisuals() {
Point loc = getGroupModel().getPosition();
loc.x -= loc.x % 8;
loc.y -= loc.y % 8;
Rectangle r = new Rectangle(loc, size);
((GraphicalEditPart) getParent()).setLayoutConstraint(this,
getFigure(), r);
}
public ConnectionAnchor getTargetConnectionAnchor(
ConnectionEditPart connEditPart) {
ConnectionAnchor anc = getNodeFigure().getConnectionAnchor("1_IN"); //$NON-NLS-1$
return anc;
}
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
Point pt = new Point(((DropRequest) request).getLocation());
return getNodeFigure().getTargetConnectionAnchorAt(pt);
}
public ConnectionAnchor getSourceConnectionAnchor(
ConnectionEditPart connEditPart) {
if (single) {
ILink link = (ILink) connEditPart.getModel();
int index = getGroupModel().getListOutputLinks().indexOf(link);
return getNodeFigure().getConnectionAnchor((index + 1) + "_OUT"); //$NON-NLS-1$
} else
return super.getSourceConnectionAnchor(connEditPart);
}
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
if (single) {
Point pt = new Point(((DropRequest) request).getLocation());
return getNodeFigure().getSourceConnectionAnchorAt(pt);
} else
return super.getSourceConnectionAnchor(request);
}
protected List getModelChildren() {
return (single) ? Collections.EMPTY_LIST : getGroupModel()
.getPageList().getElements();
}
protected void refreshChildren() {
super.refreshChildren();
for (int i = 0; i < getChildren().size(); i++) {
((PageEditPart) getChildren().get(i)).refresh();
}
}
}