/******************************************************************************* * Copyright (c) 2011 GitHub Inc. * 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: * Kevin Sawicki (GitHub Inc.) - initial API and implementation *******************************************************************************/ package org.eclipse.egit.ui.internal.search; import java.util.HashMap; import java.util.Map; import org.eclipse.egit.ui.internal.commit.CommitEditor; import org.eclipse.egit.ui.internal.commit.RepositoryCommit; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; 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.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; import org.eclipse.search.ui.text.AbstractTextSearchViewPage; import org.eclipse.search.ui.text.Match; import org.eclipse.ui.PartInitException; import org.eclipse.ui.model.WorkbenchContentProvider; /** * Commit search results page class. */ public class CommitSearchResultsPage extends AbstractTextSearchViewPage { private static class CommitSorter extends ViewerComparator { @Override public int compare(Viewer viewer, Object e1, Object e2) { if (e1 instanceof RepositoryCommit && e2 instanceof RepositoryCommit) { PersonIdent person1 = ((RepositoryCommit) e1).getRevCommit() .getAuthorIdent(); PersonIdent person2 = ((RepositoryCommit) e2).getRevCommit() .getAuthorIdent(); if (person1 != null && person2 != null) return person2.getWhen().compareTo(person1.getWhen()); } else if (e1 instanceof RepositoryMatch && e2 instanceof RepositoryMatch) return ((RepositoryMatch) e1).getLabel(e1).compareToIgnoreCase( ((RepositoryMatch) e2).getLabel(e2)); return super.compare(viewer, e1, e2); } } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#elementsChanged(java.lang.Object[]) */ @Override protected void elementsChanged(Object[] objects) { getViewer().refresh(); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#clear() */ @Override protected void clear() { getViewer().refresh(); } private void configureViewer(StructuredViewer viewer) { viewer.setComparator(new CommitSorter()); viewer.setContentProvider(new WorkbenchContentProvider() { @Override public Object[] getElements(Object element) { if (getLayout() == FLAG_LAYOUT_TREE) { Map<Repository, RepositoryMatch> repos = new HashMap<>(); for (Object inputElement : getInput().getElements()) { RepositoryCommit commit = (RepositoryCommit) inputElement; RepositoryMatch match = repos.get(commit .getRepository()); if (match == null) { match = new RepositoryMatch(commit.getRepository()); repos.put(commit.getRepository(), match); } match.addCommit(commit); } return repos.values().toArray(); } return super.getElements(element); } }); viewer.setLabelProvider(new DelegatingStyledCellLabelProvider( new CommitResultLabelProvider(getLayout()))); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTreeViewer(org.eclipse.jface.viewers.TreeViewer) */ @Override protected void configureTreeViewer(TreeViewer viewer) { configureViewer(viewer); } /** * @see org.eclipse.search.ui.text.AbstractTextSearchViewPage#configureTableViewer(org.eclipse.jface.viewers.TableViewer) */ @Override protected void configureTableViewer(TableViewer viewer) { configureViewer(viewer); } @Override protected void showMatch(Match match, int currentOffset, int currentLength, boolean activate) throws PartInitException { if (match instanceof CommitMatch) CommitEditor.open(((CommitMatch) match).getCommit()); } }