| /******************************************************************************* |
| * Copyright (c) 2000, 2006 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.ui.search; |
| |
| import com.ibm.icu.text.Collator; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IAdaptable; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IMarker; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.dnd.DND; |
| import org.eclipse.swt.dnd.Transfer; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Item; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.Tree; |
| import org.eclipse.swt.widgets.Widget; |
| |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.action.IToolBarManager; |
| import org.eclipse.jface.action.MenuManager; |
| import org.eclipse.jface.action.Separator; |
| import org.eclipse.jface.util.TransferDragSourceListener; |
| import org.eclipse.jface.viewers.DecoratingLabelProvider; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.OpenEvent; |
| import org.eclipse.jface.viewers.StructuredViewer; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jface.viewers.ViewerSorter; |
| |
| import org.eclipse.ui.IActionBars; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IMemento; |
| import org.eclipse.ui.IPageLayout; |
| import org.eclipse.ui.PartInitException; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.actions.ActionContext; |
| import org.eclipse.ui.dialogs.PreferencesUtil; |
| import org.eclipse.ui.part.IPageSite; |
| import org.eclipse.ui.part.IShowInTargetList; |
| import org.eclipse.ui.part.ResourceTransfer; |
| import org.eclipse.ui.texteditor.ITextEditor; |
| |
| import org.eclipse.ui.views.navigator.LocalSelectionTransfer; |
| |
| import org.eclipse.ui.ide.IDE; |
| |
| import org.eclipse.search.ui.IContextMenuConstants; |
| import org.eclipse.search.ui.ISearchResult; |
| import org.eclipse.search.ui.ISearchResultViewPart; |
| import org.eclipse.search.ui.NewSearchUI; |
| import org.eclipse.search.ui.SearchResultEvent; |
| import org.eclipse.search.ui.text.AbstractTextSearchResult; |
| import org.eclipse.search.ui.text.AbstractTextSearchViewPage; |
| import org.eclipse.search.ui.text.Match; |
| |
| import org.eclipse.jdt.core.IClassFile; |
| import org.eclipse.jdt.core.ICompilationUnit; |
| import org.eclipse.jdt.core.IMember; |
| import org.eclipse.jdt.core.JavaModelException; |
| |
| import org.eclipse.jdt.internal.corext.util.Messages; |
| |
| import org.eclipse.jdt.ui.JavaUI; |
| import org.eclipse.jdt.ui.search.IMatchPresentation; |
| |
| import org.eclipse.jdt.internal.ui.JavaPlugin; |
| import org.eclipse.jdt.internal.ui.JavaPluginImages; |
| import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter; |
| import org.eclipse.jdt.internal.ui.dnd.ResourceTransferDragAdapter; |
| import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDragAdapter; |
| import org.eclipse.jdt.internal.ui.search.JavaSearchResult.MatchFilterEvent; |
| import org.eclipse.jdt.internal.ui.util.ExceptionHandler; |
| import org.eclipse.jdt.internal.ui.viewsupport.ProblemTableViewer; |
| import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer; |
| |
| public class JavaSearchResultPage extends AbstractTextSearchViewPage implements IAdaptable { |
| |
| public static class DecoratorIgnoringViewerSorter extends ViewerSorter { |
| |
| private final ILabelProvider fLabelProvider; |
| private Collator fNewCollator; |
| |
| |
| public DecoratorIgnoringViewerSorter(ILabelProvider labelProvider) { |
| super(null); // lazy initialization |
| fLabelProvider= labelProvider; |
| fNewCollator= null; |
| } |
| |
| public int compare(Viewer viewer, Object e1, Object e2) { |
| String name1= fLabelProvider.getText(e1); |
| String name2= fLabelProvider.getText(e2); |
| if (name1 == null) |
| name1 = "";//$NON-NLS-1$ |
| if (name2 == null) |
| name2 = "";//$NON-NLS-1$ |
| return getNewCollator().compare(name1, name2); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ViewerSorter#getCollator() |
| */ |
| public final java.text.Collator getCollator() { |
| // kept in for API compatibility |
| if (collator == null) { |
| collator= java.text.Collator.getInstance(); |
| } |
| return collator; |
| } |
| |
| private final Collator getNewCollator() { |
| if (fNewCollator == null) { |
| fNewCollator= Collator.getInstance(); |
| } |
| return fNewCollator; |
| } |
| } |
| |
| |
| private static final int DEFAULT_ELEMENT_LIMIT = 1000; |
| private static final String FALSE = "FALSE"; //$NON-NLS-1$ |
| private static final String TRUE = "TRUE"; //$NON-NLS-1$ |
| private static final String KEY_GROUPING= "org.eclipse.jdt.search.resultpage.grouping"; //$NON-NLS-1$ |
| private static final String KEY_SORTING= "org.eclipse.jdt.search.resultpage.sorting"; //$NON-NLS-1$ |
| private static final String KEY_LIMIT_ENABLED= "org.eclipse.jdt.search.resultpage.limit_enabled"; //$NON-NLS-1$ |
| private static final String KEY_LIMIT= "org.eclipse.jdt.search.resultpage.limit"; //$NON-NLS-1$ |
| |
| private static final String GROUP_GROUPING= "org.eclipse.jdt.search.resultpage.grouping"; //$NON-NLS-1$ |
| private static final String GROUP_FILTERING = "org.eclipse.jdt.search.resultpage.filtering"; //$NON-NLS-1$ |
| |
| private NewSearchViewActionGroup fActionGroup; |
| private JavaSearchContentProvider fContentProvider; |
| private int fCurrentSortOrder; |
| private SortAction fSortByNameAction; |
| private SortAction fSortByParentName; |
| private SortAction fSortByPathAction; |
| |
| private GroupAction fGroupTypeAction; |
| private GroupAction fGroupFileAction; |
| private GroupAction fGroupPackageAction; |
| private GroupAction fGroupProjectAction; |
| private int fCurrentGrouping; |
| |
| private FilterAction[] fFilterActions; |
| private FiltersDialogAction fFilterDialogAction; |
| |
| private static final String[] SHOW_IN_TARGETS= new String[] { JavaUI.ID_PACKAGES , IPageLayout.ID_RES_NAV }; |
| public static final IShowInTargetList SHOW_IN_TARGET_LIST= new IShowInTargetList() { |
| public String[] getShowInTargetIds() { |
| return SHOW_IN_TARGETS; |
| } |
| }; |
| |
| private JavaSearchEditorOpener fEditorOpener= new JavaSearchEditorOpener(); |
| private boolean fLimitElements= false; |
| private int fElementLimit; |
| |
| public JavaSearchResultPage() { |
| initSortActions(); |
| initGroupingActions(); |
| initFilterActions(); |
| } |
| |
| private void initFilterActions() { |
| MatchFilter[] allFilters= MatchFilter.allFilters(); |
| fFilterActions= new FilterAction[allFilters.length]; |
| for (int i= 0; i < fFilterActions.length; i++) { |
| fFilterActions[i]= new FilterAction(this, allFilters[i]); |
| fFilterActions[i].setId("org.eclipse.jdt.search.filters."+i); //$NON-NLS-1$ |
| } |
| fFilterDialogAction= new FiltersDialogAction(this); |
| fFilterDialogAction.setId("org.eclipse.jdt.search.filters."+allFilters.length); //$NON-NLS-1$ |
| JavaPluginImages.setLocalImageDescriptors(fFilterDialogAction, "filter_ps.gif"); //$NON-NLS-1$ |
| } |
| |
| private void initSortActions() { |
| fSortByNameAction= new SortAction(SearchMessages.JavaSearchResultPage_sortByName, this, SortingLabelProvider.SHOW_ELEMENT_CONTAINER); |
| fSortByPathAction= new SortAction(SearchMessages.JavaSearchResultPage_sortByPath, this, SortingLabelProvider.SHOW_PATH); |
| fSortByParentName= new SortAction(SearchMessages.JavaSearchResultPage_sortByParentName, this, SortingLabelProvider.SHOW_CONTAINER_ELEMENT); |
| } |
| |
| private void initGroupingActions() { |
| fGroupProjectAction= new GroupAction(SearchMessages.JavaSearchResultPage_groupby_project, SearchMessages.JavaSearchResultPage_groupby_project_tooltip, this, LevelTreeContentProvider.LEVEL_PROJECT); |
| JavaPluginImages.setLocalImageDescriptors(fGroupProjectAction, "prj_mode.gif"); //$NON-NLS-1$ |
| fGroupPackageAction= new GroupAction(SearchMessages.JavaSearchResultPage_groupby_package, SearchMessages.JavaSearchResultPage_groupby_package_tooltip, this, LevelTreeContentProvider.LEVEL_PACKAGE); |
| JavaPluginImages.setLocalImageDescriptors(fGroupPackageAction, "package_mode.gif"); //$NON-NLS-1$ |
| fGroupFileAction= new GroupAction(SearchMessages.JavaSearchResultPage_groupby_file, SearchMessages.JavaSearchResultPage_groupby_file_tooltip, this, LevelTreeContentProvider.LEVEL_FILE); |
| JavaPluginImages.setLocalImageDescriptors(fGroupFileAction, "file_mode.gif"); //$NON-NLS-1$ |
| fGroupTypeAction= new GroupAction(SearchMessages.JavaSearchResultPage_groupby_type, SearchMessages.JavaSearchResultPage_groupby_type_tooltip, this, LevelTreeContentProvider.LEVEL_TYPE); |
| JavaPluginImages.setLocalImageDescriptors(fGroupTypeAction, "type_mode.gif"); //$NON-NLS-1$ |
| } |
| |
| public void setViewPart(ISearchResultViewPart part) { |
| super.setViewPart(part); |
| fActionGroup= new NewSearchViewActionGroup(part); |
| } |
| |
| public void showMatch(Match match, int offset, int length, boolean activate) throws PartInitException { |
| IEditorPart editor; |
| try { |
| editor= fEditorOpener.openMatch(match); |
| } catch (JavaModelException e) { |
| throw new PartInitException(e.getStatus()); |
| } |
| |
| if (editor != null && activate) |
| editor.getEditorSite().getPage().activate(editor); |
| Object element= match.getElement(); |
| if (editor instanceof ITextEditor) { |
| ITextEditor textEditor= (ITextEditor) editor; |
| textEditor.selectAndReveal(offset, length); |
| } else if (editor != null){ |
| if (element instanceof IFile) { |
| IFile file= (IFile) element; |
| showWithMarker(editor, file, offset, length); |
| } |
| } else { |
| JavaSearchResult result= (JavaSearchResult) getInput(); |
| IMatchPresentation participant= result.getSearchParticpant(element); |
| if (participant != null) |
| participant.showMatch(match, offset, length, activate); |
| } |
| } |
| |
| private void showWithMarker(IEditorPart editor, IFile file, int offset, int length) throws PartInitException { |
| try { |
| IMarker marker= file.createMarker(NewSearchUI.SEARCH_MARKER); |
| HashMap attributes= new HashMap(4); |
| attributes.put(IMarker.CHAR_START, new Integer(offset)); |
| attributes.put(IMarker.CHAR_END, new Integer(offset + length)); |
| marker.setAttributes(attributes); |
| IDE.gotoMarker(editor, marker); |
| marker.delete(); |
| } catch (CoreException e) { |
| throw new PartInitException(SearchMessages.JavaSearchResultPage_error_marker, e); |
| } |
| } |
| |
| protected void fillContextMenu(IMenuManager mgr) { |
| super.fillContextMenu(mgr); |
| addSortActions(mgr); |
| |
| fActionGroup.setContext(new ActionContext(getSite().getSelectionProvider().getSelection())); |
| fActionGroup.fillContextMenu(mgr); |
| } |
| |
| private void addSortActions(IMenuManager mgr) { |
| if (getLayout() != FLAG_LAYOUT_FLAT) |
| return; |
| MenuManager sortMenu= new MenuManager(SearchMessages.JavaSearchResultPage_sortBylabel); |
| sortMenu.add(fSortByNameAction); |
| sortMenu.add(fSortByPathAction); |
| sortMenu.add(fSortByParentName); |
| |
| fSortByNameAction.setChecked(fCurrentSortOrder == fSortByNameAction.getSortOrder()); |
| fSortByPathAction.setChecked(fCurrentSortOrder == fSortByPathAction.getSortOrder()); |
| fSortByParentName.setChecked(fCurrentSortOrder == fSortByParentName.getSortOrder()); |
| |
| mgr.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, sortMenu); |
| } |
| |
| protected void fillToolbar(IToolBarManager tbm) { |
| super.fillToolbar(tbm); |
| if (getLayout() != FLAG_LAYOUT_FLAT) |
| addGroupActions(tbm); |
| } |
| |
| private void addGroupActions(IToolBarManager mgr) { |
| mgr.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, new Separator(GROUP_GROUPING)); |
| mgr.appendToGroup(GROUP_GROUPING, fGroupProjectAction); |
| mgr.appendToGroup(GROUP_GROUPING, fGroupPackageAction); |
| mgr.appendToGroup(GROUP_GROUPING, fGroupFileAction); |
| mgr.appendToGroup(GROUP_GROUPING, fGroupTypeAction); |
| |
| updateGroupingActions(); |
| } |
| |
| |
| private void updateGroupingActions() { |
| fGroupProjectAction.setChecked(fCurrentGrouping == LevelTreeContentProvider.LEVEL_PROJECT); |
| fGroupPackageAction.setChecked(fCurrentGrouping == LevelTreeContentProvider.LEVEL_PACKAGE); |
| fGroupFileAction.setChecked(fCurrentGrouping == LevelTreeContentProvider.LEVEL_FILE); |
| fGroupTypeAction.setChecked(fCurrentGrouping == LevelTreeContentProvider.LEVEL_TYPE); |
| } |
| |
| |
| public void dispose() { |
| fActionGroup.dispose(); |
| super.dispose(); |
| } |
| |
| protected void elementsChanged(Object[] objects) { |
| if (fContentProvider != null) |
| fContentProvider.elementsChanged(objects); |
| } |
| |
| protected void clear() { |
| if (fContentProvider != null) |
| fContentProvider.clear(); |
| } |
| |
| private void addDragAdapters(StructuredViewer viewer) { |
| Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance(), ResourceTransfer.getInstance() }; |
| int ops= DND.DROP_COPY | DND.DROP_LINK; |
| |
| TransferDragSourceListener[] dragListeners= new TransferDragSourceListener[] { |
| new SelectionTransferDragAdapter(viewer), |
| new ResourceTransferDragAdapter(viewer) |
| }; |
| |
| viewer.addDragSupport(ops, transfers, new JdtViewerDragAdapter(viewer, dragListeners)); |
| } |
| |
| protected void configureTableViewer(TableViewer viewer) { |
| viewer.setUseHashlookup(true); |
| SortingLabelProvider sortingLabelProvider= new SortingLabelProvider(this); |
| viewer.setLabelProvider(new ColorDecoratingLabelProvider(sortingLabelProvider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator())); |
| fContentProvider=new JavaSearchTableContentProvider(this); |
| viewer.setContentProvider(fContentProvider); |
| viewer.setSorter(new DecoratorIgnoringViewerSorter(sortingLabelProvider)); |
| setSortOrder(fCurrentSortOrder); |
| addDragAdapters(viewer); |
| } |
| |
| protected void configureTreeViewer(TreeViewer viewer) { |
| PostfixLabelProvider postfixLabelProvider= new PostfixLabelProvider(this); |
| viewer.setUseHashlookup(true); |
| viewer.setSorter(new DecoratorIgnoringViewerSorter(postfixLabelProvider)); |
| viewer.setLabelProvider(new ColorDecoratingLabelProvider(postfixLabelProvider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator())); |
| fContentProvider= new LevelTreeContentProvider(this, fCurrentGrouping); |
| viewer.setContentProvider(fContentProvider); |
| addDragAdapters(viewer); |
| } |
| |
| protected TreeViewer createTreeViewer(Composite parent) { |
| return new ProblemTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL) { |
| public void add(Object parentElement, Object[] childElements) { |
| if (limitElements() && parentElement.equals(getInput())) { |
| int elementLimit= getElementLimit(); |
| Widget parentWidget= findItem(parentElement); |
| if (parentWidget == null) |
| return; |
| Item[] children= getChildren(parentWidget); |
| if (children.length >= elementLimit) |
| return; |
| if (children.length + childElements.length <= elementLimit) { |
| super.add(parentElement, childElements); |
| return; |
| } |
| int toAdd= elementLimit-children.length; |
| Object[] limited= new Object[toAdd]; |
| System.arraycopy(childElements, 0, limited, 0, limited.length); |
| super.add(parentElement, limited); |
| return; |
| } else { |
| super.add(parentElement, childElements); |
| } |
| } |
| |
| protected Object[] getFilteredChildren(Object parentElement) { |
| if (parentElement == null) |
| return new Object[0]; |
| Object[] filtered= super.getFilteredChildren(parentElement); |
| int elementLimit = getElementLimit(); |
| if (limitElements() && parentElement.equals(getInput()) && filtered.length > elementLimit) { |
| Object[] limited= new Object[elementLimit]; |
| System.arraycopy(filtered, 0, limited, 0, limited.length); |
| return limited; |
| } else |
| return filtered; |
| } |
| }; |
| } |
| |
| int getElementLimit() { |
| return fElementLimit; |
| } |
| |
| protected TableViewer createTableViewer(Composite parent) { |
| return new ProblemTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL) { |
| |
| public void add(Object[] elements) { |
| if (limitElements()) { |
| int elementLimit= getElementLimit(); |
| int currentCount= getTable().getItemCount(); |
| if (currentCount >= elementLimit) |
| return; |
| if (currentCount + elements.length <= elementLimit) { |
| super.add(elements); |
| return; |
| } |
| int toAdd= elementLimit-currentCount; |
| Object[] limited= new Object[toAdd]; |
| System.arraycopy(elements, 0, limited, 0, limited.length); |
| super.add(limited); |
| return; |
| } else { |
| super.add(elements); |
| } |
| } |
| |
| protected Object[] getFilteredChildren(Object parentElement) { |
| if (parentElement == null) |
| return new Object[0]; |
| Object[] filtered= super.getFilteredChildren(parentElement); |
| int elementLimit = getElementLimit(); |
| if (limitElements() && parentElement.equals(getInput()) && filtered.length > elementLimit) { |
| Object[] limited= new Object[elementLimit]; |
| System.arraycopy(filtered, 0, limited, 0, limited.length); |
| return limited; |
| } else |
| return filtered; |
| } |
| }; |
| } |
| |
| void setSortOrder(int order) { |
| fCurrentSortOrder= order; |
| StructuredViewer viewer= getViewer(); |
| viewer.getControl().setRedraw(false); |
| DecoratingLabelProvider dlp= (DecoratingLabelProvider) viewer.getLabelProvider(); |
| ((SortingLabelProvider)dlp.getLabelProvider()).setOrder(order); |
| viewer.getControl().setRedraw(true); |
| viewer.refresh(); |
| getSettings().put(KEY_SORTING, fCurrentSortOrder); |
| } |
| |
| public void init(IPageSite site) { |
| super.init(site); |
| IMenuManager menuManager = site.getActionBars().getMenuManager(); |
| menuManager.insertBefore(IContextMenuConstants.GROUP_PROPERTIES, new Separator(GROUP_FILTERING)); |
| fActionGroup.fillActionBars(site.getActionBars()); |
| menuManager.appendToGroup(GROUP_FILTERING, fFilterDialogAction); |
| menuManager.appendToGroup(IContextMenuConstants.GROUP_PROPERTIES, new Action(SearchMessages.JavaSearchResultPage_preferences_label) { |
| public void run() { |
| String pageId= "org.eclipse.search.preferences.SearchPreferencePage"; //$NON-NLS-1$ |
| PreferencesUtil.createPreferenceDialogOn(JavaPlugin.getActiveWorkbenchShell(), pageId, null, null).open(); |
| } |
| }); |
| } |
| |
| /** |
| * Precondition here: the viewer must be showing a tree with a LevelContentProvider. |
| * @param grouping |
| */ |
| void setGrouping(int grouping) { |
| fCurrentGrouping= grouping; |
| StructuredViewer viewer= getViewer(); |
| LevelTreeContentProvider cp= (LevelTreeContentProvider) viewer.getContentProvider(); |
| cp.setLevel(grouping); |
| updateGroupingActions(); |
| getSettings().put(KEY_GROUPING, fCurrentGrouping); |
| getViewPart().updateLabel(); |
| } |
| |
| protected StructuredViewer getViewer() { |
| // override so that it's visible in the package. |
| return super.getViewer(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#restoreState(org.eclipse.ui.IMemento) |
| */ |
| public void restoreState(IMemento memento) { |
| super.restoreState(memento); |
| try { |
| fCurrentSortOrder= getSettings().getInt(KEY_SORTING); |
| } catch (NumberFormatException e) { |
| fCurrentSortOrder= SortingLabelProvider.SHOW_ELEMENT_CONTAINER; |
| } |
| try { |
| fCurrentGrouping= getSettings().getInt(KEY_GROUPING); |
| } catch (NumberFormatException e) { |
| fCurrentGrouping= LevelTreeContentProvider.LEVEL_PACKAGE; |
| } |
| fLimitElements= !FALSE.equals(getSettings().get(KEY_LIMIT_ENABLED)); |
| try { |
| fElementLimit= getSettings().getInt(KEY_LIMIT); |
| } catch (NumberFormatException e) { |
| fElementLimit= DEFAULT_ELEMENT_LIMIT; |
| } |
| if (memento != null) { |
| Integer value= memento.getInteger(KEY_GROUPING); |
| if (value != null) |
| fCurrentGrouping= value.intValue(); |
| value= memento.getInteger(KEY_SORTING); |
| if (value != null) |
| fCurrentSortOrder= value.intValue(); |
| fLimitElements= !FALSE.equals(memento.getString(KEY_LIMIT_ENABLED)); |
| value= memento.getInteger(KEY_LIMIT); |
| if (value != null) |
| fElementLimit= value.intValue(); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#saveState(org.eclipse.ui.IMemento) |
| */ |
| public void saveState(IMemento memento) { |
| super.saveState(memento); |
| memento.putInteger(KEY_GROUPING, fCurrentGrouping); |
| memento.putInteger(KEY_SORTING, fCurrentSortOrder); |
| if (fLimitElements) |
| memento.putString(KEY_LIMIT_ENABLED, TRUE); |
| else |
| memento.putString(KEY_LIMIT_ENABLED, FALSE); |
| memento.putInteger(KEY_LIMIT, getElementLimit()); |
| } |
| |
| |
| |
| void enableLimit(boolean enable) { |
| fLimitElements= enable; |
| if (fLimitElements) |
| getSettings().put(KEY_LIMIT_ENABLED, TRUE); |
| else |
| getSettings().put(KEY_LIMIT_ENABLED, FALSE); |
| limitChanged(); |
| } |
| |
| /** |
| * |
| */ |
| private void limitChanged() { |
| getViewer().refresh(); |
| getViewPart().updateLabel(); |
| } |
| |
| boolean limitElements() { |
| return fLimitElements; |
| } |
| |
| void removeMatchFilter(MatchFilter filter) { |
| String id= filter.getID(); |
| MatchFilter[] matchFilters= getMatchFilters(); |
| ArrayList res= new ArrayList(matchFilters.length); |
| for (int i= 0; i < matchFilters.length; i++) { |
| if (!id.equals(matchFilters[i].getID())) { |
| res.add(matchFilters[i]); |
| } |
| } |
| MatchFilter[] newFilters= (MatchFilter[]) res.toArray(new MatchFilter[res.size()]); |
| setFilters(newFilters); |
| } |
| |
| void addMatchFilter(MatchFilter filter) { |
| String id= filter.getID(); |
| MatchFilter[] matchFilters= getMatchFilters(); |
| ArrayList res= new ArrayList(matchFilters.length); |
| for (int i= 0; i < matchFilters.length; i++) { |
| if (!id.equals(matchFilters[i].getID())) { |
| res.add(matchFilters[i]); |
| } |
| } |
| res.add(filter); |
| MatchFilter[] newFilters= (MatchFilter[]) res.toArray(new MatchFilter[res.size()]); |
| setFilters(newFilters); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#handleSearchResultChanged(org.eclipse.search.ui.SearchResultEvent) |
| */ |
| protected synchronized void handleSearchResultChanged(SearchResultEvent e) { |
| super.handleSearchResultChanged(e); |
| if (e instanceof MatchFilterEvent) { |
| filtersChanged(((MatchFilterEvent) e).getActivatedFilters()); |
| } |
| } |
| |
| private void filtersChanged(MatchFilter[] newFilters) { |
| StructuredViewer viewer= getViewer(); |
| JavaSearchContentProvider cp= (JavaSearchContentProvider) viewer.getContentProvider(); |
| cp.filtersChanged(getMatchFilters()); |
| |
| updateFilterActions(); |
| |
| getViewer().refresh(); |
| |
| getViewPart().updateLabel(); |
| } |
| |
| private void updateFilterActions() { |
| IMenuManager menu= getSite().getActionBars().getMenuManager(); |
| |
| for (int i= 0; i < fFilterActions.length; i++) { |
| fFilterActions[i].updateCheckState(); |
| } |
| |
| getSite().getActionBars().updateActionBars(); |
| menu.updateAll(true); |
| } |
| |
| boolean hasMatchFilter(MatchFilter filter) { |
| JavaSearchResult input= (JavaSearchResult) getInput(); |
| if (input != null) { |
| return (input).hasMatchFilterActivated(filter); |
| } |
| return false; |
| } |
| |
| MatchFilter[] getMatchFilters() { |
| JavaSearchResult input= (JavaSearchResult) getInput(); |
| if (input != null) { |
| return input.getActivatedMatchFilters(); |
| } |
| return new MatchFilter[0]; |
| } |
| |
| public int getDisplayedMatchCount(Object element) { |
| if (getMatchFilters().length == 0) |
| return super.getDisplayedMatchCount(element); |
| Match[] matches= super.getDisplayedMatches(element); |
| int count= 0; |
| for (int i= 0; i < matches.length; i++) { |
| if (!matches[i].isFiltered()) |
| count++; |
| } |
| return count; |
| } |
| |
| public Match[] getDisplayedMatches(Object element) { |
| if (getMatchFilters().length == 0) |
| return super.getDisplayedMatches(element); |
| Match[] matches= super.getDisplayedMatches(element); |
| int count= 0; |
| for (int i= 0; i < matches.length; i++) { |
| if (matches[i].isFiltered()) |
| matches[i]= null; |
| else |
| count++; |
| } |
| Match[] filteredMatches= new Match[count]; |
| |
| int writeIndex= 0; |
| for (int i= 0; i < matches.length; i++) { |
| if (matches[i] != null) |
| filteredMatches[writeIndex++]= matches[i]; |
| } |
| |
| return filteredMatches; |
| } |
| |
| public void setInput(ISearchResult search, Object viewState) { |
| super.setInput(search, viewState); |
| JavaSearchResult input= (JavaSearchResult) search; |
| updateFilterEnablement(input); |
| } |
| |
| private void updateFilterEnablement(JavaSearchResult result) { |
| IActionBars bars= getSite().getActionBars(); |
| IMenuManager menu= bars.getMenuManager(); |
| for (int i= 0; i < fFilterActions.length; i++) { |
| menu.remove(fFilterActions[i].getId()); |
| } |
| |
| for (int i= fFilterActions.length-1; i >= 0 ; i--) { |
| FilterAction filterAction= fFilterActions[i]; |
| if (shouldEnable(result, filterAction)) |
| menu.prependToGroup(GROUP_FILTERING, filterAction); |
| filterAction.updateCheckState(); |
| } |
| |
| menu.updateAll(true); |
| bars.updateActionBars(); |
| } |
| |
| private boolean shouldEnable(JavaSearchResult result, FilterAction filterAction) { |
| if (result == null) { |
| return false; |
| } |
| JavaSearchQuery query= (JavaSearchQuery) result.getQuery(); |
| if (query == null) |
| return false; |
| return filterAction.getFilter().isApplicable(query); |
| } |
| |
| private boolean isQueryRunning() { |
| AbstractTextSearchResult result= getInput(); |
| if (result != null) { |
| return NewSearchUI.isQueryRunning(result.getQuery()); |
| } |
| return false; |
| } |
| |
| public String getLabel() { |
| String label= super.getLabel(); |
| if (getInput() != null) { |
| int filteredOut= getInput().getMatchCount() - getFilteredMatchCount(); |
| if (filteredOut > 0 || getMatchFiltersCount() > 0) { |
| if (isQueryRunning()) { |
| String message= SearchMessages.JavaSearchResultPage_filtered_message; |
| return Messages.format(message, new Object[] { label }); |
| |
| } else { |
| String message= SearchMessages.JavaSearchResultPage_filteredWithCount_message; |
| return Messages.format(message, new Object[] { label, String.valueOf(filteredOut) }); |
| } |
| } |
| } |
| return label; |
| } |
| |
| private int getMatchFiltersCount() { |
| MatchFilter[] filters= getMatchFilters(); |
| AbstractTextSearchResult result= getInput(); |
| if (result == null) |
| return 0; |
| int filterCount= 0; |
| for (int i= 0; i < filters.length; i++) { |
| if (filters[i].isApplicable((JavaSearchQuery) result.getQuery())) |
| filterCount++; |
| } |
| return filterCount; |
| } |
| |
| private int getFilteredMatchCount() { |
| StructuredViewer viewer= getViewer(); |
| if (viewer instanceof TreeViewer) { |
| ITreeContentProvider tp= (ITreeContentProvider) viewer.getContentProvider(); |
| return getMatchCount(tp, getRootElements((TreeViewer) getViewer())); |
| } else { |
| return getMatchCount((TableViewer) viewer); |
| } |
| } |
| |
| private Object[] getRootElements(TreeViewer viewer) { |
| Tree t= viewer.getTree(); |
| Item[] roots= t.getItems(); |
| Object[] elements= new Object[roots.length]; |
| for (int i = 0; i < elements.length; i++) { |
| elements[i]= roots[i].getData(); |
| } |
| return elements; |
| } |
| |
| private Object[] getRootElements(TableViewer viewer) { |
| Table t= viewer.getTable(); |
| Item[] roots= t.getItems(); |
| Object[] elements= new Object[roots.length]; |
| for (int i = 0; i < elements.length; i++) { |
| elements[i]= roots[i].getData(); |
| } |
| return elements; |
| } |
| |
| |
| private int getMatchCount(ITreeContentProvider cp, Object[] elements) { |
| int count= 0; |
| for (int j = 0; j < elements.length; j++) { |
| count+= getDisplayedMatchCount(elements[j]); |
| Object[] children = cp.getChildren(elements[j]); |
| count+= getMatchCount(cp, children); |
| } |
| return count; |
| } |
| |
| private int getMatchCount(TableViewer viewer) { |
| Object[] elements= getRootElements(viewer); |
| int count= 0; |
| for (int i = 0; i < elements.length; i++) { |
| count+= getDisplayedMatchCount(elements[i]); |
| } |
| return count; |
| } |
| |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) |
| */ |
| public Object getAdapter(Class adapter) { |
| if (IShowInTargetList.class.equals(adapter)) { |
| return SHOW_IN_TARGET_LIST; |
| } |
| return null; |
| } |
| |
| protected void handleOpen(OpenEvent event) { |
| Object firstElement= ((IStructuredSelection)event.getSelection()).getFirstElement(); |
| if (firstElement instanceof ICompilationUnit || |
| firstElement instanceof IClassFile || |
| firstElement instanceof IMember) { |
| if (getDisplayedMatchCount(firstElement) == 0) { |
| try { |
| fEditorOpener.openElement(firstElement); |
| } catch (CoreException e) { |
| ExceptionHandler.handle(e, getSite().getShell(), SearchMessages.JavaSearchResultPage_open_editor_error_title, SearchMessages.JavaSearchResultPage_open_editor_error_message); |
| } |
| return; |
| } |
| } |
| super.handleOpen(event); |
| } |
| |
| public void setFilters(MatchFilter[] enabledFilters) { |
| JavaSearchResult input= (JavaSearchResult) getInput(); |
| if (input != null) { |
| input.setActivatedFilters(enabledFilters); |
| } |
| } |
| |
| void setElementLimit(int elementLimit) { |
| fElementLimit= elementLimit; |
| getSettings().put(KEY_LIMIT, elementLimit); |
| limitChanged(); |
| } |
| } |