package org.easyb.ui.editor;
import org.easyb.ui.EasybUIActivator;
import org.easyb.ui.editor.partitionmodel.Behaviour;
import org.easyb.ui.editor.partitionmodel.IModelElement;
import org.easyb.ui.editor.partitionmodel.KeywordPosition;
import org.easyb.ui.editor.partitionmodel.PartitionModelException;
import org.eclipse.jface.text.IDocument;
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.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;
public class BehaviourOutlinePage extends ContentOutlinePage {
private Object input;
private IDocumentProvider docProvider;
ITextEditor editor;
private class OutlineContentLabelProvider extends LabelProvider{
public String getText(Object element){
return ((IModelElement)element).getText();
}
}
private class OutlineContentProvider implements ITreeContentProvider{
Behaviour model = new Behaviour();
@Override
public Object[] getChildren(Object element) {
return ((IModelElement)element).getElements();
}
@Override
public Object getParent(Object element) {
return ((IModelElement)element).getParent();
}
@Override
public boolean hasChildren(Object element) {
return ((IModelElement)element).hasChildren();
}
@Override
public Object[] getElements(Object element) {
return model.getElements();
}
@Override
public void dispose() {
model.clear();
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
try {
if (newInput != null) {
IDocument document= docProvider.getDocument(newInput);
if (document != null) {
model.createModel(document);
}
}
} catch (PartitionModelException e) {
EasybUIActivator.Log("Unable to update behaviour model for outline view",e);
}
}
}
public BehaviourOutlinePage( ITextEditor editor){
this.docProvider = editor.getDocumentProvider();
this.editor = editor;
}
public void createControl(Composite parent){
super.createControl(parent);
TreeViewer viewer= getTreeViewer();
viewer.setContentProvider(new OutlineContentProvider());
viewer.setLabelProvider(new OutlineContentLabelProvider());
if(input!=null){
viewer.setInput(input);
}
}
/**
* Sets the input of the outline page in the tree viewer
* and holds a reference to the input for updating
* @param input
*/
public void setInput(Object input){
this.input = input;
TreeViewer viewer= getTreeViewer();
if(viewer==null){
return;
}
Control control= viewer.getControl();
if (control != null && !control.isDisposed()) {
control.setRedraw(false);
viewer.setInput(input);
viewer.expandAll();
control.setRedraw(true);
}
}
/**
* 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(input);
viewer.expandAll();
control.setRedraw(true);
}
}
}
/**
*
*/
public void selectionChanged(SelectionChangedEvent event)
{
super.selectionChanged(event);
ISelection selection = event.getSelection();
if(selection.isEmpty()){
editor.resetHighlightRange();
}else{
IStructuredSelection stcSelect = (IStructuredSelection)selection;
IModelElement element = (IModelElement)stcSelect.getFirstElement();
KeywordPosition pos = element.getFirstKeywordPosition();
int offset = pos.getOffset();
int length = pos.getLength();
try{
editor.setHighlightRange(offset, length,true);
editor.selectAndReveal(offset, length);
}catch(IllegalArgumentException ex)
{
EasybUIActivator.Log("Unable to set cursor in editor from outline", ex);
editor.resetHighlightRange();
}
}
}
}