X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Fissues%2FSCLIssuesContentProvider.java;fp=bundles%2Forg.simantics.scl.ui%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fui%2Fissues%2FSCLIssuesContentProvider.java;h=eb5c25e4ac0ac3f402b7c78c466db586065a05fc;hp=905e6995f682a11eac0b1919194e6826cec65c8e;hb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;hpb=24e2b34260f219f0d1644ca7a138894980e25b14 diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/issues/SCLIssuesContentProvider.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/issues/SCLIssuesContentProvider.java index 905e6995f..eb5c25e4a 100644 --- a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/issues/SCLIssuesContentProvider.java +++ b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/issues/SCLIssuesContentProvider.java @@ -1,130 +1,130 @@ -package org.simantics.scl.ui.issues; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.concurrent.atomic.AtomicBoolean; - -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.widgets.Control; -import org.simantics.scl.compiler.errors.CompilationError; -import org.simantics.scl.compiler.errors.Failable; -import org.simantics.scl.compiler.errors.Failure; -import org.simantics.scl.compiler.module.Module; -import org.simantics.scl.compiler.module.repository.ModuleRepository; -import org.simantics.scl.compiler.module.repository.UpdateListener; - -import gnu.trove.map.hash.THashMap; -import gnu.trove.procedure.TObjectProcedure; - -public class SCLIssuesContentProvider implements IStructuredContentProvider { - - public static final int MAX_ISSUE_COUNT = 1000; - - Viewer viewer; - ModuleRepository repository; - boolean disposed = false; - AtomicBoolean refreshInProgress = new AtomicBoolean(false); - - THashMap currentFailures = new THashMap(); - THashMap updateListeners = new THashMap(); - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - this.viewer = viewer; - this.repository = (ModuleRepository)newInput; - if(newInput != null) - listenIssues(); - } - - private UpdateListener getUpdateListener(String moduleName) { - UpdateListener listener = updateListeners.get(moduleName); - if(listener == null) { - listener = new UpdateListener() { - @Override - public void notifyAboutUpdate() { - if(!disposed) - listenModule(moduleName); - } - }; - updateListeners.put(moduleName, listener); - } - return listener; - } - - private void listenModule(String moduleName) { - if(repository == null) - return; - Failable result = repository.getModule(moduleName, getUpdateListener(moduleName)); - synchronized(currentFailures) { - if(result instanceof Failure) { - Failure failure = (Failure)result; - currentFailures.put(moduleName, failure); - } - else - if(currentFailures.remove(moduleName) == null) - return; - } - refresh(); - } - - private void refresh() { - if(!refreshInProgress.compareAndSet(false, true)) - return; - if(viewer == null) - return; - Control control = viewer.getControl(); - if(control.isDisposed() || disposed) - return; - control.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - if(control.isDisposed() || disposed) - return; - refreshInProgress.set(false); - viewer.refresh(); - } - }); - } - - private void listenIssues() { - new Thread() { - public void run() { - if(repository == null) - return; - repository.getSourceRepository().forAllModules(new TObjectProcedure() { - @Override - public boolean execute(String moduleName) { - listenModule(moduleName); - return true; - } - }); - } - }.start(); - } - - @Override - public void dispose() { - this.disposed = true; - } - - @Override - public Object[] getElements(Object inputElement) { - ArrayList result = new ArrayList(); - synchronized(currentFailures) { - String[] moduleNames = currentFailures.keySet().toArray(new String[currentFailures.size()]); - Arrays.sort(moduleNames); - for(String moduleName : moduleNames) { - Failure failure = currentFailures.get(moduleName); - for(CompilationError error : failure.errors) - result.add(new SCLIssuesTableEntry(moduleName, error)); - if(result.size() >= MAX_ISSUE_COUNT) - break; - } - } - Collections.sort(result); - return result.toArray(); - } - -} +package org.simantics.scl.ui.issues; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.widgets.Control; +import org.simantics.scl.compiler.errors.CompilationError; +import org.simantics.scl.compiler.errors.Failable; +import org.simantics.scl.compiler.errors.Failure; +import org.simantics.scl.compiler.module.Module; +import org.simantics.scl.compiler.module.repository.ModuleRepository; +import org.simantics.scl.compiler.module.repository.UpdateListener; + +import gnu.trove.map.hash.THashMap; +import gnu.trove.procedure.TObjectProcedure; + +public class SCLIssuesContentProvider implements IStructuredContentProvider { + + public static final int MAX_ISSUE_COUNT = 1000; + + Viewer viewer; + ModuleRepository repository; + boolean disposed = false; + AtomicBoolean refreshInProgress = new AtomicBoolean(false); + + THashMap currentFailures = new THashMap(); + THashMap updateListeners = new THashMap(); + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + this.viewer = viewer; + this.repository = (ModuleRepository)newInput; + if(newInput != null) + listenIssues(); + } + + private UpdateListener getUpdateListener(String moduleName) { + UpdateListener listener = updateListeners.get(moduleName); + if(listener == null) { + listener = new UpdateListener() { + @Override + public void notifyAboutUpdate() { + if(!disposed) + listenModule(moduleName); + } + }; + updateListeners.put(moduleName, listener); + } + return listener; + } + + private void listenModule(String moduleName) { + if(repository == null) + return; + Failable result = repository.getModule(moduleName, getUpdateListener(moduleName)); + synchronized(currentFailures) { + if(result instanceof Failure) { + Failure failure = (Failure)result; + currentFailures.put(moduleName, failure); + } + else + if(currentFailures.remove(moduleName) == null) + return; + } + refresh(); + } + + private void refresh() { + if(!refreshInProgress.compareAndSet(false, true)) + return; + if(viewer == null) + return; + Control control = viewer.getControl(); + if(control.isDisposed() || disposed) + return; + control.getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + if(control.isDisposed() || disposed) + return; + refreshInProgress.set(false); + viewer.refresh(); + } + }); + } + + private void listenIssues() { + new Thread() { + public void run() { + if(repository == null) + return; + repository.getSourceRepository().forAllModules(new TObjectProcedure() { + @Override + public boolean execute(String moduleName) { + listenModule(moduleName); + return true; + } + }); + } + }.start(); + } + + @Override + public void dispose() { + this.disposed = true; + } + + @Override + public Object[] getElements(Object inputElement) { + ArrayList result = new ArrayList(); + synchronized(currentFailures) { + String[] moduleNames = currentFailures.keySet().toArray(new String[currentFailures.size()]); + Arrays.sort(moduleNames); + for(String moduleName : moduleNames) { + Failure failure = currentFailures.get(moduleName); + for(CompilationError error : failure.errors) + result.add(new SCLIssuesTableEntry(moduleName, error)); + if(result.size() >= MAX_ISSUE_COUNT) + break; + } + } + Collections.sort(result); + return result.toArray(); + } + +}