package org.eclipse.ui.examples.javaeditor; | |
/* | |
* (c) Copyright IBM Corp. 2000, 2001. | |
* All Rights Reserved. | |
*/ | |
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 JavaContentOutlinePage 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(JavaEditorMessages.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 JavaContentOutlinePage(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); | |
} | |
} | |
} | |
} |