package de.ovgu.cide.editor; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.ISelection; import cide.gast.IASTNode; import cide.gast.ISourceFile; import cide.languages.ExtendedLanguageExtension; import cide.languages.ILanguageExtension; import de.ovgu.cide.features.IFeature; import de.ovgu.cide.features.IFeatureModel; import de.ovgu.cide.features.source.ColoredSourceFile; import de.ovgu.cide.features.source.SourceFileColorManager; import de.ovgu.cide.languages.LanguageExtensionProxy; public class SelectionActionsContext { private ColoredSourceFile sourceFile; private ITextSelection textSelection; private final List<IASTNode> selectedNodes = new ArrayList<IASTNode>(); private List<IASTNode> allSelectedNodes; private ColoredEditorExtensions editorExtensions; private boolean optionalNodesOnly; // Auch Indikator daf�r, dass alternative Features unterst�tzt werden public SelectionActionsContext(ColoredSourceFile sourceFile, ISelection selection, ColoredEditorExtensions editorExtensions) { this(sourceFile, selection, editorExtensions, true); } public SelectionActionsContext(ColoredSourceFile sourceFile, ISelection selection, ColoredEditorExtensions editorExtensions, boolean optionalNodesOnly) { if ((sourceFile == null) || !(selection instanceof ITextSelection)) return; this.sourceFile = sourceFile; textSelection = (ITextSelection) selection; if (textSelection.getLength() == 0) return; this.editorExtensions = editorExtensions; updateSelectedASTs(optionalNodesOnly); this.optionalNodesOnly = optionalNodesOnly; } boolean anyNodesSelected() { return ((selectedNodes != null) && !selectedNodes.isEmpty()); } public boolean nodesHaveColor(IFeature feature) { if ((feature == null) || !anyNodesSelected()) return false; SourceFileColorManager colorManager = sourceFile.getColorManager(); for (IASTNode node : selectedNodes) { if (!colorManager.hasColor(node, feature)) return false; } return true; } public boolean nodesAreColored() { if (!anyNodesSelected()) return false; SourceFileColorManager colorManager = sourceFile.getColorManager(); for (IASTNode node : selectedNodes) { if (colorManager.getColors(node).isEmpty()) return false; } return true; } public boolean nodesHaveNonInheritedColors() { if (!anyNodesSelected()) return false; SourceFileColorManager colorManager = sourceFile.getColorManager(); for (IASTNode node : selectedNodes) { if (colorManager.getNotInheritedColors(node).isEmpty()) return false; } return true; } public boolean canColorNodes() { if (!anyNodesSelected()) return false; if (!optionalNodesOnly) { List<IASTNode> nodesToCheck = new LinkedList<IASTNode>(); for (IASTNode node : selectedNodes) { if (!node.isOptional()) { nodesToCheck.add(node); } } if (!nodesToCheck.isEmpty()) return canCreateAlternatives(nodesToCheck); } return true; } public boolean canCreateAlternatives() { return canCreateAlternatives(selectedNodes); } @SuppressWarnings("unchecked") private boolean canCreateAlternatives(List<IASTNode> nodes) { if ((nodes == null) || nodes.isEmpty() || optionalNodesOnly) return false; ILanguageExtension le = sourceFile.getLanguageExtension(); if (le != null) { if (le instanceof LanguageExtensionProxy) { le = ((LanguageExtensionProxy) le).getTarget(); } if (!(le instanceof ExtendedLanguageExtension)) return false; return ((ExtendedLanguageExtension) le).canCreateAlternatives(nodes); } return false; } private void updateSelectedASTs(boolean optionalNodesOnly) { try { selectedNodes.clear(); ISourceFile ast = sourceFile.getAST(); SelectionFinder selectionFinder = new SelectionFinder(selectedNodes, textSelection, optionalNodesOnly); ast.accept(selectionFinder); allSelectedNodes = selectionFinder.getAllSelectedNodes(); } catch (Exception e) { } } public ColoredSourceFile getSourceFile() { return sourceFile; } public ITextSelection getTextSelection() { return textSelection; } public List<IASTNode> getSelectedNodes() { return selectedNodes; } public List<IASTNode> getAllSelectedNodes() { return allSelectedNodes; } public ColoredEditorExtensions getEditorExtensions() { return editorExtensions; } public IFeatureModel getFeatureModel() { return sourceFile.getFeatureModel(); } }