/*******************************************************************************
* 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.seam.ui.pages.editor.edit;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.ConnectionLocator;
import org.eclipse.draw2d.IFigure;
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.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.events.MouseEvent;
import org.jboss.tools.jst.web.model.ReferenceObject;
import org.jboss.tools.seam.ui.pages.editor.dnd.DndHelper;
import org.jboss.tools.seam.ui.pages.editor.ecore.pages.Link;
import org.jboss.tools.seam.ui.pages.editor.ecore.pages.Page;
import org.jboss.tools.seam.ui.pages.editor.figures.ConnectionFigure;
import org.jboss.tools.seam.ui.pages.editor.figures.FigureFactory;
public class LinkEndpointEditPolicy
extends org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy {
private List handles = null;
private void addPagesHandles() {
removePagesHandles();
handles = createHandles();
IFigure layer = getLayer(LayerConstants.HANDLE_LAYER);
for (int i = 0; i < handles.size(); i++)
layer.add((IFigure) handles.get(i));
}
private void removePagesHandles() {
if (handles == null)
return;
IFigure layer = getLayer(LayerConstants.HANDLE_LAYER);
for (int i = 0; i < handles.size(); i++)
layer.remove((IFigure) handles.get(i));
handles = null;
}
protected void addSelectionHandles() {
Page page=null;
Link link = ((LinkEditPart)getHost()).getLinkModel();
if(link != null && link.getFromElement() instanceof Page)
page = (Page)link.getFromElement();
if(page != null && page.getData() != null && page.getData() instanceof ReferenceObject && ((ReferenceObject)page.getData()).getReference() == null){
}else
super.addSelectionHandles();
addPagesHandles();
getConnectionFigure().setForegroundColor(FigureFactory.selectedColor);
}
protected ConnectionFigure getConnectionFigure() {
return (ConnectionFigure) ((GraphicalEditPart) getHost()).getFigure();
}
protected void removeSelectionHandles() {
super.removeSelectionHandles();
removePagesHandles();
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 createHandles() {
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 PagesConnectionHandle((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);
removePagesHandles();
DndHelper.drag(((Link) getHost().getModel()).getData());
}
public void mouseUp(MouseEvent me, EditPartViewer epv) {
super.mouseUp(me, epv);
if (getHost().getSelected() != EditPart.SELECTED_NONE)
addPagesHandles();
}
protected boolean handleNativeDragFinished(DragSourceEvent event) {
DndHelper.dragEnd();
return false;
}
}
}