/*******************************************************************************
* 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.beans.PropertyChangeListener;
import java.util.List;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.FigureUtilities;
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.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.gef.AccessibleEditPart;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartListener;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.requests.DirectEditRequest;
import org.eclipse.gef.requests.DropRequest;
import org.eclipse.swt.accessibility.AccessibleControlEvent;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.jboss.tools.common.model.event.XModelTreeEvent;
import org.jboss.tools.common.model.event.XModelTreeListener;
import org.jboss.tools.common.model.options.PreferenceModelUtilities;
import org.jboss.tools.seam.pages.xml.model.SeamPagesPreference;
import org.jboss.tools.seam.ui.pages.editor.ecore.pages.Link;
import org.jboss.tools.seam.ui.pages.editor.ecore.pages.PageException;
import org.jboss.tools.seam.ui.pages.editor.figures.ExceptionFigure;
import org.jboss.tools.seam.ui.pages.editor.figures.NodeFigure;
import org.jboss.tools.seam.ui.pages.editor.figures.xpl.CompressNameUtil;
public class ExceptionEditPart extends PagesEditPart implements PropertyChangeListener, EditPartListener,
Adapter, XModelTreeListener {
private NodeFigure fig = null;
private boolean single = true;
public boolean isSingle() {
return single;
}
public void doControlUp() {
}
public void doControlDown() {
}
public void doMouseHover(boolean cf) {
}
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) {
((PagesDiagramEditPart) ExceptionEditPart.this.getParent())
.setToFront(this);
}
}
public boolean isGroupListenerEnable() {
return true;
}
private void refreshTargetLink(Link link) {
if (link == null)
return;
ExceptionEditPart gep = (ExceptionEditPart) getViewer().getEditPartRegistry()
.get(link.getToElement());
if (gep == null)
return;
gep.refreshTargetConnections();
}
protected AccessibleEditPart createAccessible() {
return new AccessibleGraphicalEditPart() {
public void getName(AccessibleEvent e) {
e.result = "EditPart";
}
public void getValue(AccessibleControlEvent e) {
}
};
}
protected List getModelTargetConnections() {
return getExceptionModel().getInputLinks();
}
protected List getModelSourceConnections() {
return getExceptionModel().getOutputLinks();
}
public void performRequest(Request req) {
if (req.getType() == GraphicalPartFactory.REQ_INIT_EDIT) {
new ViewIDEditManager(this, new ViewIDEditorLocator(
(ExceptionFigure) getFigure())).show();
}
}
protected void createEditPolicies() {
super.createEditPolicies();
installEditPolicy(EditPolicy.NODE_ROLE, null);
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
new ViewIDDirectEditPolicy());
}
public void nodeChanged(XModelTreeEvent event){
String path = event.getModelObject().getPath();
if(path.equals(SeamPagesPreference.SEAM_PAGES_EDITOR_PATH)){
NodeFigure.nodeLabelFont = SeamPagesPreference.getFont(SeamPagesPreference.VIEW_PATH_FONT.getValue(), NodeFigure.nodeLabelFont);
refreshVisuals();
}
}
public void structureChanged(XModelTreeEvent event){
}
/**
* Returns a newly created Figure to represent this.
*
* @return Figure of this.
*/
protected IFigure createFigure() {
fig = new ExceptionFigure(getExceptionModel());
((ExceptionFigure) fig).setEditPart(this);
return fig;
}
/**
* Returns the model of this as a LED.
*
* @return Model of this as an LED.
*/
public PageException getExceptionModel() {
return (PageException) getModel();
}
Dimension size;
/** This returns the label to use when rendering the Exception in a readonly view.
* Converts org.model.Exception to o.m.Exception to save visual space
**/
String getExceptionReadOnlyLabel() {
if(getElementModel()==null || getElementModel().getName() == null) {
return "Unknown Exception";
} else {
return CompressNameUtil.getCompressedName(getElementModel().getName());
}
}
protected void refreshVisuals() {
Point loc = getExceptionModel().getLocation();
String text = getExceptionReadOnlyLabel();
int width = getIconWidth()+FigureUtilities.getTextExtents(text, NodeFigure.nodeLabelFont).width;
if(width < getMinimumWidth()) width = getMinimumWidth();
size = new Dimension(width, getVisualHeight());
adjustForGrid(loc);
Rectangle r = new Rectangle(loc, size);
((GraphicalEditPart) getParent()).setLayoutConstraint(this,
getFigure(), r);
}
private int getMinimumWidth() {
return 130;
}
private int getVisualHeight() {
return 21;
}
private int getIconWidth() {
return 30;
}
public ConnectionAnchor getTargetConnectionAnchor(
ConnectionEditPart connEditPart) {
ConnectionAnchor anc = getNodeFigure().getConnectionAnchor("1_IN");
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) {
Link link = (Link) connEditPart.getModel();
int index = getExceptionModel().getOutputLinks().indexOf(link);
return getNodeFigure().getConnectionAnchor((index + 1) + "_OUT");
} 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 getExceptionModel().getChildren();
}
protected void refreshChildren() {
super.refreshChildren();
for (int i = 0; i < getChildren().size(); i++) {
((ExceptionEditPart) getChildren().get(i)).refresh();
}
}
/**
* @see org.eclipse.gef.EditPart#activate()
*/
public void activate() {
if (isActive())
return;
((Notifier) getModel()).eAdapters().add(this);
PreferenceModelUtilities.getPreferenceModel().addModelTreeListener(this);
super.activate();
if("<initialize>".equals(getExceptionModel().getName())){
getExceptionModel().setName("");
DirectEditRequest req = new DirectEditRequest();
req.setType(GraphicalPartFactory.REQ_INIT_EDIT);
performRequest(req);
}
}
public void deactivate(){
if (!isActive())
return;
((Notifier) getModel()).eAdapters().remove(this);
PreferenceModelUtilities.getPreferenceModel().removeModelTreeListener(this);
super.deactivate();
}
/**
* @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
*/
public void notifyChanged(Notification notification) {
refresh();
refreshVisuals();
getFigure().repaint();
}
/**
* )
*
* @see org.eclipse.emf.common.notify.Adapter#getTarget()
*/
public Notifier getTarget() {
return null;
}
/**
* @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
*/
public boolean isAdapterForType(Object type) {
return false;
}
/**
* @see org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse.emf.common.notify.Notifier)
*/
public void setTarget(Notifier newTarget) {
}
}