/** * Copyright (c) 2013-2016 Angelo ZERR. * 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 * * Contributors: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.angular.protocol.outline; import java.io.IOException; import java.util.ArrayList; import java.util.List; import tern.ITernFile; import tern.ITernProject; import tern.TernException; import tern.angular.AngularType; import tern.angular.modules.AngularElement; import tern.angular.modules.Controller; import tern.angular.modules.Directive; import tern.angular.modules.DirectiveValue; import tern.angular.modules.Module; import tern.server.TernPlugin; import tern.server.protocol.IJSONObjectHelper; import tern.server.protocol.TernQuery; import tern.server.protocol.outline.IJSNode; import tern.server.protocol.outline.IJSNodeRoot; import tern.server.protocol.outline.TernOutlineCollector; import tern.server.protocol.outline.TernOutlineResultProcessor; import tern.server.protocol.push.IMessageHandler; /** * Angular outline provider. * */ public class AngularOutlineProvider extends TernOutlineCollector implements IMessageHandler { private final List<IAngularOutlineListener> listeners; private AngularOutline outline; public AngularOutlineProvider(ITernProject ternProject) { super(ternProject); this.listeners = new ArrayList<IAngularOutlineListener>(); ternProject.on(AngularOutline.ANGULAR_MODEL_CHANGED_EVENT, this); } @Override protected IJSNodeRoot doCreateRoot() { if (outline == null) { outline = new AngularOutline(getTernProject()); } else { outline.clear(); } return outline; } public boolean init() throws IOException, TernException { if (outline == null) { outline = new AngularOutline(getTernProject()); loadOutline(); fireOutlineChanged(); return false; } return true; } @Override public IJSNode createNode(String name, String type, String kind, String value, Long start, Long end, String file, IJSNode parent, Object jsonNode, IJSONObjectHelper helper) { AngularType angularType = AngularType.get(kind); if (angularType != AngularType.unknown) { switch (angularType) { case module: return new Module(name, start, end, file, parent); case controller: return new Controller(name, null, start, end, file, parent); case directive: List<String> tagNames = new ArrayList<String>(); String restrict = null; // helper.getText(completion, // "restrict"); DirectiveValue directiveValue = DirectiveValue.none; return new Directive(name, AngularType.model, null, tagNames, restrict, directiveValue, start, end, file, parent); default: return new AngularElement(name, angularType, start, end, file, parent); } } return super.createNode(name, type, kind, value, start, end, file, parent, jsonNode, helper); } public AngularOutline getOutline() throws IOException, TernException { /* * if (init() && !getTernProject().hasPlugin(TernPlugin.push)) { * loadOutline(); } */ return outline; } protected void fireOutlineChanged() { synchronized (listeners) { for (IAngularOutlineListener listener : listeners) { listener.changed(outline); } } } protected void loadOutline() throws IOException, TernException { TernQuery query = new AngularOutlineQuery(); getTernProject().request(query, null, this); } public void refresh(ITernFile ternFile) throws IOException, TernException { ITernProject ternProject = getTernProject(); if (ternProject.hasPlugin(TernPlugin.push)) { return; } TernQuery query = new AngularOutlineQuery(); query.setFile(ternFile.getFileName()); ternProject.request(query, ternFile, this); } @Override public void handleMessage(Object jsonObject, IJSONObjectHelper helper) { if (outline == null) { outline = new AngularOutline(getTernProject()); } TernOutlineResultProcessor.INSTANCE.process(null, helper, jsonObject, this); fireOutlineChanged(); } public void addAngularOutlineListener(IAngularOutlineListener listener) { synchronized (listeners) { if (!listeners.contains(listener)) { listeners.add(listener); } } } public void removeAngularOutlineListener(IAngularOutlineListener listener) { synchronized (listeners) { listeners.remove(listener); } } @Override public IJSNodeRoot getRoot() { try { return getOutline(); } catch (Exception e) { e.printStackTrace(); } return super.getRoot(); } }