X-Git-Url: http://secure.phpeclipse.com
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPContentOutlinePage.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPContentOutlinePage.java
index dfc01fb..2adfda1 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPContentOutlinePage.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPContentOutlinePage.java
@@ -12,19 +12,24 @@ Contributors:
Klaus Hartlage - www.eclipseproject.de
**********************************************************************/
-import java.text.MessageFormat;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
+import java.util.TreeSet;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
+import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo;
+import net.sourceforge.phpdt.internal.compiler.parser.Parser;
+import net.sourceforge.phpdt.internal.compiler.parser.PHPSegment;
+import net.sourceforge.phpdt.internal.compiler.parser.PHPSegmentWithChildren;
+import net.sourceforge.phpdt.internal.ui.viewsupport.ImageDescriptorRegistry;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
-import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.BadPositionCategoryException;
import org.eclipse.jface.text.DefaultPositionUpdater;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IPositionUpdater;
-import org.eclipse.jface.text.Position;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
@@ -32,33 +37,32 @@ import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
-
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
/**
- * A content outline page which always represents the content of the
- * connected editor in 10 segments.
+ * A content outline page which always represents the functions of the
+ * connected PHPEditor.
*/
public class PHPContentOutlinePage extends ContentOutlinePage {
+ private static final String ERROR = "error"; //$NON-NLS-1$
+ private static final String WARNING = "warning"; //$NON-NLS-1$
- /**
- * A segment element.
- */
- protected static class Segment {
- public String name;
- public Position position;
-
- public Segment(String name, Position position) {
- this.name = name;
- this.position = position;
- }
-
- public String toString() {
- return name;
+ protected static class SegmentComparator implements Comparator {
+ public int compare(Object o1, Object o2) {
+ if (o1 instanceof PHPSegmentWithChildren && !(o2 instanceof PHPSegmentWithChildren)) {
+ return 1;
+ }
+ if (o2 instanceof PHPSegmentWithChildren && !(o1 instanceof PHPSegmentWithChildren)) {
+ return -1;
+ }
+ return ((PHPSegment) o1).toString().compareToIgnoreCase(((PHPSegment) o2).toString());
}
- };
+ }
/**
* Divides the editor's document into ten segments and provides elements for them.
@@ -68,150 +72,47 @@ public class PHPContentOutlinePage extends ContentOutlinePage {
protected final static String SEGMENTS = "__php_segments"; //$NON-NLS-1$
protected IPositionUpdater fPositionUpdater = new DefaultPositionUpdater(SEGMENTS);
protected List fContent = new ArrayList(10);
-
- private String getIdentifier(String text, int firstIndex) {
- int i = firstIndex;
- char c;
- int textLength = text.length();
- StringBuffer identifier = new StringBuffer();
- while (i < textLength) {
- c = text.charAt(i++);
- if (Character.isJavaIdentifierPart(c)) {
- identifier.append(c);
- } else {
- return identifier.toString();
- }
- }
- return null;
- }
+ protected TreeSet fVariables = new TreeSet();
+
+ // private String getIdentifier(String text, int firstIndex) {
+ // int i = firstIndex;
+ // char c;
+ // int textLength = text.length();
+ // StringBuffer identifier = new StringBuffer();
+ // while (i < textLength) {
+ // c = text.charAt(i++);
+ // if (Character.isJavaIdentifierPart(c) || (c == '$')) {
+ // identifier.append(c);
+ // } else if ((i == firstIndex + 1) && (c == '$')) {
+ // identifier.append(c);
+ // } else {
+ // return identifier.toString();
+ // }
+ // }
+ // return null;
+ // }
protected void parse(IDocument document) {
- int lines = document.getNumberOfLines();
- int increment = Math.max(Math.round((float) (lines / 10)), 10);
+ // int lines = document.getNumberOfLines();
+ // int increment = Math.max(Math.round((float) (lines / 10)), 10);
+ String name;
+ int index;
String text = document.get();
- int lastIndex = 0;
- int i = 0;
- // lastIndex = text.indexOf("function ", lastIndex);
- // while (lastIndex > 0) {
- //
- // try {
- // i = lastIndex + 9;
- // while ((i < text.length()) && Character.isJavaIdentifierPart(text.charAt(i))) {
- // i++;
- // }
- // Position p = new Position(lastIndex, i - lastIndex);
- // document.addPosition(SEGMENTS, p);
- // fContent.add(new Segment(text.substring(lastIndex, i), p));
- // // MessageFormat.format("function", new Object[] { new Integer(lastIndex)}), p)); //$NON-NLS-1$
- // lastIndex = text.indexOf("function", lastIndex + 1);
- // } catch (BadLocationException e) {
- // } catch (BadPositionCategoryException e) {
- // }
- //
- // }
-
- boolean lineCommentMode = false;
- boolean multiLineCommentMode = false;
- boolean stringMode = false;
- boolean functionMode = false;
- String identifier;
- int c;
- int c2;
-
- int textLength = text.length() - 10;
- while (i < textLength) {
- c = text.charAt(i++);
- if (c == '\n') {
- lineCommentMode = false;
- // read until end of line
- } else if (c == '#') {
- // read until end of line
- lineCommentMode = true;
- continue;
- } else if (c == '/') {
- c2 = text.charAt(i++);
- if (c2 == '/') {
- lineCommentMode = true;
- continue;
- } else if (c2 == '*') {
- multiLineCommentMode = true;
- continue;
- } else {
- i--;
- }
- } else if (c == '*' && multiLineCommentMode) {
- c2 = text.charAt(i++);
- if (c2 == '/') {
- multiLineCommentMode = false;
- continue;
- } else {
- i--;
- }
- } else if (c == '\\' && stringMode) {
- c2 = text.charAt(i++);
- if (c2 == '"') {
- continue;
- } else {
- i--;
- }
- } else if (c == '"') {
- if (stringMode) {
- stringMode = false;
- } else {
- stringMode = true;
- }
- continue;
- }
- if (lineCommentMode || multiLineCommentMode || stringMode) {
- continue;
- }
-
- if (functionMode && Character.isJavaIdentifierPart((char) c)) {
- functionMode = false;
- lastIndex = i-1;
- identifier = getIdentifier(text, lastIndex);
- try {
- i += identifier.length()-1;
- Position p = new Position(lastIndex, i - lastIndex);
- document.addPosition(SEGMENTS, p);
- fContent.add(new Segment(text.substring(lastIndex, i), p));
- // MessageFormat.format("function", new Object[] { new Integer(lastIndex)}), p)); //$NON-NLS-1$
- // lastIndex = text.indexOf("function", lastIndex + 1);
- } catch (BadLocationException e) {
- } catch (BadPositionCategoryException e) {
- }
+ Parser parser = new Parser(null);
- } else if (c == 'f') {
- identifier = getIdentifier(text, i - 1);
- if (identifier.equals("function")) {
- functionMode = true;
- i+=8;
- }
- }
+ PHPOutlineInfo outlineInfo = parser.parseInfo(fInput, text);
+ fVariables = outlineInfo.getVariables();
+ PHPSegmentWithChildren declarations = outlineInfo.getDeclarations();
+ PHPSegment temp;
+ for (int i = 0; i < declarations.size(); i++) {
+ temp = declarations.get(i);
+ fContent.add(temp);
}
+ Collections.sort(fContent, new SegmentComparator());
- // for (int line = 0; line < lines; line += increment) {
- //
- // int length = increment;
- // if (line + increment > lines)
- // length = lines - line;
- //
- // try {
- //
- // int offset = document.getLineOffset(line);
- // int end = document.getLineOffset(line + length);
- // length = end - offset;
- // Position p = new Position(offset, length);
- // document.addPosition(SEGMENTS, p);
- // fContent.add(new Segment(MessageFormat.format(PHPEditorMessages.getString("OutlinePage.segment.title_pattern"), new Object[] { new Integer(offset)}), p)); //$NON-NLS-1$
- //
- // } catch (BadPositionCategoryException x) {
- // } catch (BadLocationException x) {
- // }
- // }
}
/*
@@ -230,6 +131,7 @@ public class PHPContentOutlinePage extends ContentOutlinePage {
}
fContent.clear();
+ fVariables.clear();
if (newInput != null) {
IDocument document = fDocumentProvider.getDocument(newInput);
@@ -250,6 +152,10 @@ public class PHPContentOutlinePage extends ContentOutlinePage {
fContent.clear();
fContent = null;
}
+ if (fVariables != null) {
+ fVariables.clear();
+ fVariables = null;
+ }
}
/*
@@ -259,6 +165,13 @@ public class PHPContentOutlinePage extends ContentOutlinePage {
return false;
}
+ /**
+ * returns all PHP variables
+ */
+ public Object[] getVariables() {
+ return fVariables.toArray();
+ }
+
/*
* @see IStructuredContentProvider#getElements(Object)
*/
@@ -270,6 +183,9 @@ public class PHPContentOutlinePage extends ContentOutlinePage {
* @see ITreeContentProvider#hasChildren(Object)
*/
public boolean hasChildren(Object element) {
+ if (element instanceof PHPSegmentWithChildren) {
+ return !((PHPSegmentWithChildren) element).getList().isEmpty();
+ }
return element == fInput;
}
@@ -277,8 +193,9 @@ public class PHPContentOutlinePage extends ContentOutlinePage {
* @see ITreeContentProvider#getParent(Object)
*/
public Object getParent(Object element) {
- if (element instanceof Segment)
- return fInput;
+ if (element instanceof PHPSegment) {
+ return ((PHPSegment) element).getParent();
+ }
return null;
}
@@ -288,21 +205,49 @@ public class PHPContentOutlinePage extends ContentOutlinePage {
public Object[] getChildren(Object element) {
if (element == fInput)
return fContent.toArray();
+ if (element instanceof PHPSegmentWithChildren)
+ return ((PHPSegmentWithChildren) element).getList().toArray();
return new Object[0];
}
};
+ protected class OutlineLabelProvider extends LabelProvider {
+ private ImageDescriptorRegistry fRegistry;
+
+ public OutlineLabelProvider() {
+ fRegistry = PHPeclipsePlugin.getImageDescriptorRegistry();
+ ;
+ }
+ /**
+ * The LabelProvider
implementation of this
+ * ILabelProvider
method returns null
. Subclasses may
+ * override.
+ */
+ public Image getImage(Object element) {
+ if (element instanceof PHPSegment) {
+ ImageDescriptor descriptor = ((PHPSegment) element).getImage();
+ return fRegistry.get(descriptor);
+ }
+ return null;
+ }
+ }
+
protected Object fInput;
protected IDocumentProvider fDocumentProvider;
protected ITextEditor fTextEditor;
+ protected PHPEditor fEditor;
+ protected ContentProvider contentProvider;
/**
* Creates a content outline page using the given provider and the given editor.
*/
public PHPContentOutlinePage(IDocumentProvider provider, ITextEditor editor) {
super();
+ contentProvider = null;
fDocumentProvider = provider;
fTextEditor = editor;
+ if (editor instanceof PHPEditor)
+ fEditor = (PHPEditor) editor;
}
/* (non-Javadoc)
@@ -313,8 +258,11 @@ public class PHPContentOutlinePage extends ContentOutlinePage {
super.createControl(parent);
TreeViewer viewer = getTreeViewer();
- viewer.setContentProvider(new ContentProvider());
- viewer.setLabelProvider(new LabelProvider());
+
+ contentProvider = new ContentProvider();
+ viewer.setContentProvider(contentProvider);
+ viewer.setLabelProvider(new OutlineLabelProvider());
+
viewer.addSelectionChangedListener(this);
if (fInput != null)
@@ -332,9 +280,9 @@ public class PHPContentOutlinePage extends ContentOutlinePage {
if (selection.isEmpty())
fTextEditor.resetHighlightRange();
else {
- Segment segment = (Segment) ((IStructuredSelection) selection).getFirstElement();
- int start = segment.position.getOffset();
- int length = segment.position.getLength();
+ PHPSegment segment = (PHPSegment) ((IStructuredSelection) selection).getFirstElement();
+ int start = segment.getPosition().getOffset();
+ int length = segment.getPosition().getLength();
try {
fTextEditor.setHighlightRange(start, length, true);
} catch (IllegalArgumentException x) {
@@ -367,4 +315,15 @@ public class PHPContentOutlinePage extends ContentOutlinePage {
}
}
}
+
+ public Object[] getVariables() {
+ if (contentProvider != null) {
+ return contentProvider.getVariables();
+ }
+ return null;
+ }
+ // public ContentProvider getContentProvider() {
+ // return contentProvider;
+ // }
+
}