Package com.google.eclipse.protobuf.ui.labeling

Source Code of com.google.eclipse.protobuf.ui.labeling.Labels

/*
* Copyright (c) 2011 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 org.eclipse.jface.viewers.StyledString.DECORATIONS_STYLER;

import static com.google.eclipse.protobuf.ui.labeling.Messages.unresolved;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.StyledString;

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.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.Range;
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;

/**
* 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<Range> ranges = extensions.getRanges();
    int rangeCount = ranges.size();
    for (int i = 0; i < rangeCount; i++) {
      if (i > 0) {
        builder.append(", ");
      }
      Range 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.uriAsEnteredByUser(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;
  }
}
TOP

Related Classes of com.google.eclipse.protobuf.ui.labeling.Labels

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.