Added: PreferencePage; External Browser startup; extended syntax highlighting
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / PHPContentOutlinePage.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPContentOutlinePage.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPContentOutlinePage.java
new file mode 100644 (file)
index 0000000..d7ab260
--- /dev/null
@@ -0,0 +1,251 @@
+package net.sourceforge.phpeclipse.phpeditor;
+
+/**********************************************************************
+Copyright (c) 2000, 2002 IBM Corp. and others.
+All rights reserved. This program and the accompanying materials
+are made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+
+Contributors:
+    IBM Corporation - Initial implementation
+    Klaus Hartlage - www.eclipseproject.de
+**********************************************************************/
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+import org.eclipse.jface.text.BadLocationException;
+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;
+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.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.
+ */
+public class PHPContentOutlinePage extends ContentOutlinePage {
+
+       /**
+        * 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;
+               }
+       };
+
+       /**
+        * Divides the editor's document into ten segments and provides elements for them.
+        */
+       protected class ContentProvider implements ITreeContentProvider {
+
+               protected final static String SEGMENTS= "__java_segments"; //$NON-NLS-1$
+               protected IPositionUpdater fPositionUpdater= new DefaultPositionUpdater(SEGMENTS);
+               protected List fContent= new ArrayList(10);
+
+               protected void parse(IDocument document) {
+
+                       int lines= document.getNumberOfLines();
+                       int increment= Math.max(Math.round((float) (lines / 10)), 10);
+
+                       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) {
+                               }
+                       }
+               }
+
+               /*
+                * @see IContentProvider#inputChanged(Viewer, Object, Object)
+                */
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+                       if (oldInput != null) {
+                               IDocument document= fDocumentProvider.getDocument(oldInput);
+                               if (document != null) {
+                                       try {
+                                               document.removePositionCategory(SEGMENTS);
+                                       } catch (BadPositionCategoryException x) {
+                                       }
+                                       document.removePositionUpdater(fPositionUpdater);
+                               }
+                       }
+
+                       fContent.clear();
+
+                       if (newInput != null) {
+                               IDocument document= fDocumentProvider.getDocument(newInput);
+                               if (document != null) {
+                                       document.addPositionCategory(SEGMENTS);
+                                       document.addPositionUpdater(fPositionUpdater);
+
+                                       parse(document);
+                               }
+                       }
+               }
+
+               /*
+                * @see IContentProvider#dispose
+                */
+               public void dispose() {
+                       if (fContent != null) {
+                               fContent.clear();
+                               fContent= null;
+                       }
+               }
+
+               /*
+                * @see IContentProvider#isDeleted(Object)
+                */
+               public boolean isDeleted(Object element) {
+                       return false;
+               }
+
+               /*
+                * @see IStructuredContentProvider#getElements(Object)
+                */
+               public Object[] getElements(Object element) {
+                       return fContent.toArray();
+               }
+
+               /*
+                * @see ITreeContentProvider#hasChildren(Object)
+                */
+               public boolean hasChildren(Object element) {
+                       return element == fInput;
+               }
+
+               /*
+                * @see ITreeContentProvider#getParent(Object)
+                */
+               public Object getParent(Object element) {
+                       if (element instanceof Segment)
+                               return fInput;
+                       return null;
+               }
+
+               /*
+                * @see ITreeContentProvider#getChildren(Object)
+                */
+               public Object[] getChildren(Object element) {
+                       if (element == fInput)
+                               return fContent.toArray();
+                       return new Object[0];
+               }
+       };
+
+       protected Object fInput;
+       protected IDocumentProvider fDocumentProvider;
+       protected ITextEditor fTextEditor;
+
+       /**
+        * Creates a content outline page using the given provider and the given editor.
+        */
+       public PHPContentOutlinePage(IDocumentProvider provider, ITextEditor editor) {
+               super();
+               fDocumentProvider= provider;
+               fTextEditor= editor;
+       }
+       
+       /* (non-Javadoc)
+        * Method declared on ContentOutlinePage
+        */
+       public void createControl(Composite parent) {
+
+               super.createControl(parent);
+
+               TreeViewer viewer= getTreeViewer();
+               viewer.setContentProvider(new ContentProvider());
+               viewer.setLabelProvider(new LabelProvider());
+               viewer.addSelectionChangedListener(this);
+
+               if (fInput != null)
+                       viewer.setInput(fInput);
+       }
+       
+       /* (non-Javadoc)
+        * Method declared on ContentOutlinePage
+        */
+       public void selectionChanged(SelectionChangedEvent event) {
+
+               super.selectionChanged(event);
+
+               ISelection selection= event.getSelection();
+               if (selection.isEmpty())
+                       fTextEditor.resetHighlightRange();
+               else {
+                       Segment segment= (Segment) ((IStructuredSelection) selection).getFirstElement();
+                       int start= segment.position.getOffset();
+                       int length= segment.position.getLength();
+                       try {
+                               fTextEditor.setHighlightRange(start, length, true);
+                       } catch (IllegalArgumentException x) {
+                               fTextEditor.resetHighlightRange();
+                       }
+               }
+       }
+       
+       /**
+        * Sets the input of the outline page
+        */
+       public void setInput(Object input) {
+               fInput= input;
+               update();
+       }
+       
+       /**
+        * Updates the outline page.
+        */
+       public void update() {
+               TreeViewer viewer= getTreeViewer();
+
+               if (viewer != null) {
+                       Control control= viewer.getControl();
+                       if (control != null && !control.isDisposed()) {
+                               control.setRedraw(false);
+                               viewer.setInput(fInput);
+                               viewer.expandAll();
+                               control.setRedraw(true);
+                       }
+               }
+       }
+}