/*******************************************************************************
* 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.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.ConnectionLocator;
import org.eclipse.draw2d.IFigure;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.handles.AbstractHandle;
import org.eclipse.gef.handles.ConnectionHandle;
import org.eclipse.gef.tools.ConnectionEndpointTracker;
import org.jboss.tools.jsf.ui.editor.dnd.DndHelper;
import org.jboss.tools.jsf.ui.editor.figures.FigureFactory;
import org.jboss.tools.jsf.ui.editor.model.ILink;
public class LinkEndpointEditPolicy
extends org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy {
private List JSFhandles = null;
private void addJSFHandles() {
removeJSFHandles();
JSFhandles = createJSFHandles();
IFigure layer = getLayer(LayerConstants.HANDLE_LAYER);
for (int i = 0; i < JSFhandles.size(); i++)
layer.add((IFigure) JSFhandles.get(i));
}
private void removeJSFHandles() {
if (JSFhandles == null)
return;
IFigure layer = getLayer(LayerConstants.HANDLE_LAYER);
for (int i = 0; i < JSFhandles.size(); i++)
layer.remove((IFigure) JSFhandles.get(i));
JSFhandles = null;
}
protected void addSelectionHandles() {
super.addSelectionHandles();
addJSFHandles();
getConnectionFigure().setForegroundColor(FigureFactory.selectedColor);
}
protected PolylineConnection getConnectionFigure() {
return (PolylineConnection) ((GraphicalEditPart) getHost()).getFigure();
}
protected void removeSelectionHandles() {
super.removeSelectionHandles();
removeJSFHandles();
getConnectionFigure().setForegroundColor(FigureFactory.normalColor);
}
protected List createSelectionHandles() {
List<ConnectionHandle> list = new ArrayList<ConnectionHandle>();
list.add(new LinkEndHandle((ConnectionEditPart) getHost()));
list.add(new LinkStartHandle((ConnectionEditPart) getHost()));
return list;
}
protected List createJSFHandles() {
List<AbstractHandle> list = new ArrayList<AbstractHandle>();
PolylineConnection conn = getConnectionFigure();
boolean flag = true;
for (int i = 0; i < conn.getPoints().size() - 3; i++) {
if (flag)
flag = false;
else
flag = true;
list.add(new JSFConnectionHandle((ConnectionEditPart) getHost(),
flag, i + 1));
}
return list;
}
class LinkEndHandle extends ConnectionHandle {
public LinkEndHandle(ConnectionEditPart owner) {
setOwner(owner);
setLocator(new ConnectionLocator(getConnection(),
ConnectionLocator.TARGET));
}
public LinkEndHandle(ConnectionEditPart owner, boolean fixed) {
super(fixed);
setOwner(owner);
setLocator(new ConnectionLocator(getConnection(),
ConnectionLocator.TARGET));
}
public LinkEndHandle() {
}
protected DragTracker createDragTracker() {
if (isFixed())
return null;
ConnectionEndpointTracker tracker;
tracker = new LinkEndpointTracker((ConnectionEditPart) getOwner());
tracker.setCommandName(RequestConstants.REQ_RECONNECT_TARGET);
tracker.setDefaultCursor(getCursor());
return tracker;
}
}
class LinkStartHandle extends ConnectionHandle {
public LinkStartHandle(ConnectionEditPart owner) {
setOwner(owner);
setLocator(new ConnectionLocator(getConnection(),
ConnectionLocator.SOURCE));
}
public LinkStartHandle(ConnectionEditPart owner, boolean fixed) {
super(fixed);
setOwner(owner);
setLocator(new ConnectionLocator(getConnection(),
ConnectionLocator.SOURCE));
}
public LinkStartHandle() {
}
protected DragTracker createDragTracker() {
if (isFixed())
return null;
ConnectionEndpointTracker tracker;
tracker = new LinkEndpointTracker((ConnectionEditPart) getOwner());
tracker.setCommandName(RequestConstants.REQ_RECONNECT_SOURCE);
tracker.setDefaultCursor(getCursor());
return tracker;
}
}
class LinkEndpointTracker extends ConnectionEndpointTracker {
public LinkEndpointTracker(ConnectionEditPart cpart) {
super(cpart);
}
public void mouseDown(MouseEvent me, EditPartViewer epv) {
super.mouseDown(me, epv);
removeJSFHandles();
DndHelper.drag(((ILink) getHost().getModel()).getSource());
}
public void mouseUp(MouseEvent me, EditPartViewer epv) {
super.mouseUp(me, epv);
if (getHost().getSelected() != EditPart.SELECTED_NONE)
addJSFHandles();
}
protected boolean handleNativeDragFinished(DragSourceEvent event) {
DndHelper.dragEnd();
return false;
}
}
}