Java tutorial
/******************************************************************************* * Copyright (c) 2000, 2008 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 * Juerg Billeter, juergbi@ethz.ch - 47136 Search view should show match objects * Ulrich Etter, etteru@ethz.ch - 47136 Search view should show match objects * Roman Fuchs, fuchsro@ethz.ch - 47136 Search view should show match objects *******************************************************************************/ package com.aptana.ide.search.epl.filesystem.ui.text; import java.io.File; import java.util.HashMap; import java.util.Map; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.util.DelegatingDragAdapter; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.StructuredSelection; 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.ViewerComparator; import org.eclipse.search.internal.ui.Messages; import org.eclipse.search.internal.ui.SearchPlugin; import org.eclipse.search.internal.ui.text.IFileSearchContentProvider; import org.eclipse.search.internal.ui.text.NewTextSearchActionGroup; import org.eclipse.search.ui.IContextMenuConstants; import org.eclipse.search.ui.ISearchResult; import org.eclipse.search.ui.ISearchResultViewPart; import org.eclipse.search.ui.text.AbstractTextSearchResult; import org.eclipse.search.ui.text.AbstractTextSearchViewPage; import org.eclipse.search.ui.text.Match; import org.eclipse.search2.internal.ui.OpenSearchPreferencesAction; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.Transfer; 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.actions.ActionGroup; 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 com.aptana.ide.search.epl.AptanaFileSystemMatch; import com.aptana.ide.search.epl.Compatibility; public class FileSystemSearchPage extends AbstractTextSearchViewPage implements IAdaptable { public Integer getElementLimit1() { if (Compatibility.isTableLimited()) { return new Integer(Compatibility.getTableLimit()); } return new Integer(-1); } /** * @author Pavel Petrochenko */ public static class DecoratorIgnoringViewerSorter extends ViewerComparator { private final ILabelProvider fLabelProvider; /** * @param labelProvider */ public DecoratorIgnoringViewerSorter(ILabelProvider labelProvider) { fLabelProvider = labelProvider; } /** * @see org.eclipse.jface.viewers.ViewerComparator#category(java.lang.Object) */ public int category(Object element) { File fl = null; if (element instanceof File) { fl = (File) element; } else { fl = ((AptanaFileSystemMatch) element).getFile(); } if (fl.isDirectory()) { return 1; } return 2; } /** * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, * java.lang.Object, java.lang.Object) */ public int compare(Viewer viewer, Object e1, Object e2) { int cat1 = category(e1); int cat2 = category(e2); if (cat1 != cat2) { return cat1 - cat2; } 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 getComparator().compare(name1, name2); } } private static final String KEY_SORTING = "org.eclipse.search.resultpage.sorting"; //$NON-NLS-1$ private ActionGroup fActionGroup; private IFileSearchContentProvider fContentProvider; private int fCurrentSortOrder; private SortAction fSortByNameAction; private SortAction fSortByPathAction; private EditorOpener fEditorOpener = new EditorOpener(); private static final String[] SHOW_IN_TARGETS = new String[] { IPageLayout.ID_RES_NAV }; private static final IShowInTargetList SHOW_IN_TARGET_LIST = new IShowInTargetList() { public String[] getShowInTargetIds() { return FileSystemSearchPage.SHOW_IN_TARGETS; } }; private IPropertyChangeListener fPropertyChangeListener; /** * */ public FileSystemSearchPage() { fSortByNameAction = new SortAction(SearchMessages.FileSearchPage_sort_name_label, this, FileLabelProvider.SHOW_LABEL_PATH); fSortByPathAction = new SortAction(SearchMessages.FileSearchPage_sort_path_label, this, FileLabelProvider.SHOW_PATH_LABEL); fPropertyChangeListener = new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if (Compatibility.ORG_ECLIPSE_SEARCH_LIMIT_TABLE.equals(event.getProperty()) || Compatibility.ORG_ECLIPSE_SEARCH_LIMIT_TABLE_TO.equals(event.getProperty())) { if (getViewer() instanceof TableViewer) { getViewPart().updateLabel(); getViewer().refresh(); } } } }; SearchPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(fPropertyChangeListener); } private void addDragAdapters(StructuredViewer viewer) { Transfer[] transfers = new Transfer[] { ResourceTransfer.getInstance() }; int ops = DND.DROP_COPY | DND.DROP_LINK; DelegatingDragAdapter adapter = new DelegatingDragAdapter(); adapter.addDragSourceListener(new com.aptana.ide.search.epl.ResourceTransferDragAdapter(viewer)); viewer.addDragSupport(ops, transfers, adapter); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#getViewer() */ public StructuredViewer getViewer() { return super.getViewer(); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTableViewer(org.eclipse.jface.viewers.TableViewer) */ protected void configureTableViewer(TableViewer viewer) { viewer.setUseHashlookup(true); FileLabelProvider innerLabelProvider = new FileLabelProvider(this, fCurrentSortOrder); viewer.setLabelProvider(new DecoratingLabelProvider(innerLabelProvider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator())); viewer.setContentProvider(new FileTableContentProvider(this)); viewer.setComparator(new DecoratorIgnoringViewerSorter(innerLabelProvider)); fContentProvider = (IFileSearchContentProvider) viewer.getContentProvider(); addDragAdapters(viewer); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTreeViewer(org.eclipse.jface.viewers.TreeViewer) */ protected void configureTreeViewer(TreeViewer viewer) { viewer.setUseHashlookup(true); FileLabelProvider innerLabelProvider = new FileLabelProvider(this, FileLabelProvider.SHOW_LABEL); viewer.setLabelProvider(new DecoratingLabelProvider(innerLabelProvider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator())); viewer.setContentProvider(new FileTreeContentProvider(this, viewer)); viewer.setComparator(new DecoratorIgnoringViewerSorter(innerLabelProvider)); fContentProvider = (IFileSearchContentProvider) viewer.getContentProvider(); addDragAdapters(viewer); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#showMatch(org.eclipse.search.ui.text.Match, * int, int, boolean) */ protected void showMatch(Match match, int offset, int length, boolean activate) throws PartInitException { File file = (File) match.getElement(); IEditorPart editor = fEditorOpener.open(file, activate); if ((offset != 0) || (length != 0)) { if (editor instanceof ITextEditor) { ITextEditor textEditor = (ITextEditor) editor; textEditor.selectAndReveal(offset, length); } else if (editor != null) { showWithMarker(editor, file, offset, length); } } } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#canRemoveMatchesWith(org.eclipse.jface.viewers.ISelection) */ protected boolean canRemoveMatchesWith(ISelection selection) { if (selection.isEmpty()) { StructuredViewer viewer = getViewer(); if ((viewer != null) && (viewer instanceof TableViewer)) { TableViewer tv = (TableViewer) viewer; tv.getTable().getParent().setFocus(); tv.getTable().deselectAll(); } if ((viewer != null) && (viewer instanceof TreeViewer)) { TreeViewer tv = (TreeViewer) viewer; tv.getTree().deselectAll(); } } return !selection.isEmpty(); } private void showWithMarker(IEditorPart editor, File file, int offset, int length) throws PartInitException { IMarker marker = null; try { // marker = file.createMarker(NewSearchUI.SEARCH_MARKER); Map<String, Integer> attributes = new HashMap<String, Integer>(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); } finally { if (marker != null) { try { marker.delete(); } catch (CoreException e) { // ignore } } } } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#fillContextMenu(org.eclipse.jface.action.IMenuManager) */ 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() != AbstractTextSearchViewPage.FLAG_LAYOUT_FLAT) { return; } MenuManager sortMenu = new MenuManager(SearchMessages.FileSearchPage_sort_by_label); sortMenu.add(fSortByNameAction); sortMenu.add(fSortByPathAction); fSortByNameAction.setChecked(fCurrentSortOrder == fSortByNameAction.getSortOrder()); fSortByPathAction.setChecked(fCurrentSortOrder == fSortByPathAction.getSortOrder()); mgr.appendToGroup(IContextMenuConstants.GROUP_VIEWER_SETUP, sortMenu); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#setInput(org.eclipse.search.ui.ISearchResult, * java.lang.Object) */ public void setInput(ISearchResult newSearch, Object viewState) { super.setInput(newSearch, viewState); getViewer().setSelection(new StructuredSelection()); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#setViewPart(org.eclipse.search.ui.ISearchResultViewPart) */ public void setViewPart(ISearchResultViewPart part) { super.setViewPart(part); fActionGroup = new NewTextSearchActionGroup(part); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#init(org.eclipse.ui.part.IPageSite) */ public void init(IPageSite site) { super.init(site); IMenuManager menuManager = site.getActionBars().getMenuManager(); menuManager.appendToGroup(IContextMenuConstants.GROUP_PROPERTIES, new OpenSearchPreferencesAction()); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#dispose() */ public void dispose() { fActionGroup.dispose(); SearchPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(fPropertyChangeListener); super.dispose(); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#elementsChanged(java.lang.Object[]) */ protected void elementsChanged(Object[] objects) { if (fContentProvider != null) { fContentProvider.elementsChanged(objects); } } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#clear() */ protected void clear() { if (fContentProvider != null) { fContentProvider.clear(); } } /** * @param sortOrder */ public void setSortOrder(int sortOrder) { fCurrentSortOrder = sortOrder; DecoratingLabelProvider lpWrapper = (DecoratingLabelProvider) getViewer().getLabelProvider(); ((FileLabelProvider) lpWrapper.getLabelProvider()).setOrder(sortOrder); getViewer().refresh(); getSettings().put(FileSystemSearchPage.KEY_SORTING, fCurrentSortOrder); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#restoreState(org.eclipse.ui.IMemento) */ public void restoreState(IMemento memento) { super.restoreState(memento); try { fCurrentSortOrder = getSettings().getInt(FileSystemSearchPage.KEY_SORTING); } catch (NumberFormatException e) { fCurrentSortOrder = fSortByNameAction.getSortOrder(); } if (memento != null) { Integer value = memento.getInteger(FileSystemSearchPage.KEY_SORTING); if (value != null) { fCurrentSortOrder = value.intValue(); } } } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#saveState(org.eclipse.ui.IMemento) */ public void saveState(IMemento memento) { super.saveState(memento); memento.putInteger(FileSystemSearchPage.KEY_SORTING, fCurrentSortOrder); } /** * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) */ public Object getAdapter(Class adapter) { if (IShowInTargetList.class.equals(adapter)) { return FileSystemSearchPage.SHOW_IN_TARGET_LIST; } return null; } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#getLabel() */ public String getLabel() { String label = super.getLabel(); StructuredViewer viewer = getViewer(); if (viewer instanceof TableViewer) { TableViewer tv = (TableViewer) viewer; AbstractTextSearchResult result = getInput(); if (result != null) { int itemCount = ((IStructuredContentProvider) tv.getContentProvider()) .getElements(getInput()).length; int fileCount = getInput().getElements().length; if (itemCount < fileCount) { return Messages.format(SearchMessages.AptanaFileSearchPage_NOT_ALL_MATCHES, new Object[] { label, new Integer(itemCount), new Integer(fileCount) }); } } } return label; } }