/******************************************************************************* * Copyright (c) 2009 University of Edinburgh. * All rights reserved. This program and the accompanying materials are made * available under the terms of the BSD Licence, which accompanies this feature * and can be downloaded from http://groups.inf.ed.ac.uk/pepa/update/licence.txt ******************************************************************************/ package uk.ac.ed.inf.biopepa.ui.views; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.views.contentoutline.ContentOutlinePage; import uk.ac.ed.inf.biopepa.core.sba.OutlineAnalyser; import uk.ac.ed.inf.biopepa.core.sba.SimpleTree; import uk.ac.ed.inf.biopepa.ui.BioPEPAEvent; import uk.ac.ed.inf.biopepa.ui.interfaces.BioPEPAListener; import uk.ac.ed.inf.biopepa.ui.interfaces.BioPEPAModel; public class BioPEPAOutline extends ContentOutlinePage implements BioPEPAListener { private Runnable runnable = new Runnable() { public void run() { TreeViewer tv = getTreeViewer(); tv.setInput(bt); if(expanded != null) tv.setExpandedElements(expanded); } }; public BioPEPAOutline(BioPEPAModel model) { this.model = model; } private class OutlineContentProvider extends ArrayContentProvider implements ITreeContentProvider { public Object[] getChildren(Object parentElement) { return ((SimpleTree) parentElement).getChildren(); } public Object getParent(Object element) { return ((SimpleTree) element).getParent(); } public boolean hasChildren(Object element) { return ((SimpleTree) element).getChildren().length != 0; } } private class OutlineLabelProvider extends LabelProvider { public String getText(Object element) { return ((SimpleTree) element).getName(); } } private BioPEPAModel model; private SimpleTree[] bt; private Object[] expanded; public void modelChanged(BioPEPAEvent event) { if (event.getEvent().equals(BioPEPAEvent.Event.PARSED) || event.getEvent().equals(BioPEPAEvent.Event.MODIFIED)) { refreshTree(); } else if (event.getEvent().equals(BioPEPAEvent.Event.EXCEPTION)) refreshTree(); } public void createControl(Composite parent) { super.createControl(parent); getTreeViewer().setContentProvider(new OutlineContentProvider()); getTreeViewer().setLabelProvider(new OutlineLabelProvider()); refreshTree(); } private void refreshTree() { OutlineAnalyser outlineanalyser = new OutlineAnalyser(); this.expanded = null; SimpleTree[] newtree = outlineanalyser.createOutlineTree(model.getSBAModel()); /* If the current tree is not null, then we may have some * elements of the tree which are expanded. So it is good * to have them remain expanded even if the tree has been * updated. TODO: please check that this actually works? */ if(bt != null) { // getTreeViewer is only accessible from the UI thread Display.getDefault().syncExec(new Runnable() { public void run() { TreeViewer tv = getTreeViewer(); expanded = tv.getExpandedElements(); } }); } bt = newtree; Display.getDefault().asyncExec(runnable); } }