/*
* Copyright (c) 2006 Borland Software Corporation
*
* 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:
* Tatiana Fesenko (Borland) - initial API and implementation
*/
package org.eclipse.uml2.diagram.clazz.parser;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;
import org.eclipse.uml2.diagram.clazz.parsers.MessageFormatParser;
import org.eclipse.uml2.uml.UMLPackage;
import org.eclipse.uml2.uml.VisibilityKind;
public class NamedElementParser extends MessageFormatParser {
private static final String PUBLIC = ""; //$NON-NLS-1$
private static final String PROTECTED = "#"; //$NON-NLS-1$
private static final String PRIVATE = "-"; //$NON-NLS-1$
private static final String PACKAGE = "~"; //$NON-NLS-1$
private static final EAttribute[] ourFeatures = new EAttribute[] { UMLPackage.eINSTANCE.getNamedElement_Visibility(), UMLPackage.eINSTANCE.getNamedElement_Name() };
public NamedElementParser() {
super(ourFeatures);
setViewPattern("{0}{1}"); //$NON-NLS-1$
// edit pattern contains space to separate name from visibility
setEditPattern("{0} {1}"); //$NON-NLS-1$
}
@Override
public String getPrintString(IAdaptable adapter, int flags) {
//duplicated to be available in tests
return super.getPrintString(adapter, flags);
}
@Override
protected Object getValue(EObject element, EAttribute feature) {
Object value = element.eGet(feature);
if (UMLPackage.eINSTANCE.getNamedElement_Visibility().equals(feature)) {
return getVisibilityLiteral((VisibilityKind) value);
}
// name will be processed in the superclass method
return super.getValue(element, feature);
}
@Override
protected Object getValidNewValue(EAttribute feature, Object value) {
if (UMLPackage.eINSTANCE.getNamedElement_Visibility().equals(feature)) {
return getVisibilityKind((String) value);
}
// name will be processed in the superclass method
return super.getValidNewValue(feature, value);
}
@Override
public ICommand getParseCommand(IAdaptable adapter, String newString, int flags) {
newString = getParsableEditString(newString);
return super.getParseCommand(adapter, newString, flags);
}
@Override
public IParserEditStatus isValidEditString(IAdaptable adapter, String editString) {
editString = getParsableEditString(editString);
return super.isValidEditString(adapter, editString);
}
private String getParsableEditString(String editString) {
if (editString == null || editString.length() == 0) {
return editString;
}
if (editString.startsWith(PROTECTED) || editString.startsWith(PRIVATE) || editString.startsWith(PACKAGE)) {
StringBuffer result = new StringBuffer();
result.append(editString.charAt(0));
if (editString.length() > 1) {
result.append(" ");
result.append(editString.substring(1).trim());
}
return result.toString();
}
//"ClassName" can't be parsed by "{0} {1}", but " ClassName" is parsable
editString = " " + editString.trim();
return editString;
}
private static String getVisibilityLiteral(VisibilityKind visibility) {
switch (visibility.getValue()) {
case VisibilityKind.PACKAGE:
return PACKAGE;
case VisibilityKind.PRIVATE:
return PRIVATE;
case VisibilityKind.PROTECTED:
return PROTECTED;
case VisibilityKind.PUBLIC:
return PUBLIC;
}
throw new IllegalArgumentException("Unknown visibility : " + visibility);
}
private Object getVisibilityKind(String visibility) {
visibility = visibility.trim();
if (PACKAGE.equals(visibility)) {
return VisibilityKind.PACKAGE_LITERAL;
}
if (PRIVATE.equals(visibility)) {
return VisibilityKind.PRIVATE_LITERAL;
}
if (PROTECTED.equals(visibility)) {
return VisibilityKind.PROTECTED_LITERAL;
}
if (PUBLIC.equals(visibility)) {
return VisibilityKind.PUBLIC_LITERAL;
}
return new InvalidValue("Unknown visibility sign: " + visibility);
}
}