Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java')
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java84
1 files changed, 80 insertions, 4 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java
index ca3c3ec60f..c3d3e9e3ca 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java
@@ -15,6 +15,7 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.TimeZone;
+import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ParameterizedCommand;
@@ -22,8 +23,16 @@ import org.eclipse.core.commands.common.CommandException;
import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
+import org.eclipse.egit.core.EclipseGitProgressTransformer;
import org.eclipse.egit.core.IteratorService;
import org.eclipse.egit.core.op.CommitOperation;
import org.eclipse.egit.core.project.RepositoryMapping;
@@ -101,6 +110,7 @@ import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.forms.IFormColors;
@@ -110,6 +120,7 @@ import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
/**
* A GitX style staging view with embedded commit dialog.
@@ -689,17 +700,82 @@ public class StagingView extends ViewPart {
return false;
}
- // TODO move to a Job?
- private IndexDiff reload(final Repository repository) {
- final boolean repositoryChanged = repository != currentRepository;
+ private void reload(final Repository repository) {
+ final boolean repositoryChanged = currentRepository == repository;
+
+ final AtomicReference<IndexDiff> results = new AtomicReference<IndexDiff>();
+
+ final String jobTitle = MessageFormat.format(UIText.StagingView_IndexDiffReload,
+ StagingView.getRepositoryName(repository));
+
+ Job job = new Job(jobTitle) {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IndexDiff indexDiff = doReload(repository, monitor, jobTitle);
+ results.set(indexDiff);
+ return Status.OK_STATUS;
+ }
+ };
+
+ job.setUser(true);
+ job.setRule(ResourcesPlugin.getWorkspace().getRoot());
+
+ job.addJobChangeListener(new JobChangeAdapter() {
+ public void done(final IJobChangeEvent event) {
+ form.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (form.isDisposed())
+ return;
+
+ final IndexDiff indexDiff = results.get();
+ unstagedTableViewer.setInput(new Object[] { repository,
+ indexDiff });
+ stagedTableViewer
+ .setInput(new Object[] { repository, indexDiff });
+ commitAction.setEnabled(repository.getRepositoryState()
+ .canCommit());
+ form.setText(StagingView.getRepositoryName(repository));
+ if (repositoryChanged) {
+ updateCommitMessageComponent(repositoryChanged);
+ clearCommitMessageToggles();
+ }
+ updateSectionText();
+ }
+
+ });
+ }
+ });
+
+ schedule(job);
+ }
+
+ private void schedule(final Job j) {
+ IWorkbenchPartSite site = getSite();
+ if (site != null) {
+ final IWorkbenchSiteProgressService p;
+ p = (IWorkbenchSiteProgressService) site
+ .getAdapter(IWorkbenchSiteProgressService.class);
+ if (p != null) {
+ p.schedule(j, 0, true /* use half-busy cursor */);
+ return;
+ }
+ }
+ j.schedule();
+ }
+
+ private IndexDiff doReload(final Repository repository, IProgressMonitor monitor, String jobTitle) {
currentRepository = repository;
+ final boolean repositoryChanged = currentRepository == repository;
+
+ EclipseGitProgressTransformer jgitMonitor = new EclipseGitProgressTransformer(
+ monitor);
final IndexDiff indexDiff;
try {
WorkingTreeIterator iterator = IteratorService
.createInitialIterator(repository);
indexDiff = new IndexDiff(repository, Constants.HEAD, iterator);
- indexDiff.diff();
+ indexDiff.diff(jgitMonitor, 0, 0, jobTitle);
} catch (IOException e) {
throw new RuntimeException(e);
}

Back to the top