]> git.uio.no Git - ifi-stolz-refaktor.git/blame - case-study/jdt-before/core extension/org/eclipse/jdt/internal/corext/dom/SelectionAnalyzer.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-before / core extension / org / eclipse / jdt / internal / corext / dom / SelectionAnalyzer.java
CommitLineData
1b2798f6
EK
1/*******************************************************************************
2 * Copyright (c) 2000, 2011 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11package org.eclipse.jdt.internal.corext.dom;
12
13import java.util.ArrayList;
14import java.util.List;
15
16import org.eclipse.core.runtime.Assert;
17
18import org.eclipse.jface.text.IRegion;
19import org.eclipse.jface.text.Region;
20
21import org.eclipse.jdt.core.dom.ASTNode;
22import org.eclipse.jdt.core.dom.Expression;
23
24
25/**
26 * Maps a selection to a set of AST nodes.
27 */
28public class SelectionAnalyzer extends GenericVisitor {
29
30 private Selection fSelection;
31 private boolean fTraverseSelectedNode;
32 private ASTNode fLastCoveringNode;
33
34 // Selected nodes
35 private List<ASTNode> fSelectedNodes;
36
37 public SelectionAnalyzer(Selection selection, boolean traverseSelectedNode) {
38 super(true);
39 Assert.isNotNull(selection);
40 fSelection= selection;
41 fTraverseSelectedNode= traverseSelectedNode;
42 }
43
44 protected void setSelection(Selection selection) {
45 fSelection= selection;
46 }
47
48 public boolean hasSelectedNodes() {
49 return fSelectedNodes != null && !fSelectedNodes.isEmpty();
50 }
51
52 public ASTNode[] getSelectedNodes() {
53 if (fSelectedNodes == null || fSelectedNodes.isEmpty())
54 return new ASTNode[0];
55 return fSelectedNodes.toArray(new ASTNode[fSelectedNodes.size()]);
56 }
57
58 public ASTNode getFirstSelectedNode() {
59 if (fSelectedNodes == null || fSelectedNodes.isEmpty())
60 return null;
61 return fSelectedNodes.get(0);
62 }
63
64 public ASTNode getLastSelectedNode() {
65 if (fSelectedNodes == null || fSelectedNodes.isEmpty())
66 return null;
67 return fSelectedNodes.get(fSelectedNodes.size() - 1);
68 }
69
70 public boolean isExpressionSelected() {
71 if (!hasSelectedNodes())
72 return false;
73 return fSelectedNodes.get(0) instanceof Expression;
74 }
75
76 public IRegion getSelectedNodeRange() {
77 if (fSelectedNodes == null || fSelectedNodes.isEmpty())
78 return null;
79 ASTNode firstNode= fSelectedNodes.get(0);
80 ASTNode lastNode= fSelectedNodes.get(fSelectedNodes.size() - 1);
81 int start= firstNode.getStartPosition();
82 return new Region(start, lastNode.getStartPosition() + lastNode.getLength() - start);
83 }
84
85 public ASTNode getLastCoveringNode() {
86 return fLastCoveringNode;
87 }
88
89 public Selection getSelection() {
90 return fSelection;
91 }
92
93 //--- node management ---------------------------------------------------------
94
95 @Override
96 protected boolean visitNode(ASTNode node) {
97 // The selection lies behind the node.
98 if (fSelection.liesOutside(node)) {
99 return false;
100 } else if (fSelection.covers(node)) {
101 if (isFirstNode()) {
102 handleFirstSelectedNode(node);
103 } else {
104 handleNextSelectedNode(node);
105 }
106 return fTraverseSelectedNode;
107 } else if (fSelection.coveredBy(node)) {
108 fLastCoveringNode= node;
109 return true;
110 } else if (fSelection.endsIn(node)) {
111 return handleSelectionEndsIn(node);
112 }
113 // There is a possibility that the user has selected trailing semicolons that don't belong
114 // to the statement. So dive into it to check if sub nodes are fully covered.
115 return true;
116 }
117
118 protected void reset() {
119 fSelectedNodes= null;
120 }
121
122 protected void handleFirstSelectedNode(ASTNode node) {
123 fSelectedNodes= new ArrayList<ASTNode>(5);
124 fSelectedNodes.add(node);
125 }
126
127 protected void handleNextSelectedNode(ASTNode node) {
128 if (getFirstSelectedNode().getParent() == node.getParent()) {
129 fSelectedNodes.add(node);
130 }
131 }
132
133 protected boolean handleSelectionEndsIn(ASTNode node) {
134 return false;
135 }
136
137 protected List<ASTNode> internalGetSelectedNodes() {
138 return fSelectedNodes;
139 }
140
141 private boolean isFirstNode() {
142 return fSelectedNodes == null;
143 }
144}