/* * Copyright (c) 2014 Google Inc. * * 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 */ package com.google.eclipse.protobuf.ui.labeling; import static com.google.eclipse.protobuf.ui.labeling.Messages.unresolved; import static org.eclipse.jface.viewers.StyledString.DECORATIONS_STYLER; import com.google.eclipse.protobuf.model.util.Imports; import com.google.eclipse.protobuf.model.util.MessageFields; import com.google.eclipse.protobuf.model.util.Options; import com.google.eclipse.protobuf.naming.NameResolver; import com.google.eclipse.protobuf.protobuf.AbstractCustomOption; import com.google.eclipse.protobuf.protobuf.AbstractOption; import com.google.eclipse.protobuf.protobuf.ExtensibleTypeLink; import com.google.eclipse.protobuf.protobuf.Extensions; import com.google.eclipse.protobuf.protobuf.Import; import com.google.eclipse.protobuf.protobuf.IndexRange; import com.google.eclipse.protobuf.protobuf.IndexedElement; import com.google.eclipse.protobuf.protobuf.Literal; import com.google.eclipse.protobuf.protobuf.MessageField; import com.google.eclipse.protobuf.protobuf.MessageLink; import com.google.eclipse.protobuf.protobuf.OptionField; import com.google.eclipse.protobuf.protobuf.Rpc; import com.google.eclipse.protobuf.protobuf.Stream; import com.google.eclipse.protobuf.protobuf.TypeExtension; import com.google.inject.Inject; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.StyledString; /** * Registry of commonly used text in the 'Protocol Buffer' editor. * * @author alruiz@google.com (Alex Ruiz) */ public class Labels { @Inject private Imports imports; @Inject private MessageFields messageFields; @Inject private NameResolver nameResolver; @Inject private Options options; public Object labelFor(Object o) { if (o instanceof AbstractOption) { AbstractOption option = (AbstractOption) o; return labelFor(option); } if (o instanceof Extensions) { Extensions extensions = (Extensions) o; return labelFor(extensions); } if (o instanceof Import) { Import anImport = (Import) o; return labelFor(anImport); } if (o instanceof Literal) { Literal literal = (Literal) o; return labelFor(literal); } if (o instanceof MessageField) { MessageField field = (MessageField) o; return labelFor(field); } if (o instanceof Rpc) { Rpc rpc = (Rpc) o; return labelFor(rpc); } if (o instanceof Stream) { Stream stream = (Stream) o; return labelFor(stream); } if (o instanceof TypeExtension) { TypeExtension extension = (TypeExtension) o; return labelFor(extension); } if (o instanceof EObject) { return nameResolver.nameOf((EObject) o); } return null; } private Object labelFor(AbstractOption option) { IndexedElement e = options.rootSourceOf(option); String name = options.nameForOption(e); if (option instanceof AbstractCustomOption) { AbstractCustomOption customOption = (AbstractCustomOption) option; StringBuilder b = new StringBuilder(); b.append(formatCustomOptionElement(name)); for (OptionField field : options.fieldsOf(customOption)) { IndexedElement source = field.getTarget(); String sourceName = options.nameForOption(source); b.append(".") .append(formatCustomOptionElement(sourceName)); } return b.toString(); } return name; } private String formatCustomOptionElement(String name) { return String.format("(%s)", name); } private Object labelFor(Extensions extensions) { StringBuilder builder = new StringBuilder(); EList<IndexRange> ranges = extensions.getRanges(); int rangeCount = ranges.size(); for (int i = 0; i < rangeCount; i++) { if (i > 0) { builder.append(", "); } IndexRange range = ranges.get(i); builder.append(range.getFrom()); String to = range.getTo(); if (to != null) { builder.append(" > ").append(to); } } return builder.toString(); } private Object labelFor(Import anImport) { return imports.getPath(anImport); } private Object labelFor(Literal literal) { StyledString text = new StyledString(nameResolver.nameOf(literal)); String index = String.format(" [%d]", literal.getIndex()); text.append(index, DECORATIONS_STYLER); return text; } private Object labelFor(MessageField field) { StyledString text = new StyledString(nameResolver.nameOf(field)); String typeName = messageFields.typeNameOf(field); if (typeName == null) { typeName = unresolved; } String indexAndType = String.format(" [%d] : %s", field.getIndex(), typeName); text.append(indexAndType, DECORATIONS_STYLER); return text; } private Object labelFor(Rpc rpc) { StyledString text = new StyledString(nameResolver.nameOf(rpc)); String types = String.format(" : %s > %s", nameOf(rpc.getArgType()), nameOf(rpc.getReturnType())); text.append(types, DECORATIONS_STYLER); return text; } private Object labelFor(Stream stream) { StyledString text = new StyledString(nameResolver.nameOf(stream)); String types = String.format(" (%s, %s)", nameOf(stream.getClientMessage()), nameOf(stream.getServerMessage())); text.append(types, DECORATIONS_STYLER); return text; } private String nameOf(MessageLink link) { return nameOf(link.getTarget()); } private Object labelFor(TypeExtension extension) { ExtensibleTypeLink type = extension.getType(); return nameOf(type.getTarget()); } private String nameOf(EObject e) { String name = (e == null) ? null : nameResolver.nameOf(e); return (name == null) ? unresolved : name; } }