Fixed: [ Issue 41 ] Reduce noise in Outline View https://code.google.com/p/protobuf-dt/issues/detail?id=41 Imports and Options are grouped into parent nodes that are collapsed by default.
diff --git a/com.google.eclipse.protobuf.ui/icons/imports.gif b/com.google.eclipse.protobuf.ui/icons/imports.gif new file mode 100644 index 0000000..b0e9130 --- /dev/null +++ b/com.google.eclipse.protobuf.ui/icons/imports.gif Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/icons/option.gif b/com.google.eclipse.protobuf.ui/icons/option.gif index 9d8c615..557ea83 100644 --- a/com.google.eclipse.protobuf.ui/icons/option.gif +++ b/com.google.eclipse.protobuf.ui/icons/option.gif Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/icons/options.gif b/com.google.eclipse.protobuf.ui/icons/options.gif new file mode 100644 index 0000000..bdef879 --- /dev/null +++ b/com.google.eclipse.protobuf.ui/icons/options.gif Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/icons/protobuf.gif b/com.google.eclipse.protobuf.ui/icons/protobuf.gif deleted file mode 100644 index 5f161d9..0000000 --- a/com.google.eclipse.protobuf.ui/icons/protobuf.gif +++ /dev/null Binary files differ
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java index 7fe0ced..898e21d 100644 --- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java +++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Images.java
@@ -28,6 +28,7 @@ @Singleton public class Images { + private static final String GIF_EXTENSION = ".gif"; private static final String DEFAULT_IMAGE = "empty.gif"; private static final Map<Modifier, String> IMAGES_BY_MODIFIER = new HashMap<Modifier, String>(); @@ -47,22 +48,24 @@ IMAGES_BY_TYPE.put(Message.class, "message.gif"); IMAGES_BY_TYPE.put(Option.class, "option.gif"); IMAGES_BY_TYPE.put(Package.class, "package.gif"); - IMAGES_BY_TYPE.put(Protobuf.class, "protobuf.gif"); IMAGES_BY_TYPE.put(Rpc.class, "rpc.gif"); IMAGES_BY_TYPE.put(Service.class, "service.gif"); IMAGES_BY_TYPE.put(Syntax.class, "syntax.gif"); } - private static final List<String> STANDALONE_IMAGES = asList("extensions.gif"); + private static final List<String> STANDALONE_IMAGES = asList("extensions.gif", "imports.gif", "options.gif"); public String imageFor(Object o) { + if (o instanceof Keyword) { + Keyword k = (Keyword) o; + return imageFor(k); + } if (o instanceof Property) { Property p = (Property) o; return imageFor(p.getModifier()); } - if (o instanceof Keyword) { - Keyword k = (Keyword) o; - return imageFor(k); + if (o instanceof String) { + return o + GIF_EXTENSION; } return imageFor(o.getClass()); } @@ -80,7 +83,7 @@ Modifier m = Modifier.getByName(value); String image = IMAGES_BY_MODIFIER.get(m); if (image != null) return image; - String imageName = value + ".gif"; + String imageName = value + GIF_EXTENSION; if (IMAGES_BY_TYPE.containsValue(imageName) || STANDALONE_IMAGES.contains(imageName)) return imageName; return DEFAULT_IMAGE; }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java index a13a9b1..189f736 100644 --- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java +++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/labeling/Labels.java
@@ -8,14 +8,14 @@ */ package com.google.eclipse.protobuf.ui.labeling; -import static com.google.eclipse.protobuf.scoping.ProtobufImportUriResolver.URI_PREFIX; import static org.eclipse.jface.viewers.StyledString.DECORATIONS_STYLER; import org.eclipse.jface.viewers.StyledString; import com.google.eclipse.protobuf.protobuf.*; import com.google.eclipse.protobuf.ui.util.Properties; -import com.google.inject.*; +import com.google.inject.Inject; +import com.google.inject.Singleton; /** * Registry of commonly used text in the 'Protocol Buffer' editor. @@ -44,10 +44,6 @@ Property p = (Property) o; return labelFor(p); } - if (o instanceof Protobuf) { - Protobuf p = (Protobuf) o; - return labelFor(p); - } if (o instanceof Rpc) { Rpc r = (Rpc) o; return labelFor(r); @@ -60,9 +56,7 @@ } private Object labelFor(Import i) { - String uri = i.getImportURI(); - if (uri == null || !uri.startsWith(URI_PREFIX)) return uri; - return uri.substring(URI_PREFIX.length()); + return i.getImportURI(); } private Object labelFor(Literal l) { @@ -79,11 +73,6 @@ return text; } - private Object labelFor(Protobuf p) { - // TODO show this text till I figure out how to hide 'Protobuf' node in outline view - return "Protocol Buffer"; - } - private Object labelFor(Rpc r) { StyledString text = new StyledString(r.getName()); String types = String.format(" : %s > %s", messageName(r.getArgType()), messageName(r.getReturnType()));
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlinePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlinePage.java index 493b16b..6d26481 100644 --- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlinePage.java +++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlinePage.java
@@ -8,7 +8,17 @@ */ package com.google.eclipse.protobuf.ui.outline; -import org.eclipse.xtext.ui.editor.outline.impl.OutlinePage; +import static com.google.common.collect.Collections2.filter; +import static com.google.common.collect.Lists.newArrayList; +import static java.util.Collections.singletonList; + +import java.util.Collection; +import java.util.List; + +import org.eclipse.xtext.ui.editor.outline.IOutlineNode; +import org.eclipse.xtext.ui.editor.outline.impl.*; + +import com.google.common.base.Predicate; /** * Outline Page for Protocol Buffer editors. @@ -17,11 +27,30 @@ */ public class ProtobufOutlinePage extends OutlinePage { - /** - * Indicates that the root node and its immediate children of the Outline View need to be expanded. - * @return 3. - */ - @Override protected int getDefaultExpansionLevel() { - return 3; + @Override protected List<IOutlineNode> getInitiallyExpandedNodes() { + IOutlineNode rootNode = getTreeProvider().createRoot(getXtextDocument()); + List<IOutlineNode> nodes = newArrayList(rootNode); + addChildrenToExpand(singletonList(rootNode), nodes, 3); + return nodes; + } + + private void addChildrenToExpand(Collection<IOutlineNode> parents, List<IOutlineNode> nodes, int depth) { + if (depth < 1) return; + for (IOutlineNode parent : parents) { + Collection<IOutlineNode> children = childrenToExpand(parent); + nodes.addAll(children); + addChildrenToExpand(children, nodes, depth - 1); + } + } + + private Collection<IOutlineNode> childrenToExpand(IOutlineNode parent) { + if (parent instanceof DocumentRootNode) { + return filter(parent.getChildren(), new Predicate<IOutlineNode>() { + public boolean apply(IOutlineNode node) { + return !(node instanceof EStructuralFeatureNode); + } + }); + } + return parent.getChildren(); } }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java index 412134b..6d1ed58 100644 --- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java +++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/outline/ProtobufOutlineTreeProvider.java
@@ -8,11 +8,15 @@ */ package com.google.eclipse.protobuf.ui.outline; +import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.*; + import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.ui.editor.outline.IOutlineNode; import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider; +import org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode; import com.google.eclipse.protobuf.protobuf.*; +import com.google.eclipse.protobuf.protobuf.Package; /** * Customization of the default outline structure. @@ -29,6 +33,24 @@ return true; } + protected void _createChildren(DocumentRootNode parentNode, Protobuf protobuf) { + Package aPackage = protobuf.getPackage(); + if (aPackage != null) { + createNode(parentNode, aPackage); + } + if (!protobuf.getImports().isEmpty()) { + createEStructuralFeatureNode(parentNode, protobuf, PROTOBUF__IMPORTS, + labelProvider.getImage("imports"), "import declarations", false); + } + if (!protobuf.getOptions().isEmpty()) { + createEStructuralFeatureNode(parentNode, protobuf, PROTOBUF__OPTIONS, + labelProvider.getImage("options"), "option declarations", false); + } + for (ProtobufElement e : protobuf.getElements()) { + createNode(parentNode, e); + } + } + @Override protected void createNode(IOutlineNode parent, EObject modelElement) { if (modelElement instanceof MessageReference) return; super.createNode(parent, modelElement);