blob: b0dbee37b9fb7924bcb9cc1416c5e78e2f4bad51 [file] [log] [blame]
/*
* 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 com.google.common.collect.Sets.newHashSet;
import static com.google.eclipse.protobuf.protobuf.ModifierEnum.OPTIONAL;
import static com.google.eclipse.protobuf.protobuf.ModifierEnum.REPEATED;
import static com.google.eclipse.protobuf.protobuf.ModifierEnum.REQUIRED;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.ENUM;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.EXTENSIONS;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.GROUP;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.LITERAL;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.MESSAGE;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.OPTION;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.PACKAGE;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.RPC;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.SERVICE;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.STREAM;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.SYNTAX;
import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.TYPE_EXTENSION;
import java.util.Set;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.Keyword;
import com.google.eclipse.protobuf.grammar.CommonKeyword;
import com.google.eclipse.protobuf.protobuf.Import;
import com.google.eclipse.protobuf.protobuf.MessageField;
import com.google.eclipse.protobuf.protobuf.ModifierEnum;
import com.google.eclipse.protobuf.protobuf.Option;
import com.google.inject.Singleton;
/**
* Registry of all images used in the 'Protocol Buffer' editor.
*
* @author alruiz@google.com (Alex Ruiz)
*/
@Singleton public class Images {
private static final String IMAGE_FILE_NAME_FORMAT = "%s.gif";
private static final String DEFAULT_IMAGE = "empty.gif";
private static final Set<String> IMAGES = newHashSet();
static {
addImages(OPTIONAL, REPEATED, REQUIRED);
addImages(ENUM, TYPE_EXTENSION, EXTENSIONS, GROUP, IMPORT, LITERAL, MESSAGE, OPTION, PACKAGE, RPC, SERVICE, STREAM,
SYNTAX);
addImages("imports", "options");
}
private static void addImages(ModifierEnum...modifiers) {
for (ModifierEnum m : modifiers) {
addImage(imageNameFrom(m));
}
}
private static void addImages(EClass...eClasses) {
for (EClass c : eClasses) {
addImage(imageNameFrom(c));
}
}
private static void addImages(String...imageNames) {
for (String s : imageNames) {
addImage(s);
}
}
private static void addImage(String imageName) {
IMAGES.add(imageFileName(imageName));
}
public String imageFor(Object o) {
String imageName = null;
if (o instanceof Keyword) {
Keyword keyword = (Keyword) o;
imageName = keyword.getValue().toLowerCase();
} else if (o instanceof CommonKeyword) {
CommonKeyword keyword = (CommonKeyword) o;
imageName = keyword.toString();
} else if (o instanceof String) {
imageName = (String) o;
} else if (o instanceof MessageField) {
MessageField field = (MessageField) o;
ModifierEnum modifier = field.getModifier();
imageName = imageNameFrom(modifier);
} else if (o instanceof Option) {
imageName = imageNameFrom(OPTION);
} else if (o instanceof Import) {
imageName = imageNameFrom(IMPORT);
} else if (o instanceof EClass) {
EClass eClass = (EClass) o;
imageName = imageNameFrom(eClass);
} else if (o instanceof EObject) {
EObject modelObject = (EObject) o;
imageName = imageNameFrom(modelObject.eClass());
}
String imageFileName = null;
if (imageName != null) {
imageFileName = imageFileName(imageName);
}
return (IMAGES.contains(imageFileName)) ? imageFileName : defaultImage();
}
private static String imageNameFrom(ModifierEnum modifier) {
return modifier.getName().toLowerCase();
}
private static String imageNameFrom(EClass eClass) {
return eClass.getName().toLowerCase();
}
private static String imageFileName(String imageName) {
return String.format(IMAGE_FILE_NAME_FORMAT, imageName);
}
public String defaultImage() {
return DEFAULT_IMAGE;
}
}