/******************************************************************************* * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> * Copyright (C) 2012, Robin Stocker <robin@nibor.org> * * 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 *******************************************************************************/ package org.eclipse.egit.ui.internal.history; import java.io.IOException; import java.util.Set; import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.filter.PathFilterGroup; import org.eclipse.jgit.treewalk.filter.TreeFilter; import org.eclipse.osgi.util.NLS; /** * Content provider for {@link FileDiff} objects */ public class FileDiffContentProvider implements IStructuredContentProvider { static final int INTERESTING_MARK_TREE_FILTER_INDEX = 0; private TreeWalk walk; private RevCommit commit; private FileDiff[] diff; private TreeFilter markTreeFilter = TreeFilter.ALL; private Repository repo; @Override public void inputChanged(final Viewer newViewer, final Object oldInput, final Object newInput) { if (newInput != null) { repo = ((CommitFileDiffViewer) newViewer).getRepository(); walk = ((CommitFileDiffViewer) newViewer).getTreeWalk(); commit = (RevCommit) newInput; } else { repo = null; walk = null; commit = null; } diff = null; } /** * Set the paths which are interesting and should be highlighted in the view. * @param interestingPaths */ void setInterestingPaths(Set<String> interestingPaths) { if (interestingPaths != null) this.markTreeFilter = PathFilterGroup.createFromStrings(interestingPaths); else this.markTreeFilter = TreeFilter.ALL; // FileDiffs need to be updated this.diff = null; } @Override public Object[] getElements(final Object inputElement) { if (diff == null && walk != null && commit != null) try { diff = FileDiff.compute(repo, walk, commit, markTreeFilter); } catch (IOException err) { Activator.handleError(NLS.bind(UIText.FileDiffContentProvider_errorGettingDifference, commit.getId()), err, false); } return diff != null ? diff : new Object[0]; } @Override public void dispose() { // Nothing. } }