X-Git-Url: http://git.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 new file mode 100644 index 0000000..d7ab260 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPContentOutlinePage.java @@ -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); + } + } + } +}