/******************************************************************************* * 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.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.eclipse.draw2d.ArrowLocator; import org.eclipse.draw2d.Connection; import org.eclipse.draw2d.ConnectionLocator; import org.eclipse.draw2d.FreeformViewport; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.PolygonDecoration; import org.eclipse.draw2d.geometry.PointList; 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.EditPart; import org.eclipse.gef.EditPartListener; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.gef.editparts.AbstractConnectionEditPart; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.accessibility.AccessibleEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.jboss.tools.common.gef.edit.GEFRootEditPart; import org.jboss.tools.common.gef.figures.GEFLabel; import org.jboss.tools.common.gef.figures.xpl.CustomLocator; import org.jboss.tools.common.model.XModelObject; 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.common.model.util.XModelUtil; import org.jboss.tools.seam.pages.xml.model.SeamPagesPreference; import org.jboss.tools.seam.ui.pages.editor.PagesEditor; import org.jboss.tools.seam.ui.pages.editor.PagesEditor.ModelSelectionProvider; 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.ecore.pages.PagesElement; import org.jboss.tools.seam.ui.pages.editor.figures.ConnectionFigure; import org.jboss.tools.seam.ui.pages.editor.figures.FigureFactory; public class LinkEditPart extends AbstractConnectionEditPart implements PropertyChangeListener, EditPartListener, XModelTreeListener { private static final Image icon = ImageDescriptor.createFromFile( PagesEditor.class, "icons/shortcut.gif").createImage(); private static final Font pathFont = SeamPagesPreference.getFont(SeamPagesPreference.LINK_PATH_FONT.getValue(), null); AccessibleEditPart acc; PagesEditor editor; private boolean shortcut; private CustomLocator shortcutLocator; private GEFLabel shortcutLabel; private CustomLocator pathLocator; private GEFLabel pathLabel; private PageEditPart pagePart = null; public void setEditor(PagesEditor editor){ this.editor = editor; } private boolean showShortcutPath(){ return SeamPagesPreference.SHOW_SHORTCUT_PATH.getValue().equals("yes"); } private boolean showShortcutIcon(){ return SeamPagesPreference.SHOW_SHORTCUT_ICON.getValue().equals("yes"); } public void activate() { if (!isActive()) { ((Notifier) getModel()).eAdapters().add(adapter); } super.activate(); addEditPartListener(this); PreferenceModelUtilities.getPreferenceModel().addModelTreeListener(this); Page page=null; if(getLinkModel().getFromElement() instanceof Page) page = (Page)getLinkModel().getFromElement(); if(page != null){ //pagePart = (PageEditPart)getViewer().getEditPartRegistry().get(page); if(pagePart != null){ getLinkFigure().setVisible(false); pagePart.addEditPartListener(this); } } } public void activateFigure() { super.activateFigure(); getFigure().addPropertyChangeListener( Connection.PROPERTY_CONNECTION_ROUTER, this); } /** * Adds extra EditPolicies as required. */ protected void createEditPolicies() { installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new LinkEndpointEditPolicy()); installEditPolicy(EditPolicy.CONNECTION_ROLE, new LinkEditPolicy()); } PolygonDecoration arrow; protected IFigure createFigure() { if (getLink() == null) return null; ConnectionFigure conn = FigureFactory.createNewBendableWire(this, getLink()); arrow = (PolygonDecoration)conn.getChildren().get(0); if (getLink().isShortcut()) conn.remove(arrow); PointList list = getLink().getPointList(); if (list.size() > 0) { conn.setManual(true); conn.setOldPoints(list.getFirstPoint(), list.getLastPoint()); conn.setPoints(list); //conn.repaint(); } pathLabel = new GEFLabel(getLink().getName(), FigureFactory.normalColor); pathLabel.setFont(pathFont); pathLabel.setIcon(null); pathLabel.setTextAlignment(Label.LEFT); pathLabel.setLabelAlignment(Label.LEFT); pathLocator = new CustomLocator(conn, false); pathLocator.setUDistance(5); pathLocator.setVDistance(-13); if (!getLink().isShortcut()) conn.add(pathLabel, pathLocator); String text = ""; if (showShortcutPath()) if(getLink().getToElement() != null) text = getLink().getToElement().getName(); shortcutLabel = new GEFLabel(text, FigureFactory.normalColor); if (showShortcutIcon()) shortcutLabel.setIcon(icon); shortcutLabel.setFont(pathFont); shortcutLabel.setTextAlignment(Label.LEFT); shortcutLabel.setLabelAlignment(Label.LEFT); shortcutLabel.setIconAlignment(Label.LEFT); shortcutLocator = new CustomLocator(conn, false); shortcutLocator.setUDistance(18); shortcutLocator.setVDistance(-6); if (getLink().isShortcut()) conn.add(shortcutLabel, shortcutLocator); return conn; } public Link getLinkModel() { return (Link) getModel(); } public void save() { PointList list = ((ConnectionFigure) getFigure()).getPoints(); getLink().savePointList(list); } public void clear() { getLink().clearPointList(); } public void deactivate() { if(pagePart != null) pagePart.removeEditPartListener(this); removeEditPartListener(this); PreferenceModelUtilities.getPreferenceModel().removeModelTreeListener(this); if (isActive()) { ((Notifier) getModel()).eAdapters().remove(this); } super.deactivate(); } public void nodeChanged(XModelTreeEvent event){ String path = event.getModelObject().getPath(); if(path.equals(SeamPagesPreference.SEAM_PAGES_EDITOR_PATH)){ linkChange(getLink()); } } public void structureChanged(XModelTreeEvent event){ } public void deactivateFigure() { getFigure().removePropertyChangeListener( Connection.PROPERTY_CONNECTION_ROUTER, this); super.deactivateFigure(); } public AccessibleEditPart getAccessibleEditPart() { if (acc == null) acc = new AccessibleGraphicalEditPart() { public void getName(AccessibleEvent e) { e.result = "Link"; } }; return acc; } protected Link getLink() { return (Link) getModel(); } protected ConnectionFigure getLinkFigure() { return (ConnectionFigure) getFigure(); } public void propertyChange(PropertyChangeEvent event) { String property = event.getPropertyName(); if ("value".equals(property)) //$NON-NLS-1$ refreshVisuals(); } /** * Refreshes the visual aspects of this, based upon the model (Wire). It * changes the wire color depending on the state of Wire. * */ protected void refreshVisuals() { } public void performRequest(Request req) { if (RequestConstants.REQ_OPEN.equals(req.getType())) { if(getLink().isShortcut()){ PagesElement element = getLink().getToElement(); if(element == null) return; PagesEditPart part = (PagesEditPart)editor.getScrollingGraphicalViewer().getEditPartRegistry().get(element); if(part == null) return; Object[] sel = new Object[1]; sel[0] = part; StructuredSelection newSelection = new StructuredSelection(sel); editor.getScrollingGraphicalViewer().setSelection(newSelection); PagesDiagramEditPart diagram = (PagesDiagramEditPart) editor.getScrollingGraphicalViewer() .getRootEditPart().getChildren().get(0); FreeformViewport vp = diagram.getFreeformViewport(); ((ModelSelectionProvider)editor.getModelSelectionProvider()).scroll(vp, part.getNodeFigure()); }else{ XModelUtil.openProperyDialog((XModelObject)getLink().getData()); } } } public void setModel(Object model) { super.setModel(model); //((ILink) model).addLinkListener(this); shortcut = getLink().isShortcut(); } public boolean isLinkListenerEnable() { return true; } public void linkChange(Link source) { pathLabel.setFont(SeamPagesPreference.getFont(SeamPagesPreference.LINK_PATH_FONT.getValue(), pathFont)); pathLabel.setText(getLink().getName()); if (showShortcutPath()){ shortcutLabel.setFont(SeamPagesPreference.getFont(SeamPagesPreference.LINK_PATH_FONT.getValue(), pathFont)); if(getLink().getToElement() != null) shortcutLabel.setText(getLink().getToElement().getName()); else shortcutLabel.setText(""); }else shortcutLabel.setText(""); if (showShortcutIcon()) shortcutLabel.setIcon(icon); else shortcutLabel.setIcon(null); getLinkFigure().refreshFont(); if (shortcut != getLink().isShortcut()) { shortcut = getLink().isShortcut(); if (shortcut) { getLinkFigure().add(shortcutLabel, shortcutLocator); getLinkFigure().remove(pathLabel); getLinkFigure().remove(arrow); } else { getLinkFigure().remove(shortcutLabel); getLinkFigure().add(pathLabel, pathLocator); getLinkFigure().add(arrow, new ArrowLocator(getLinkFigure(), ConnectionLocator.TARGET)); } refresh(); } } 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(editpart == pagePart){ if(pagePart.getSelected() == EditPart.SELECTED_PRIMARY){ getFigure().setVisible(true); }else getFigure().setVisible(false); } if (editpart == this && this.getSelected() == EditPart.SELECTED_PRIMARY) { ((GEFRootEditPart) getParent()).setToFront(this); } } Adapter adapter = new AdapterImpl(); class AdapterImpl implements Adapter { /** * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification) */ public void notifyChanged(Notification notification) { linkChange(getLink()); pathLabel.setText(getLinkModel().getName()); if (getLinkFigure().isManual() && getLink().getPathFromModel().equals("")) { getLinkFigure().setManual(false); clear(); } else if (!getLinkFigure().isManual() && !getLink().getPathFromModel().equals("")) { getLinkFigure().setManual(true); } PointList list = getLink().getPointList(); if(list.size() == 0)((ConnectionFigure)figure).setManual(false); refresh(); refreshVisuals(); ((ConnectionFigure)figure).layout(); } /** * ) * * @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) { } } }