Java tutorial
/******************************************************************************* * Copyright (c) 2009, 2014 Xored Software Inc 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: * Xored Software Inc - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.rcptt.ui.navigator; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.IValueChangeListener; import org.eclipse.core.databinding.observable.value.ValueChangeEvent; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbenchCommandConstants; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.navigator.CommonNavigator; import org.eclipse.ui.navigator.CommonViewer; import org.eclipse.ui.progress.UIJob; import org.eclipse.ui.texteditor.ITextEditorActionConstants; import org.eclipse.rcptt.core.model.IQ7Folder; import org.eclipse.rcptt.core.model.IQ7NamedElement; import org.eclipse.rcptt.internal.ui.Messages; import org.eclipse.rcptt.internal.ui.Q7UIPlugin; import org.eclipse.rcptt.ui.commons.SearchControl; import org.eclipse.rcptt.ui.navigator.SearchJob.ResultListener; /** * @author RoadRoller * */ public class Q7Explorer extends CommonNavigator { public static final String ID = "org.eclipse.rcptt.ui.explorer"; //$NON-NLS-1$ private static final Set<String> TEST_CASE_EXTENSIONS = new HashSet<String>(); private Q7CommonViewer viewer; private final SearchJob job = new SearchJob(); public Q7Explorer() { TEST_CASE_EXTENSIONS.add("test"); //$NON-NLS-1$ TEST_CASE_EXTENSIONS.add("scenario"); //$NON-NLS-1$ TEST_CASE_EXTENSIONS.add("suite"); //$NON-NLS-1$ } private final UIJob refreshViewerJob = new UIJob(PlatformUI.getWorkbench().getDisplay(), Messages.Q7Explorer_RefreshJob) { @Override public IStatus runInUIThread(IProgressMonitor monitor) { if (viewer != null) { viewer.refresh(false); viewer.expandAll(); } return Status.OK_STATUS; } }; @Override protected CommonViewer createCommonViewerObject(Composite aParent) { return viewer = new Q7CommonViewer(getViewSite().getId(), aParent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); } @Override public void createPartControl(Composite parent) { final Composite composite = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(2).spacing(0, 1).applyTo(composite); final SearchControl searchControl = new SearchControl(composite); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).indent(1, 2) .applyTo(searchControl); searchControl.getFilterControl().addFocusListener(new TextFocusListener(searchControl.getFilterControl())); final Composite container = new Composite(composite, SWT.NONE); GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo(container); container.setLayout(new FillLayout()); super.createPartControl(container); // viewer is created now // set search result control for search control can pass focus after // enter or down arrow searchControl.setSearchResultControl(viewer.getControl()); final IObservableValue searchObservable = SWTObservables.observeDelayedValue(400, SWTObservables.observeText(searchControl.getFilterControl(), SWT.Modify)); job.addResultListener(new ResultListener() { public void resultAdded(IQ7NamedElement result) { final SearchFilter filter = findFilter(); if (filter == null) { return; } filter.add(result); refreshViewerJob.cancel(); refreshViewerJob.schedule(400); } }); searchObservable.addValueChangeListener(new IValueChangeListener() { public void handleValueChange(ValueChangeEvent event) { final SearchFilter filter = findFilter(); if (filter == null) { return; } job.cancel(); refreshViewerJob.cancel(); final String newValue = (String) event.diff.getNewValue(); if ("".equals(newValue.trim())) { //$NON-NLS-1$ filter.setEnabled(false); filter.clear(); viewer.refresh(false); } else { filter.setEnabled(true); filter.clear(); viewer.refresh(false); job.setQuery(newValue); job.setUser(false); job.setPriority(Job.LONG); job.schedule(); } } }); } private SearchFilter findFilter() { for (final ViewerFilter filter : viewer.getFilters()) { if (filter instanceof SearchFilter) { return (SearchFilter) filter; } } return null; } public IResource[] filterSelectedResources() { IStructuredSelection selection = (IStructuredSelection) getCommonViewer().getSelection(); SearchFilter filter = findFilter(); List<IResource> filtered = doFilterSelection(filter, selection.toArray()); if (filtered.size() == 0 && selection.size() == 1 && selection.getFirstElement() instanceof IFile && IQ7Folder.TEST_SUITE_FILE_EXTENSION .equals(((IFile) selection.getFirstElement()).getFileExtension())) { filtered.add((IFile) selection.getFirstElement()); } return filtered.toArray(new IResource[filtered.size()]); } private List<IResource> doFilterSelection(SearchFilter filter, Object[] objects) { List<IResource> list = new ArrayList<IResource>(); for (Object o : objects) { if (o instanceof IContainer) { IContainer c = (IContainer) o; try { if (c.isAccessible()) { IResource[] members = c.members(); if (filter != null) { list.addAll(doFilterSelection(filter, filter.filter(getCommonViewer(), c, members))); } else { list.addAll(doFilterSelection(filter, members)); } } } catch (CoreException e) { Q7UIPlugin.log(e); } } else if (o instanceof IFile && TEST_CASE_EXTENSIONS.contains(((IFile) o).getFileExtension())) { list.add((IFile) o); } } return list; } /** * Support for text operation actions on search control */ class TextFocusListener implements FocusListener { private final Text fText; private Action cutAction; private Action copyAction; private Action pasteAction; private Action deleteAction; private Action selectAllAction; public TextFocusListener(Text text) { fText = text; makeActions(); final FocusListener focusListener = this; fText.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { deactivateActions(); fText.removeFocusListener(focusListener); fText.removeDisposeListener(this); } }); } public void focusLost(FocusEvent e) { deactivateActions(); } public void focusGained(FocusEvent e) { activateAction(); } private void activateAction() { getViewSite().getActionBars().setGlobalActionHandler(ITextEditorActionConstants.CUT, cutAction); getViewSite().getActionBars().setGlobalActionHandler(ITextEditorActionConstants.COPY, copyAction); getViewSite().getActionBars().setGlobalActionHandler(ITextEditorActionConstants.PASTE, pasteAction); getViewSite().getActionBars().setGlobalActionHandler(ITextEditorActionConstants.DELETE, deleteAction); getViewSite().getActionBars().setGlobalActionHandler(ITextEditorActionConstants.SELECT_ALL, selectAllAction); } private void deactivateActions() { getViewSite().getActionBars().setGlobalActionHandler(ITextEditorActionConstants.CUT, null); getViewSite().getActionBars().setGlobalActionHandler(ITextEditorActionConstants.COPY, null); getViewSite().getActionBars().setGlobalActionHandler(ITextEditorActionConstants.PASTE, null); getViewSite().getActionBars().setGlobalActionHandler(ITextEditorActionConstants.DELETE, null); getViewSite().getActionBars().setGlobalActionHandler(ITextEditorActionConstants.SELECT_ALL, null); } private void makeActions() { cutAction = new Action(Messages.Q7Explorer_CutLabel) { @Override public void run() { fText.cut(); }; }; cutAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_CUT); copyAction = new Action(Messages.Q7Explorer_CopyLabel) { @Override public void run() { fText.copy(); }; }; copyAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_COPY); pasteAction = new Action(Messages.Q7Explorer_PasteLabel) { @Override public void run() { fText.paste(); }; }; pasteAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_PASTE); deleteAction = new Action(Messages.Q7Explorer_DeleteLabel) { @Override public void run() { if (fText.getSelectionCount() > 0) { String newText = fText.getText().substring(0, fText.getSelection().x); newText += fText.getText().substring(fText.getSelection().y); fText.setText(newText); } }; }; deleteAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_DELETE); selectAllAction = new Action(Messages.Q7Explorer_SelectAllLabel) { @Override public void run() { fText.selectAll(); }; }; selectAllAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_SELECT_ALL); } }; }