1 package org.simantics.scl.ui.issues;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Arrays;
\r
5 import java.util.Collections;
\r
6 import java.util.concurrent.atomic.AtomicBoolean;
\r
8 import org.eclipse.jface.viewers.IStructuredContentProvider;
\r
9 import org.eclipse.jface.viewers.Viewer;
\r
10 import org.eclipse.swt.widgets.Control;
\r
11 import org.simantics.scl.compiler.errors.CompilationError;
\r
12 import org.simantics.scl.compiler.errors.Failable;
\r
13 import org.simantics.scl.compiler.errors.Failure;
\r
14 import org.simantics.scl.compiler.module.Module;
\r
15 import org.simantics.scl.compiler.module.repository.ModuleRepository;
\r
16 import org.simantics.scl.compiler.module.repository.UpdateListener;
\r
18 import gnu.trove.map.hash.THashMap;
\r
19 import gnu.trove.procedure.TObjectProcedure;
\r
21 public class SCLIssuesContentProvider implements IStructuredContentProvider {
\r
23 public static final int MAX_ISSUE_COUNT = 1000;
\r
26 ModuleRepository repository;
\r
27 boolean disposed = false;
\r
28 AtomicBoolean refreshInProgress = new AtomicBoolean(false);
\r
30 THashMap<String, Failure> currentFailures = new THashMap<String, Failure>();
\r
31 THashMap<String, UpdateListener> updateListeners = new THashMap<String, UpdateListener>();
\r
34 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
\r
35 this.viewer = viewer;
\r
36 this.repository = (ModuleRepository)newInput;
\r
37 if(newInput != null)
\r
41 private UpdateListener getUpdateListener(String moduleName) {
\r
42 UpdateListener listener = updateListeners.get(moduleName);
\r
43 if(listener == null) {
\r
44 listener = new UpdateListener() {
\r
46 public void notifyAboutUpdate() {
\r
48 listenModule(moduleName);
\r
51 updateListeners.put(moduleName, listener);
\r
56 private void listenModule(String moduleName) {
\r
57 if(repository == null)
\r
59 Failable<Module> result = repository.getModule(moduleName, getUpdateListener(moduleName));
\r
60 synchronized(currentFailures) {
\r
61 if(result instanceof Failure) {
\r
62 Failure failure = (Failure)result;
\r
63 currentFailures.put(moduleName, failure);
\r
66 if(currentFailures.remove(moduleName) == null)
\r
72 private void refresh() {
\r
73 if(!refreshInProgress.compareAndSet(false, true))
\r
77 Control control = viewer.getControl();
\r
78 if(control.isDisposed() || disposed)
\r
80 control.getDisplay().asyncExec(new Runnable() {
\r
83 if(control.isDisposed() || disposed)
\r
85 refreshInProgress.set(false);
\r
91 private void listenIssues() {
\r
94 if(repository == null)
\r
96 repository.getSourceRepository().forAllModules(new TObjectProcedure<String>() {
\r
98 public boolean execute(String moduleName) {
\r
99 listenModule(moduleName);
\r
108 public void dispose() {
\r
109 this.disposed = true;
\r
113 public Object[] getElements(Object inputElement) {
\r
114 ArrayList<SCLIssuesTableEntry> result = new ArrayList<SCLIssuesTableEntry>();
\r
115 synchronized(currentFailures) {
\r
116 String[] moduleNames = currentFailures.keySet().toArray(new String[currentFailures.size()]);
\r
117 Arrays.sort(moduleNames);
\r
118 for(String moduleName : moduleNames) {
\r
119 Failure failure = currentFailures.get(moduleName);
\r
120 for(CompilationError error : failure.errors)
\r
121 result.add(new SCLIssuesTableEntry(moduleName, error));
\r
122 if(result.size() >= MAX_ISSUE_COUNT)
\r
126 Collections.sort(result);
\r
127 return result.toArray();
\r