/******************************************************************************* * Copyright (c) 2013 AKSW Xturtle Project, 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 ******************************************************************************/ package de.itemis.tooling.xturtle.ui; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.inject.Inject; import org.eclipse.emf.ecore.EClass; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.source.Annotation; import org.eclipse.jface.text.source.projection.ProjectionAnnotation; import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel; import org.eclipse.jface.text.source.projection.ProjectionViewer; import org.eclipse.ui.texteditor.ITextEditorActionConstants; import org.eclipse.xtext.ui.XtextUIMessages; import org.eclipse.xtext.ui.editor.XtextEditor; import com.google.common.collect.ObjectArrays; import de.itemis.tooling.xturtle.ui.folding.TurtleFoldingRegionProvider.TypedFoldedRegion; import de.itemis.tooling.xturtle.ui.preferences.TurtlePreferenceConstants; import de.itemis.tooling.xturtle.xturtle.XturtlePackage; public class TurtleXtextEditor extends XtextEditor{ @Inject private IPreferenceStore preferencStore; //need to override as the FoldingActionGroup is not used for populating the menu //(although it has a fillMenu-method) @Override protected void rulerContextMenuAboutToShow(IMenuManager menu) { super.rulerContextMenuAboutToShow(menu); //remove the projection menu introduced by super call //unfortunately we cannot call super.super.rulerC... menu.remove("projection"); IMenuManager foldingMenu = new MenuManager(XtextUIMessages.Editor_FoldingMenu_name, "projection"); //$NON-NLS-1$ menu.appendToGroup(ITextEditorActionConstants.GROUP_RULERS, foldingMenu); IAction action = getAction("FoldingToggle"); //$NON-NLS-1$ foldingMenu.add(action); action = getAction("FoldingExpandAll"); //$NON-NLS-1$ foldingMenu.add(action); action = getAction("FoldingCollapseAll"); //$NON-NLS-1$ foldingMenu.add(action); action = getAction("FoldingCollapseStrings"); //$NON-NLS-1$ foldingMenu.add(action); action = getAction("FoldingRestore"); //$NON-NLS-1$ foldingMenu.add(action); } @Override protected void installFoldingSupport(ProjectionViewer projectionViewer) { super.installFoldingSupport(projectionViewer); ProjectionAnnotationModel model = projectionViewer.getProjectionAnnotationModel(); foldRegionsOnStartup(model); } private void foldRegionsOnStartup(ProjectionAnnotationModel model){ //TODO retrieve set of types to fold from helper, as other types might be added Set<EClass> typesToFold=new HashSet<EClass>(); if(preferencStore.getBoolean(TurtlePreferenceConstants.FOLD_TRIPLES_KEY)){ typesToFold.add(XturtlePackage.Literals.TRIPLES); } if(preferencStore.getBoolean(TurtlePreferenceConstants.FOLD_STRINGS_KEY)){ typesToFold.add(XturtlePackage.Literals.STRING_LITERAL); } if(preferencStore.getBoolean(TurtlePreferenceConstants.FOLD_DIRECTIVES_KEY)){ typesToFold.add(XturtlePackage.Literals.DIRECTIVES); } if(preferencStore.getBoolean(TurtlePreferenceConstants.FOLD_BLANK_COLL)){ typesToFold.add(XturtlePackage.Literals.BLANK_COLLECTION); } if(preferencStore.getBoolean(TurtlePreferenceConstants.FOLD_BLANK_OBJ)){ typesToFold.add(XturtlePackage.Literals.BLANK_OBJECTS); } if(!typesToFold.isEmpty()){ List<Annotation> changes=new ArrayList<Annotation>(); Iterator<?> iterator = model.getAnnotationIterator(); while (iterator.hasNext()){ Object next = iterator.next(); if(next instanceof ProjectionAnnotation){ ProjectionAnnotation pa = (ProjectionAnnotation) next; Position position = model.getPosition(pa); if(position instanceof TypedFoldedRegion &&typesToFold.contains(((TypedFoldedRegion) position).getType())){ pa.markCollapsed(); changes.add(pa); } } } model.modifyAnnotations(null,null, changes.toArray(new Annotation[0])); } } @Override protected String[] collectContextMenuPreferencePages() { String[] superPages = super.collectContextMenuPreferencePages(); String[] xturtlePages = new String[] { getLanguageName() + ".indexing.Labels", getLanguageName() + ".indexing.Descriptions", getLanguageName() + ".Folding", getLanguageName() + ".Validation", getLanguageName() + ".LanguageContentAssist" }; return ObjectArrays.concat(superPages, xturtlePages, String.class); } }