/******************************************************************************* * 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 ******************************************************************************/ package de.itemis.tooling.terminology.ui.folding; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ResourceBundle; import org.eclipse.emf.ecore.EClass; import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.ITextViewer; 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.ITextEditor; import org.eclipse.ui.texteditor.IUpdate; import org.eclipse.ui.texteditor.ResourceAction; import org.eclipse.xtext.ui.editor.folding.FoldingActionGroup; import de.itemis.tooling.terminology.terminology.TerminologyPackage; import de.itemis.tooling.terminology.ui.folding.TerminologyFoldingRegionProvider.TypedFoldedRegion; class TerminologyFoldingActionGroup extends FoldingActionGroup { //inner classes copied from super private static abstract class PreferenceAction extends ResourceAction implements IUpdate { PreferenceAction(ResourceBundle bundle, String prefix, int style) { super(bundle, prefix, style); } } private class FoldingAction extends PreferenceAction { FoldingAction(ResourceBundle bundle, String prefix) { super(bundle, prefix, IAction.AS_PUSH_BUTTON); } public void update() { setEnabled(TerminologyFoldingActionGroup.this.isEnabled() && viewwer.isProjectionMode()); } } private ProjectionViewer viewwer; private FoldingAction collapseMetadata; private FoldingAction collapseTerm; TerminologyFoldingActionGroup(final ITextEditor editor, ITextViewer viewer) { super(editor, viewer); if(!(viewer instanceof ProjectionViewer)){ return; } this.viewwer=(ProjectionViewer) viewer; collapseMetadata= getFoldingAction("Projection.CollapseMetadata.", TerminologyPackage.Literals.META_DATA); collapseMetadata.setActionDefinitionId("de.itemis.tooling.terminology.ui.folding.collapseMetadata"); editor.setAction("FoldingCollapseMetadata", collapseMetadata); //$NON-NLS-1$ collapseTerm=getFoldingAction("Projection.CollapseTerm.", TerminologyPackage.Literals.TERM); collapseTerm.setActionDefinitionId("de.itemis.tooling.terminology.ui.folding.collapseTerm"); editor.setAction("FoldingCollapseTerm", collapseTerm); //$NON-NLS-1$ } private FoldingAction getFoldingAction(String bundlePrefix, final EClass type){ return new FoldingAction(TerminologyFoldingMessages.getResourceBundle(), bundlePrefix) { public void run() { ProjectionAnnotationModel model = viewwer.getProjectionAnnotationModel(); Iterator<?> iterator = model.getAnnotationIterator(); List<Annotation> toCollapse=new ArrayList<Annotation>(); while (iterator.hasNext()){ Object next = iterator.next(); if(next instanceof ProjectionAnnotation){ ProjectionAnnotation pa = (ProjectionAnnotation) next; //foldable regions for strings have been marked by using the TextFoldedRegion class //there may indeed be better ways... Position position = model.getPosition(pa); if(position instanceof TypedFoldedRegion && type==((TypedFoldedRegion) position).getType()){ if (!pa.isCollapsed()){ pa.markCollapsed(); toCollapse.add(pa); } } } } model.modifyAnnotations(null, null, toCollapse.toArray(new Annotation[0])); } }; } @Override protected void update() { super.update(); if(isEnabled()){ collapseMetadata.update(); collapseTerm.update(); } } }