/*******************************************************************************
* Copyright (c) 2013 itemis AG (http://www.itemis.eu).
* 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
******************************************************************************/
/*
* generated by Xtext
*/
package de.itemis.tooling.terminology.ui.outline;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.swt.graphics.Image;
import org.eclipse.xtext.nodemodel.ICompositeNode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.ui.editor.outline.IOutlineNode;
import org.eclipse.xtext.ui.editor.outline.impl.AbstractOutlineNode;
import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider;
import org.eclipse.xtext.ui.editor.outline.impl.DocumentRootNode;
import org.eclipse.xtext.ui.editor.outline.impl.EObjectNode;
import org.eclipse.xtext.util.TextRegion;
import com.google.common.base.Optional;
import de.itemis.tooling.terminology.terminology.Entry;
import de.itemis.tooling.terminology.terminology.Language;
import de.itemis.tooling.terminology.terminology.SubjectEntries;
import de.itemis.tooling.terminology.terminology.Term;
import de.itemis.tooling.terminology.terminology.Terminology;
/**
* customization of the default outline structure
*
*/
public class TerminologyOutlineTreeProvider extends DefaultOutlineTreeProvider {
protected boolean _isLeaf(Term modelElement) {
return true;
}
@Override
protected void _createChildren(final DocumentRootNode parentNode,
EObject modelElement) {
if(modelElement instanceof SubjectEntries){
final SubjectEntries entries = (SubjectEntries)modelElement;
final EList<Language> languages;
try {
languages = ((Terminology) entries.getSubject().eContainer()).getLanguages();
} catch (NullPointerException e) {
new AbstractOutlineNode(parentNode,(Image)null,"No outline available. Make sure,",true) {};
new AbstractOutlineNode(parentNode,(Image)null,"the project has the Xtext nature and",true) {};
new AbstractOutlineNode(parentNode,(Image)null,"start a clean build.",true) {};
return;
}
createLanguageNodes(parentNode, entries, languages);
}
}
void _createChildren(final IOutlineNode parentNode, SubjectEntries modelElement){}
void createLanguageNodes(IOutlineNode parent, final SubjectEntries entries, final EList<Language> languages){
for (final Language language : languages) {
EObjectNode ln = new EObjectNode(entries, parent,(Image)null,Optional.fromNullable(language.getDisplayName()).or(language.getName()),false) {
boolean created=false;
@Override
public List<IOutlineNode> getChildren() {
if(!created){
createLanguageChildren(this, language, entries);
}
created=true;
return super.getChildren();
}
};
ICompositeNode node = NodeModelUtils.getNode(entries);
ln.setTextRegion(new TextRegion(node.getOffset(), node.getLength()));
}
}
private void createLanguageChildren(IOutlineNode parentNode, Language language,
SubjectEntries entries) {
for (Entry entry: entries.getEntries()) {
for (Term term: entry.getTerms()) {
if(term.getLanguage()==language){
super.createEObjectNode(parentNode, term);
}
}
}
}
}