package enfo.ui.view; import java.util.HashSet; import java.util.Set; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IMemento; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.PatternFilter; import org.eclipse.ui.views.IViewCategory; import org.eclipse.ui.views.IViewDescriptor; import org.eclipse.ui.views.IViewRegistry; import enfo.ui.EnfoView; import enfo.ui.FilteredTreePanel; public class ViewPanel extends FilteredTreePanel { private static final String MEMENTO_CATEGORY = "expandedViewCategories"; private static final String MEMENTO_ELEMENT = "categoryId"; public ViewPanel(EnfoView p) { super(p); } @Override protected ViewerComparator createComparator() { return new ViewComparator(); } @Override protected ITreeContentProvider createContentProvider() { return new ViewContentProvider(); } @Override public Composite createContents(Composite parent) { Composite cmp = super.createContents(parent); TreeViewer viewer = getFilteredTree().getViewer(); viewer.addFilter(createFilter()); viewer.addSelectionChangedListener(this); viewer.addDoubleClickListener(this); return cmp; } protected ViewerFilter createFilter() { return new ViewFilter(); } @Override protected IBaseLabelProvider createLabelProvider() { return new ViewLabelProvider(); } @Override protected PatternFilter createPatternFilter() { return new ViewPatternFilter(); } @Override protected void doubleClickOnLeaf(Object o) { if (!(o instanceof IViewDescriptor)) { return; } IWorkbenchPage pg = getParent().getSite().getWorkbenchWindow() .getActivePage(); if (pg == null) { return; } try { IViewDescriptor v = (IViewDescriptor) o; pg.showView(v.getId(), null, IWorkbenchPage.VIEW_VISIBLE); } catch (PartInitException ex) { } super.doubleClickOnLeaf(o); } @Override protected String getFilterMessage() { return "Search by name or ID"; } @Override protected Object getInput() { return PlatformUI.getWorkbench().getViewRegistry(); } @Override protected String getMessage(Object o) { if (o instanceof IViewCategory) { return ((IViewCategory) o).getId(); } else if (o instanceof IViewDescriptor) { return ((IViewDescriptor) o).getId(); } return super.getMessage(o); } @Override public void restoreState(IMemento memento) { IMemento m = memento.getChild(MEMENTO_CATEGORY); if (m == null) { return; } Set<IViewCategory> result = new HashSet<IViewCategory>(); IViewRegistry r = PlatformUI.getWorkbench().getViewRegistry(); for (IViewCategory c : r.getCategories()) { for (IMemento child : m.getChildren(MEMENTO_ELEMENT)) { if (c.getId().equals(child.getTextData())) { result.add(c); } } } getFilteredTree().getViewer().setExpandedElements(result.toArray()); } @Override public void saveState(IMemento memento) { IMemento m = memento.createChild(MEMENTO_CATEGORY); Object[] expanded = getFilteredTree().getViewer().getExpandedElements(); for (Object o : expanded) { m.createChild(MEMENTO_ELEMENT).putTextData( ((IViewCategory) o).getId()); } } }