/** * Copyright (c) 2011 committers of YAKINDU 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: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.base.gmf.runtime.editparts; import static org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR; import org.eclipse.draw2d.IFigure; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.Request; import org.eclipse.gef.tools.DirectEditManager; import org.eclipse.gmf.runtime.common.ui.services.parser.IParser; import org.eclipse.gmf.runtime.common.ui.services.parser.ParserOptions; import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.LabelEditPart; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.label.ILabelDelegate; import org.eclipse.gmf.runtime.diagram.ui.label.WrappingLabelDelegate; import org.eclipse.gmf.runtime.diagram.ui.tools.TextDirectEditManager; import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel; import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter; import org.eclipse.gmf.runtime.notation.ShapeStyle; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.jface.viewers.ICellEditorValidator; import org.eclipse.swt.graphics.Color; import org.yakindu.base.gmf.runtime.parsers.StringAttributeParser; import org.yakindu.base.xtext.utils.gmf.figures.HighlightingWrappingLabel; /** * This is a common abstract base class for all {@link LabelEditPart} which are * {@link ITextAwareEditPart}. * * This edit part is only to be used for external labels, i.e. Connection * labels. For Labels inside of a Figure use {@link TextAwareLabelEditPart} * * @author andreas muelder * */ public abstract class TextAwareExternalLabelEditPart extends LabelEditPart implements ITextAwareEditPart { private final DirectEditManager manager; private final EAttribute feature; private final String pluginId; public TextAwareExternalLabelEditPart(View view, EAttribute feature, String pluginId) { super(view); this.feature = feature; this.pluginId = pluginId; manager = createDirectEditManager(); } private void updateLabelText() { getWrappingLabel().setText(getEditText()); } @Override public void activate() { super.activate(); updateLabelText(); } protected DirectEditManager createDirectEditManager() { return new TextDirectEditManager(this); } @Override public Object getAdapter(@SuppressWarnings("rawtypes") Class key) { if (key.equals(ILabelDelegate.class)) { WrappingLabel wrappingLabel = getWrappingLabel(); if (wrappingLabel == null) return super.getAdapter(key); return new WrappingLabelDelegate(wrappingLabel); } return super.getAdapter(key); } @Override protected void createDefaultEditPolicies() { super.createDefaultEditPolicies(); installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy()); // TODO: Add a Feedback role } @Override protected void refreshVisuals() { super.refreshVisuals(); refreshFont(); refreshFontColor(); } @Override protected void setFontColor(Color color) { getWrappingLabel().setForegroundColor(color); } public String getEditText() { return getParser().getEditString( new EObjectAdapter(resolveSemanticElement()), -1); } public void setLabelText(String text) { getWrappingLabel().setText(text); } private WrappingLabel getWrappingLabel() { return (WrappingLabel) getFigure(); } @Override protected IFigure createFigure() { return new HighlightingWrappingLabel(); } public ICellEditorValidator getEditTextValidator() { return null; } public ParserOptions getParserOptions() { return ParserOptions.NONE; } public IParser getParser() { return new StringAttributeParser(feature, pluginId); } public IContentAssistProcessor getCompletionProcessor() { return null; } @Override protected void performDirectEditRequest(Request request) { final Request theRequest = request; try { getEditingDomain().runExclusive(new Runnable() { public void run() { if (isActive()) { if (theRequest.getExtendedData().get( REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character && manager instanceof TextDirectEditManager) { Character initialChar = (Character) theRequest .getExtendedData() .get(REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR); ((TextDirectEditManager) manager).show(initialChar); } else { manager.show(); } } } }); } catch (InterruptedException e) { e.printStackTrace(); } } // We want to get notified about changes to the primary view, the refresh // the visuals when the parent Shape style changes. @Override protected void addNotationalListeners() { super.addNotationalListeners(); addListenerFilter("parentview", this, getPrimaryView()); } @Override protected void removeNotationalListeners() { super.removeNotationalListeners(); removeListenerFilter("parentview"); } @Override protected void handleNotificationEvent(Notification event) { if (event.getFeature() == feature) { updateLabelText(); } if (event.getNotifier() instanceof ShapeStyle) { refreshVisuals(); } super.handleNotificationEvent(event); } }