/******************************************************************************* * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. 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.cisco.yangide.editor.editors; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.views.contentoutline.ContentOutlinePage; import com.cisco.yangide.core.YangModelException; import com.cisco.yangide.core.dom.ASTCompositeNode; import com.cisco.yangide.core.dom.ASTNamedNode; import com.cisco.yangide.core.dom.ASTNode; import com.cisco.yangide.core.dom.AugmentationSchema; import com.cisco.yangide.core.dom.ContrainerSchemaNode; import com.cisco.yangide.core.dom.Deviation; import com.cisco.yangide.core.dom.ExtensionDefinition; import com.cisco.yangide.core.dom.GroupingDefinition; import com.cisco.yangide.core.dom.IdentitySchemaNode; import com.cisco.yangide.core.dom.LeafSchemaNode; import com.cisco.yangide.core.dom.Module; import com.cisco.yangide.core.dom.ModuleImport; import com.cisco.yangide.core.dom.NotificationDefinition; import com.cisco.yangide.core.dom.RpcDefinition; import com.cisco.yangide.core.dom.RpcInputNode; import com.cisco.yangide.core.dom.RpcOutputNode; import com.cisco.yangide.core.dom.SubModuleInclude; import com.cisco.yangide.core.dom.TypeDefinition; import com.cisco.yangide.core.dom.TypeReference; import com.cisco.yangide.core.dom.UsesNode; import com.cisco.yangide.ui.internal.IYangUIConstants; import com.cisco.yangide.ui.internal.YangUIImages; public class YangContentOutlinePage extends ContentOutlinePage { private YangEditor editor; private class YangOutlineStyledLabelProvider extends LabelProvider implements IStyledLabelProvider{ @Override public StyledString getStyledText(Object element) { if(element instanceof ASTNode) { StyledString result = new StyledString(((ASTNode) element).getNodeName()); if (element instanceof ASTCompositeNode) { result = new StyledString(((ASTCompositeNode)element).getName()).append(getStyledTypeName((ASTCompositeNode) element)); } else if (element instanceof ASTNamedNode) { result = new StyledString(((ASTNamedNode)element).getName()); } return result; } return null; } private StyledString getStyledTypeName(ASTCompositeNode node) { for (ASTNode n : ((ASTCompositeNode) node).getChildren()) { if (n instanceof TypeReference) { return new StyledString(" : " + ((TypeReference)n).getName(), StyledString.DECORATIONS_STYLER); } } return new StyledString(); } @Override public Image getImage(Object element) { if(element instanceof AugmentationSchema) { return YangUIImages.getImage(IYangUIConstants.IMG_AUGMENT_PROPOSAL); } else if (element instanceof Deviation) { return YangUIImages.getImage(IYangUIConstants.IMG_DEVIATION_PROPOSAL); } else if (element instanceof IdentitySchemaNode) { return YangUIImages.getImage(IYangUIConstants.IMG_IDENTITY_PROPOSAL); } else if (element instanceof ExtensionDefinition) { return YangUIImages.getImage(IYangUIConstants.IMG_EXTENSION_PROPOSAL); } else if (element instanceof NotificationDefinition) { return YangUIImages.getImage(IYangUIConstants.IMG_NOTIFICATION_PROPOSAL); } else if (element instanceof RpcInputNode) { return YangUIImages.getImage(IYangUIConstants.IMG_RPC_INPUT_PROPOSAL); } else if (element instanceof RpcOutputNode) { return YangUIImages.getImage(IYangUIConstants.IMG_RPC_OUTPUT_PROPOSAL); } else if (element instanceof RpcDefinition) { return YangUIImages.getImage(IYangUIConstants.IMG_RPC_PROPOSAL); } else if (element instanceof ModuleImport) { return YangUIImages.getImage(IYangUIConstants.IMG_IMPORT_PROPOSAL); } else if (element instanceof TypeReference) { return YangUIImages.getImage(IYangUIConstants.IMG_TYPE_PROPOSAL); } else if (element instanceof TypeDefinition) { return YangUIImages.getImage(IYangUIConstants.IMG_CUSTOM_TYPE_PROPOSAL); } else if (element instanceof GroupingDefinition) { return YangUIImages.getImage(IYangUIConstants.IMG_GROUPING_PROPOSAL); } else if (element instanceof SubModuleInclude) { return YangUIImages.getImage(IYangUIConstants.IMG_SUBMODULE_PROPOSAL); } else if (element instanceof ContrainerSchemaNode) { return YangUIImages.getImage(IYangUIConstants.IMG_CONTAINER_PROPOSAL); } else if (element instanceof LeafSchemaNode) { return YangUIImages.getImage(IYangUIConstants.IMG_LEAF_PROPOSAL); } else if (element instanceof UsesNode) { return YangUIImages.getImage(IYangUIConstants.IMG_USES_PROPOSAL); } else if (element instanceof SubModuleInclude) { return YangUIImages.getImage(IYangUIConstants.IMG_SUBMODULE_PROPOSAL); } else if (element instanceof Module) { return YangUIImages.getImage(IYangUIConstants.IMG_MODULE_PROPOSAL); } return null; } } private class YangOutlineContentProvider implements ITreeContentProvider { @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof ASTNode) { return filterChildren((ASTNode) inputElement).toArray(); } return null; } public List<ASTNode> filterChildren(ASTNode parent) { List<ASTNode> result = new ArrayList<ASTNode>(); if (null != parent && parent instanceof ASTCompositeNode) { for (ASTNode n : ((ASTCompositeNode)parent).getChildren()) { if (n.isShowedInOutline()) { result.add(n); } } } return result; } @Override public Object[] getChildren(Object parentElement) { return getElements(parentElement); } @Override public Object getParent(Object element) { if (element instanceof ASTNode) { return ((ASTNode) element).getParent(); } return null; } @Override public boolean hasChildren(Object element) { if (element instanceof ASTNode) { return !filterChildren((ASTNode) element).isEmpty(); } return false; } } public YangContentOutlinePage(YangEditor e) { super(); editor = e; } @Override public void createControl(Composite parent) { super.createControl(parent); getTreeViewer().setContentProvider(new YangOutlineContentProvider()); getTreeViewer().setLabelProvider(new DelegatingStyledCellLabelProvider(new YangOutlineStyledLabelProvider())); getTreeViewer().setInput(getOutlineRoot()); } private ASTNode getOutlineRoot() { try { return editor.getModule(); } catch (YangModelException e) { return null; } } public void selectNode(ASTNode node) { ASTNode s = getFirstNodeInTree(node); if (null != s) { ISelection selected = getTreeViewer().getSelection(); if (selected instanceof IStructuredSelection && !((IStructuredSelection)selected).toList().contains(s)) { getTreeViewer().setSelection(new StructuredSelection(s), true); } } } private ASTNode getFirstNodeInTree (ASTNode node) { ASTNode result = node; while (null != result && !result.isShowedInOutline()) { result = result.getParent(); } return result; } public void updateOutline() { Display d = getControl().getDisplay(); if (d != null) { d.asyncExec(new Runnable() { public void run() { getTreeViewer().setInput(getOutlineRoot()); } }); } } }