package com.redhat.ceylon.eclipse.code.preferences; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.SearchPattern; import com.redhat.ceylon.eclipse.util.DocBrowser; public abstract class FilteredElementTreeSelectionDialog extends ElementTreeSelectionDialog { public FilteredElementTreeSelectionDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) { super(parent, labelProvider, contentProvider); } protected abstract String getElementName(Object element); protected boolean isCategory(Object element) { return false; } private Text createFilterText(Composite parent) { final Text text = new Text(parent, SWT.BORDER); final SearchPattern searchPattern = new SearchPattern(); searchPattern.setPattern(""); addFilter(new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (searchPattern.matches(getElementName(element))) { return true; } // if (isCategory(element) && // !getTreeViewer().getExpandedState(element)) { // //don't go to the server and // //fetch children just to filter // //out an unexpanded category // return true; // } Object[] children = ((ITreeContentProvider)getTreeViewer().getContentProvider()) .getChildren(element); if (children==null) return false; for (Object child: children) { if (select(viewer, element, child)) { return true; } } return false; } }); GridData data = new GridData(); data.grabExcessVerticalSpace = false; data.grabExcessHorizontalSpace = true; data.horizontalAlignment = GridData.FILL; data.verticalAlignment = GridData.BEGINNING; text.setLayoutData(data); text.setFont(parent.getFont()); text.setText(""); text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { searchPattern.setPattern(text.getText()); getTreeViewer().refresh(); } }); return text; } @Override protected Label createMessageArea(Composite composite) { Label result = super.createMessageArea(composite); createFilterText(composite); return result; } @Override protected Control createDialogArea(Composite parent) { GridData gridData = new GridData(GridData.FILL_BOTH); gridData.grabExcessHorizontalSpace = true; SashForm sashForm = new SashForm(parent, SWT.VERTICAL); Control result = super.createDialogArea(sashForm); // getTreeViewer().setSorter(new ViewerSorter()); Composite composite = new Composite(sashForm, SWT.BORDER); composite.setLayoutData(gridData); GridLayout layout = new GridLayout(1, true); layout.marginWidth=0; layout.marginHeight=0; composite.setLayout(layout); final DocBrowser browser = new DocBrowser(composite, SWT.NONE); sashForm.setWeights(new int[] {3, 1}); sashForm.setLayoutData(gridData); getTreeViewer().addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { browser.setText(getDoc()); } }); return result; } protected String getDoc() { return ""; } }