/******************************************************************************* * Copyright (C) 2011, Dariusz Luksza * * 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; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.eclipse.compare.CompareNavigator; import org.eclipse.compare.INavigatable; import org.eclipse.core.runtime.jobs.IJobManager; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.egit.ui.JobFamilies; /** * Wraps given {@link CompareNavigator} and waits for add to index, remove from * index and repository change jobs finish before call * {@link CompareNavigator#selectChange(boolean)} from main navigator */ class GitTreeCompareNavigator extends CompareNavigator { private static final Class COMPARE_NAVIGATOR_CLASS = CompareNavigator.class; private final CompareNavigator mainNavigator; public GitTreeCompareNavigator(CompareNavigator mainNavigator) { this.mainNavigator = mainNavigator; } @Override protected INavigatable[] getNavigatables() { Method baseNavigables; try { baseNavigables = COMPARE_NAVIGATOR_CLASS.getDeclaredMethod( "getNavigatables", Void.class); //$NON-NLS-1$ baseNavigables.setAccessible(true); return (INavigatable[]) baseNavigables.invoke(mainNavigator, Void.class); } catch (SecurityException e) { // should never happen } catch (NoSuchMethodException e) { // should never happen } catch (IllegalArgumentException e) { // should never happen } catch (IllegalAccessException e) { // should never happen } catch (InvocationTargetException e) { // should never happen } return new INavigatable[0]; } @Override public boolean selectChange(boolean next) { // wait for repositories actions IJobManager manager = Job.getJobManager(); try { manager.join(JobFamilies.ADD_TO_INDEX, null); manager.join(JobFamilies.REMOVE_FROM_INDEX, null); manager.join(org.eclipse.egit.core.JobFamilies.REPOSITORY_CHANGED, null); } catch (InterruptedException e) { // ignore } return mainNavigator.selectChange(next); } }