/******************************************************************************* * Copyright (C) 2010, Dariusz Luksza <dariusz@luksza.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.synchronize.mapping; import org.eclipse.egit.core.synchronize.GitCommitsModelCache.Commit; import org.eclipse.egit.ui.internal.synchronize.model.GitModelBlob; import org.eclipse.egit.ui.internal.synchronize.model.GitModelCache; import org.eclipse.egit.ui.internal.synchronize.model.GitModelCommit; import org.eclipse.egit.ui.internal.synchronize.model.GitModelTree; import org.eclipse.egit.ui.internal.synchronize.model.GitModelWorkingTree; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; /** * Ensure proper ordering of nodes in Git Change Set. * * Working Tree node will be always first in Change Set, then comes node with * Staged changes, after that will be shown list of commits ordered by commit * date. * * Elements that represents files will be always put after container elements * (like commit or folder). In other cases elements will be sorted in * alphabetical order. * */ public class GitChangeSetSorter extends ViewerSorter { @Override public int compare(Viewer viewer, Object e1, Object e2) { if (e1 instanceof GitModelBlob && !(e2 instanceof GitModelBlob)) return 1; if (e2 instanceof GitModelBlob && !(e1 instanceof GitModelBlob)) return -1; if (e1 instanceof GitModelWorkingTree) return -1; if (e2 instanceof GitModelWorkingTree) return 1; if (e1 instanceof GitModelCache) return -2; if (e2 instanceof GitModelCache) return 2; if ((e1 instanceof GitModelTree && e2 instanceof GitModelTree) || (e1 instanceof GitModelBlob && e2 instanceof GitModelBlob)) return super.compare(viewer, e1, e2); if (e1 instanceof GitModelTree && e2 instanceof GitModelCommit) return 1; if (e1 instanceof GitModelCommit && e2 instanceof GitModelCommit) { Commit rc1 = ((GitModelCommit) e1).getCachedCommitObj(); Commit rc2 = ((GitModelCommit) e2).getCachedCommitObj(); return rc2.getCommitDate().compareTo(rc1.getCommitDate()); } return super.compare(viewer, e1, e2); } }