blob: 15eb0fb0256149eb5758faa9fd113f8b9645f531 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2005 Sybase, Inc. and others.
*
* 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.RelativeBendpoint;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.editparts.AbstractConnectionEditPart;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkBendpointEditPolicy;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkEditPolicy;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkEndpointEditPolicy;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PFLinkFigure;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowLinkPropertySource;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.views.properties.IPropertySource;
/**
* <code>PFLinkEditPart</code> is the EditPart for PFLink model elements. The
* figure for this EditPart is simply a PolylineConnection. Because both
* AbstractConnectionEditPart and the Adapter interface have a getTarget method,
* we use an inner class to implement the Adapter interface in order to work
* around the name collision.
*
*
*/
public class PageflowLinkEditPart extends AbstractConnectionEditPart implements
IConnectionPreference, IAnnotationEditPart, PFValidator {
/** adapter for notification */
private PFLinkAdapter adapter = new PFLinkAdapter();
/** property source of the pflink */
private IPropertySource propertySource = null;
/** image description for different edit part */
public static final ImageDescriptor IMG_WARNING = EditorPlugin.getDefault()
.getImageDescriptor("facesconfig/Pageflow_Quickfix_Error.gif");
private int connectionStyle = -1;
private PFLinkBendpointEditPolicy bendpointEditPolicy;
/**
* @param element
*/
public PageflowLinkEditPart(PageflowLink element) {
super();
// element.getPageflow()
setModel(element);
}
/*
* (non-Javadoc)
*
* @see AbstractGraphicalEditPart#createFigure()
*/
protected IFigure createFigure() {
IFigure figure_ = new PFLinkFigure();
return figure_;
}
/*
* (non-Javadoc)
*
* @see AbstractEditPart#createEditPolicies()
*/
protected void createEditPolicies() {
installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE,
new PFLinkEndpointEditPolicy());
if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
getBendpointEditPolicy());
}
//PFLinkEditPolicy policy = new PFLinkEditPolicy();
// policy.setSseModel(model);
installEditPolicy(EditPolicy.CONNECTION_ROLE, new PFLinkEditPolicy());
}
private PFLinkBendpointEditPolicy getBendpointEditPolicy() {
if (bendpointEditPolicy == null) {
bendpointEditPolicy = new PFLinkBendpointEditPolicy();
}
return bendpointEditPolicy;
}
public PageflowLink getPFLink() {
return (PageflowLink) getModel();
}
private class PFLinkAdapter extends PFBatchAdapter {
private Notifier _newTarget = null;
// private IPropertySource _propertySource = null;
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.common.notify.Adapter#getTarget()
*/
public Notifier getTarget() {
return _newTarget;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
*/
public boolean isAdapterForType(Object type) {
return getModel().getClass() == type;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
*/
public void doNotifyChanged(Notification notification) {
int type = notification.getEventType();
int featureId = notification.getFeatureID(PageflowPackage.class);
// FC2PFTransformer.getInstance().NotifyChanged(notification,
// getPFLink());
switch (type) {
case Notification.ADD:
case Notification.ADD_MANY:
case Notification.REMOVE:
case Notification.SET:
if (featureId == PageflowPackage.PF_LINK__OUTCOME
|| featureId == PageflowPackage.PF_LINK__SOURCE
|| featureId == PageflowPackage.PF_LINK__TARGET) {
PageflowAnnotationUtil
.validateLink(PageflowLinkEditPart.this);
}
refreshVisuals();
break;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse.emf.common.notify.Notifier)
*/
public void setTarget(Notifier newTarget) {
this._newTarget = newTarget;
}
}
/*
* (non-Javadoc)
*
* @see EditPart#activate()
*/
public void activate() {
getPFLink().eAdapters().add(adapter);
//PageflowLink element = (PageflowLink) getModel();
super.activate();
}
/*
* (non-Javadoc)
*
* @see EditPart#deactivate()
*/
public void deactivate() {
// getPFLink().eAdapters().remove(adapter);
// PageflowLink element = (PageflowLink) getModel();
// NavigationCaseType navCase = ((NavigationCaseType) element
// .getFCElements().getData().get(0));
// navCase.eAdapters().remove(fcAdapter);
// TreeIterator iterator = navCase.eAllContents();
// while (iterator.hasNext()) {
// ((EObject) iterator.next()).eAdapters().remove(fcAdapter);
// }
super.deactivate();
}
/*
* (non-Javadoc)
*
* @see IAdaptable#getAdapter(java.lang.Class)
*/
public Object getAdapter(Class key) {
/*
* override the default behavior defined in AbstractEditPart which would
* expect the model to be a property sourced. instead the editpart can
* provide a property source
*/
if (key == IPropertySource.class) {
return getPropertySource();
}
return super.getAdapter(key);
}
/*
* (non-Javadoc)
*
* @see PageflowElementEditPart#getPropertySource()
*/
protected IPropertySource getPropertySource() {
if (propertySource == null) {
propertySource = new PageflowLinkPropertySource(getPFLink());
}
return propertySource;
}
/*
* (non-Javadoc)
*
* @see AbstractEditPart#refreshVisuals()
*/
protected void refreshVisuals() {
super.refreshVisuals();
resetLabel();
if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
refreshBendpoints();
}
}
/**
* set the bendpoint constraints of the pflink connection
*
*/
protected void refreshBendpoints() {
// bendpoints stored in pflink
List modelConstraint = getPFLink().getBendPoints();
// bendpoint constraint list
List figureConstraint = new ArrayList();
for (int i = 0; i < modelConstraint.size(); i++) {
PageflowLinkBendpoint wbp = (PageflowLinkBendpoint) modelConstraint
.get(i);
RelativeBendpoint rbp = new RelativeBendpoint(getConnectionFigure());
rbp.setRelativeDimensions(wbp.getFirstRelativeDimension(), wbp
.getSecondRelativeDimension());
rbp.setWeight((i + 1) / ((float) modelConstraint.size() + 1));
figureConstraint.add(rbp);
}
// set the router constaints.
getConnectionFigure().setRoutingConstraint(figureConstraint);
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLineWidth(int)
*/
public void setLineWidth(int w) {
((PFLinkFigure) getFigure()).setLineWidth(w);
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelVisible(boolean)
*/
public void setLabelVisible(boolean b) {
((PFLinkFigure) getFigure()).setLabelVisible(b);
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
*/
public void setForegroundColor(Color c) {
((PFLinkFigure) getFigure()).setForegroundColor(c);
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
*/
public void setBackgroundColor(Color c) {
((PFLinkFigure) getFigure()).setBackgroundColor(c);
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
*/
public void setFont(Font f) {
((PFLinkFigure) getFigure()).setFont(f);
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelForeground(org.eclipse.swt.graphics.Color)
*/
public void setLabelForegroundColor(Color c) {
((PFLinkFigure) getFigure()).setLabelForegroundColor(c);
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelBackground(org.eclipse.swt.graphics.Color)
*/
public void setLabelBackgroundColor(Color c) {
((PFLinkFigure) getFigure()).setLabelBackgroundColor(c);
}
private boolean needDrawingLabel() {
return (((PageflowLink) getModel()).getOutcome() != null && ((PageflowLink) getModel())
.getOutcome().trim().length() > 0);
}
private boolean needDrawingAction() {
return (((PageflowLink) getModel()).getFromaction() != null && ((PageflowLink) getModel())
.getFromaction().trim().length() > 0);
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#decorateEditPart()
*/
public void addAnnotation(final Annotation annotation) {
getViewer().getControl().getDisplay().asyncExec(new Runnable() {
public void run() {
((PFLinkFigure) getFigure()).setImage(getImage(IMG_WARNING));
((PFLinkFigure) getFigure()).setToolTipText(annotation
.getText());
}
});
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#undecorateEditPart()
*/
public void removeAnnotation() {
getViewer().getControl().getDisplay().asyncExec(new Runnable() {
public void run() {
((PFLinkFigure) getFigure()).clearIcon();
resetLabel();
}
});
}
public void resetLabel() {
StringBuffer tip = new StringBuffer();
if (needDrawingAction()) {
((PFLinkFigure) getFigure()).setActionImage();
tip.append(PageflowMessages.PageflowLinkEditPart_FromAction).append(
((PageflowLink) getModel()).getFromaction());
} else if (((PFLinkFigure) getFigure()).getImage() != getImage(IMG_WARNING)) {
((PFLinkFigure) getFigure()).clearIcon();
}
if (needDrawingLabel()) {
((PFLinkFigure) getFigure()).setLabel(((PageflowLink) getModel())
.getOutcome());
if (tip.length() > 0)
tip.append("\n");
tip.append(PageflowMessages.PageflowLinkEditPart_FromOutcome).append(
((PageflowLink) getModel()).getOutcome());
} else {
((PFLinkFigure) getFigure()).clearOutcome();
}
((PFLinkFigure) getFigure()).setToolTipText(tip.toString());
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.marker.IEditPartMarker#getMarkerResource()
*
*/
public IResource getMarkerResource() {
// IResource resource = null;
// if (getModel() instanceof PFLink)
// {
// resource =
// FacesConfigUtil.getFacesConfigResource(((PFLink)getModel()).getPageflow());
// }
// FIXME: it should be changed to link to faces-config file.
IResource resource = WebrootUtil.getResource((EObject) getModel());
return resource;
}
public static Image getImage(ImageDescriptor imageDescriptor) {
Image image = EditorPlugin.getDefault().getImageRegistry().get(
imageDescriptor.toString());
if (null == image) {
EditorPlugin.getDefault().getImageRegistry().put(
imageDescriptor.toString(), imageDescriptor);
image = EditorPlugin.getDefault().getImageRegistry().get(
imageDescriptor.toString());
}
return image;
}
/*
* (non-Javadoc)
*
* @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setConnectionRouterStyle(int)
*/
public void setConnectionRouterStyle(int style) {
connectionStyle = style;
if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
getBendpointEditPolicy());
refreshVisuals();
} else {
removeEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE);
refreshVisuals();
}
}
/**
* get the foreground color from preference
*
*/
public int getConnectionRouterStyle() {
if (this.connectionStyle == -1) {
IPreferenceStore store = EditorPlugin.getDefault()
.getPreferenceStore();
String connectionStyle_ = store
.getString(GEMPreferences.LINE_ROUTING);
if (GEMPreferences.LINE_ROUTING_MANHATTAN.equals(connectionStyle_)) {
this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANHATTAN;
} else {
this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANUAL;
}
}
return this.connectionStyle;
}
public void validate() {
PageflowAnnotationUtil.validateLink(this);
}
}