15 import java.util.Date; |
15 import java.util.Date; |
16 |
16 |
17 import org.eclipse.cdt.debug.core.executables.Executable; |
17 import org.eclipse.cdt.debug.core.executables.Executable; |
18 import org.eclipse.cdt.debug.core.executables.ExecutablesManager; |
18 import org.eclipse.cdt.debug.core.executables.ExecutablesManager; |
19 import org.eclipse.core.runtime.IPath; |
19 import org.eclipse.core.runtime.IPath; |
20 import org.eclipse.core.runtime.IProgressMonitor; |
|
21 import org.eclipse.core.runtime.IStatus; |
|
22 import org.eclipse.core.runtime.jobs.Job; |
|
23 import org.eclipse.jface.viewers.ColumnLabelProvider; |
20 import org.eclipse.jface.viewers.ColumnLabelProvider; |
24 import org.eclipse.jface.viewers.IStructuredContentProvider; |
21 import org.eclipse.jface.viewers.IStructuredContentProvider; |
25 import org.eclipse.jface.viewers.ITreeContentProvider; |
22 import org.eclipse.jface.viewers.ITreeContentProvider; |
26 import org.eclipse.jface.viewers.TreeViewer; |
23 import org.eclipse.jface.viewers.TreeViewer; |
27 import org.eclipse.jface.viewers.Viewer; |
24 import org.eclipse.jface.viewers.Viewer; |
28 import org.eclipse.jface.viewers.ViewerCell; |
25 import org.eclipse.jface.viewers.ViewerCell; |
29 |
26 |
30 class ExecutablesContentProvider extends ColumnLabelProvider implements IStructuredContentProvider, ITreeContentProvider { |
27 class ExecutablesContentProvider extends ColumnLabelProvider implements IStructuredContentProvider, ITreeContentProvider { |
31 |
28 |
32 private TreeViewer viewer; |
|
33 |
|
34 public ExecutablesContentProvider(TreeViewer viewer) { |
29 public ExecutablesContentProvider(TreeViewer viewer) { |
35 this.viewer = viewer; |
|
36 } |
30 } |
37 |
31 |
38 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
32 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
39 } |
33 } |
40 |
34 |
41 public void dispose() { |
35 public void dispose() { |
42 } |
36 } |
43 |
37 |
44 public Object[] getElements(final Object inputElement) { |
38 public Object[] getElements(final Object inputElement) { |
45 if (inputElement instanceof ExecutablesManager) { |
39 if (inputElement instanceof ExecutablesManager) { |
46 final ExecutablesManager em = (ExecutablesManager) inputElement; |
40 ExecutablesManager em = (ExecutablesManager) inputElement; |
47 if (em.refreshNeeded()) { |
41 return em.getExecutables().toArray(); |
48 // do this asynchronously. just return an empty array |
|
49 // immediately, and then refresh the view |
|
50 // once the list of executables has been calculated. this can |
|
51 // take a while and we don't want |
|
52 // to block the UI. |
|
53 Job refreshJob = new Job(Messages.ExecutablesContentProvider_FetchingExecutables) { |
|
54 |
|
55 @Override |
|
56 protected IStatus run(IProgressMonitor monitor) { |
|
57 IStatus status = em.refreshExecutables(monitor); |
|
58 |
|
59 // Are we in the UIThread? If so spin it until we are done |
|
60 if (!viewer.getControl().isDisposed()) { |
|
61 if (viewer.getControl().getDisplay().getThread() == Thread.currentThread()) { |
|
62 viewer.refresh(inputElement); |
|
63 } else { |
|
64 viewer.getControl().getDisplay().asyncExec(new Runnable() { |
|
65 public void run() { |
|
66 viewer.refresh(inputElement); |
|
67 } |
|
68 }); |
|
69 } |
|
70 } |
|
71 |
|
72 monitor.done(); |
|
73 return status; |
|
74 } |
|
75 }; |
|
76 |
|
77 refreshJob.schedule(); |
|
78 |
|
79 } else { |
|
80 return em.getExecutables(); |
|
81 } |
|
82 } |
42 } |
83 return new Object[] {}; |
43 return new Object[] {}; |
84 } |
44 } |
85 |
45 |
86 public Object getParent(Object element) { |
46 public Object getParent(Object element) { |