package com.redhat.ceylon.eclipse.code.search; import java.util.HashSet; import java.util.Set; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.search.ui.text.AbstractTextSearchResult; import org.eclipse.swt.widgets.Table; class CeylonSearchResultContentProvider implements CeylonStructuredContentProvider { private static final Object[] EMPTY_ARR= new Object[0]; private final TableViewer viewer; private CeylonSearchResult result; private CeylonSearchResultPage page; CeylonSearchResultContentProvider(TableViewer viewer, CeylonSearchResultPage page) { this.viewer = viewer; this.page = page; } @Override public void dispose() {} @Override public Object[] getElements(Object input) { if (input instanceof AbstractTextSearchResult) { Set<Object> filteredElements = new HashSet<Object>(); AbstractTextSearchResult searchResult = (AbstractTextSearchResult) input; Object[] rawElements = searchResult.getElements(); int limit = page.getElementLimit().intValue(); for (int i=0; i<rawElements.length; i++) { Object element = rawElements[i]; if (page.getDisplayedMatchCount(element)>0) { filteredElements.add(element); if (limit!=-1 && limit<filteredElements.size()) { break; } } } return filteredElements.toArray(); } return EMPTY_ARR; } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { if (newInput instanceof CeylonSearchResult) { result = (CeylonSearchResult) newInput; } } public void elementsChanged(Object[] updatedElements) { if (result!=null) { int addLimit = getAddLimit(); Set<Object> updated = new HashSet<Object>(); Set<Object> added = new HashSet<Object>(); Set<Object> removed = new HashSet<Object>(); for (int i=0; i<updatedElements.length; i++) { Object element = updatedElements[i]; if (page.getDisplayedMatchCount(element)>0) { if (viewer.testFindItem(element)!=null) { updated.add(element); } else { if (addLimit>0) { added.add(element); addLimit--; } } } else { removed.add(element); } } viewer.add(added.toArray()); viewer.update(updated.toArray(), null); viewer.remove(removed.toArray()); } } private int getAddLimit() { int limit = page.getElementLimit().intValue(); if (limit!=-1) { Table table = (Table) viewer.getControl(); int itemCount = table.getItemCount(); if (itemCount>=limit) { return 0; } return limit-itemCount; } return Integer.MAX_VALUE; } @Override public void clear() { viewer.refresh(); } @Override public void setLevel(int grouping) { //ignore } @Override public void setShowCategories(boolean showCategories) { //ignore } }