/** * Copyright (c) 2007 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: * bblajer - initial API and implementation */ package org.eclipse.gmf.runtime.lite.edit.parts.labels; import java.text.FieldPosition; import java.text.MessageFormat; import java.text.ParsePosition; import org.eclipse.emf.ecore.EStructuralFeature; /** * An implementation of {@link ILabelTextDisplayer} that is based on a {@link MessageFormat format} and * a number of {@link EStructuralFeature structural features} of the source object. */ public class MessageFormatLabelTextDisplayer extends AbstractFeatureBasedLabelTextDisplayer { private final String myViewPattern; private final String myEditPattern; private final String myEditorPattern; private MessageFormat myViewProcessor; private MessageFormat myEditProcessor; private MessageFormat myEditorProcessor; public MessageFormatLabelTextDisplayer(String viewPattern, EStructuralFeature... features) { this(viewPattern, null, features); } public MessageFormatLabelTextDisplayer(String viewPattern, String editorPattern, EStructuralFeature... features) { this(viewPattern, editorPattern, null, features); } public MessageFormatLabelTextDisplayer(String viewPattern, String editorPattern, String editPattern, EStructuralFeature... features) { super(features); myViewPattern = viewPattern; myEditPattern = editPattern; myEditorPattern = editorPattern; } protected final MessageFormat getViewPatternProcessor() { if (myViewProcessor == null) { myViewProcessor = createViewPatternProcessor(adjustPattern(myViewPattern)); } return myViewProcessor; } protected MessageFormat createViewPatternProcessor(String viewPattern) { return new MessageFormat(viewPattern); } protected final MessageFormat getEditPatternProcessor() { if (myEditProcessor == null) { myEditProcessor = createEditPatternProcessor(adjustPattern(myEditPattern)); } return myEditProcessor; } protected MessageFormat createEditPatternProcessor(String editPattern) { return new MessageFormat(editPattern); } protected final MessageFormat getEditorPatternProcessor() { if (myEditorProcessor == null) { myEditorProcessor = createEditorPatternProcessor(adjustPattern(myEditorPattern)); } return myEditorProcessor; } protected MessageFormat createEditorPatternProcessor(String editorPattern) { return new MessageFormat(editorPattern); } protected String adjustPattern(String pattern) { if (pattern == null || pattern.length() == 0) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < getFeatures().length; i++) { if (i > 0) { sb.append(' '); } sb.append('{'); sb.append(i); sb.append('}'); } return sb.toString(); } return pattern; } @Override protected String buildDisplayText(Object[] featureValues) { return buildTextByPattern(featureValues, getViewPatternProcessor()); } @Override protected String buildEditText(Object[] featureValues) { return buildTextByPattern(featureValues, getEditorPatternProcessor()); } @Override protected Object[] parseEditedValues(String newValue) throws IllegalArgumentException { if (getEditPatternProcessor() == null) { return null; } ParsePosition pos = new ParsePosition(0); if (getFeatures().length == 1 && EMPTY_STRING.equals(newValue)) { return new Object[] {null}; } else { return getEditPatternProcessor().parse(newValue, pos); } } protected String buildTextByPattern(Object[] featureValues, MessageFormat format) { if (format == null) { return null; } return format.format(featureValues, new StringBuffer(), new FieldPosition(0)).toString(); } }