package org.eclipse.uml2.diagram.sequence.parsers;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand;
import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
import org.eclipse.gmf.runtime.common.ui.services.parser.ParserEditStatus;
import org.eclipse.gmf.runtime.emf.ui.services.parser.ISemanticParser;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.uml2.diagram.sequence.model.SDModelAccess;
import org.eclipse.uml2.diagram.sequence.model.sdnotation.SDModelStorageStyle;
import org.eclipse.uml2.diagram.sequence.model.sdnotation.SDNotationPackage;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDAbstractMessage;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDModel;
import org.eclipse.uml2.uml.Message;
import org.eclipse.uml2.uml.UMLPackage;
public class MessageNumberParser implements ISemanticParser {
public boolean areSemanticElementsAffected(EObject listener, Object notification) {
if (false == notification instanceof Notification){
return false;
}
Notification change = (Notification)notification;
Object feature = change.getFeature();
return isAffectingFeature(feature);
}
@SuppressWarnings("unchecked")
public List getSemanticElementsBeingParsed(EObject element) {
View view = (View)element;
Message umlMessage = (Message) view.getElement();
List result = new LinkedList();
result.add(umlMessage);
View interactionView = SDModelAccess.findInteractionView(view);
if (interactionView != null){
result.add(interactionView);
SDModelStorageStyle sdModelAccessor = SDModelAccess.findSDModelAccessor(interactionView);
if (sdModelAccessor != null){
result.add(sdModelAccessor);
}
}
return result;
}
public String getEditString(IAdaptable element, int flags) {
return "";
}
public ICommand getParseCommand(IAdaptable element, String newString, int flags) {
return UnexecutableCommand.INSTANCE;
}
public String getPrintString(IAdaptable element, int flags) {
View view = (View) element.getAdapter(View.class);
if (view == null){
return "Error";
}
Message umlMessage = (Message)view.getElement();
SDModel sdModel = SDModelAccess.findSDModel(view);
StringBuilder result = new StringBuilder();
if (sdModel != null){
SDAbstractMessage sdMessage = sdModel.getUMLTracing().findMessage(umlMessage);
if (sdMessage != null){
String number = sdMessage.getMessageNumber();
if (number == null){
number = "(?)";
}
result.append(number).append(": ");
}
}
// String name = umlMessage.getName();
// if (name == null){
// name = "";
// }
// result.append(name);
result.append("* ");
return result.toString();
}
public IParserEditStatus isValidEditString(IAdaptable element, String editString) {
return ParserEditStatus.UNEDITABLE_STATUS;
}
public IContentAssistProcessor getCompletionProcessor(IAdaptable element) {
// TODO Auto-generated method stub
return null;
}
public final boolean isAffectingEvent(Object event, int flags) {
return isAffectingEvent(event);
}
protected boolean isAffectingEvent(Object event){
if (event instanceof Notification) {
Object feature = ((Notification) event).getFeature();
return isAffectingFeature(feature);
}
return false;
}
private boolean isAffectingFeature(Object feature){
return //
feature == UMLPackage.eINSTANCE.getNamedElement_Name() || //
feature == SDNotationPackage.eINSTANCE.getSDModelStorageStyle_Version() ||
feature == NotationPackage.eINSTANCE.getView_Styles();
}
}