/******************************************************************************* * 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.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.eclipse.draw2d.*; import org.eclipse.draw2d.geometry.PointList; import org.jboss.tools.common.model.ui.dnd.DnDUtil; import org.eclipse.gef.AccessibleEditPart; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartListener; import org.eclipse.gef.EditPolicy; 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.Image; import org.jboss.tools.common.meta.action.XAction; import org.jboss.tools.common.model.XModelException; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.gef.GEFGraphicalViewer; 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.jsf.ui.JsfUiPlugin; import org.jboss.tools.jsf.ui.JsfUIMessages; import org.jboss.tools.jsf.ui.editor.JSFEditor; import org.jboss.tools.jsf.ui.editor.figures.ConnectionFigure; import org.jboss.tools.jsf.ui.editor.figures.FigureFactory; import org.jboss.tools.jsf.ui.editor.model.ILink; import org.jboss.tools.jsf.ui.editor.model.ILinkListener; public class LinkEditPart extends AbstractConnectionEditPart implements PropertyChangeListener, ILinkListener, EditPartListener { public static final Image icon = ImageDescriptor.createFromFile( JSFEditor.class, "icons/shortcut.gif").createImage(); //$NON-NLS-1$ AccessibleEditPart acc; private boolean shortcut; private CustomLocator shortcutLocator; private GEFLabel shortcutLabel; private CustomLocator pathLocator; private GEFLabel pathLabel; public void activate() { super.activate(); getLink().addPropertyChangeListener(this); addEditPartListener(this); } public void activateFigure() { super.activateFigure(); getFigure().addPropertyChangeListener( Connection.PROPERTY_CONNECTION_ROUTER, this); } public void doDoubleClick(boolean cf) { try { XModelObject s = (XModelObject) getLinkModel().getSource(); XAction action = DnDUtil.getEnabledAction(s, null, "Properties.Properties"); //$NON-NLS-1$ if (action != null) action.executeHandler(s, null); } catch (XModelException e) { JsfUiPlugin.getPluginLog().logError(e); } } public void doMouseDown(boolean cf) { } public void doMouseUp(boolean cf) { if(!(getTarget() instanceof GroupEditPart)) return; GroupEditPart g = (GroupEditPart)getTarget(); if (cf && getLink().isShortcut()) { ((GEFGraphicalViewer) getViewer()).getGEFEditor() .getModelSelectionProvider().setSelection( new StructuredSelection(g.getGroupModel().getSource())); } } /** * Adds extra EditPolicies as required. */ protected void createEditPolicies() { installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE, new LinkEndpointEditPolicy()); installEditPolicy(EditPolicy.CONNECTION_ROLE, new LinkEditPolicy()); } protected IFigure createFigure() { if (getLink() == null) return null; ConnectionFigure conn = FigureFactory.createNewBendableWire(this, getLink()); PointList list = getLink().getPointList(); if (list.size() > 0) { conn.setManual(true); conn.setOldPoints(list.getFirstPoint(), list.getLastPoint()); conn.setPoints(list); } pathLabel = new GEFLabel(getLink().getLinkName(), FigureFactory.normalColor); pathLabel.setFont(getLink().getJSFModel().getOptions() .getLinkPathFont()); 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 = ""; //$NON-NLS-1$ if (getLink().getJSFModel().getOptions().showShortcutPath() && getLink().getToGroup() != null) text = getLink().getToGroup().getVisiblePath(); shortcutLabel = new GEFLabel(text, FigureFactory.normalColor); if (getLink().getJSFModel().getOptions().showShortcutIcon()) shortcutLabel.setIcon(icon); shortcutLabel.setFont(getLink().getJSFModel().getOptions() .getLinkPathFont()); 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 ILink getLinkModel() { return (ILink) getModel(); } public void save() { PointList list = ((ConnectionFigure) getFigure()).getPoints(); getLink().savePointList(list); } public void clear() { getLink().clearPointList(); } public void deactivate() { removeEditPartListener(this); getLink().removePropertyChangeListener(this); super.deactivate(); } 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 = JsfUIMessages.LinkEditPart_Link; } }; return acc; } protected ILink getLink() { return (ILink) 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 setModel(Object model) { super.setModel(model); ((ILink) model).addLinkListener(this); shortcut = getLink().isShortcut(); } public boolean isLinkListenerEnable() { return true; } public void linkChange(ILink source) { pathLabel.setText(getLink().getLinkName()); if (getLinkModel().getJSFModel().getOptions().showShortcutPath() && getLink().getToGroup() != null) shortcutLabel.setText(getLink().getToGroup().getVisiblePath()); else shortcutLabel.setText(""); //$NON-NLS-1$ if (getLinkModel().getJSFModel().getOptions().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); } else { getLinkFigure().remove(shortcutLabel); getLinkFigure().add(pathLabel, pathLocator); } refresh(); } if (getLinkFigure().isManual() && getLink().getPathFromModel().equals("")) { //$NON-NLS-1$ getLinkFigure().setManual(false); refresh(); } else if (!getLinkFigure().isManual() && !getLink().getPathFromModel().equals("")) { //$NON-NLS-1$ getLinkFigure().setManual(true); refresh(); } } public void linkRemove(ILink source) { getLink().removeLinkListener(this); } 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) { ((GEFRootEditPart) getParent()).setToFront(this); } } }