From 809dbbbcd1093504a1b49bdb4649fc5f3c6a2bf5 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 21 Mar 2019 14:31:44 +0100 Subject: Clean up dependencies of the application configuration plugin --- .../META-INF/MANIFEST.MF | 7 +- .../ui/execute/ExecuteScriptHandler.java | 8 +- .../execute/RuntimeConsoleBasedScriptConsole.xtend | 172 +++++++++++++++++++++ .../ui/execute/ScriptConsoleFileHiperlink.xtend | 28 ++++ 4 files changed, 207 insertions(+), 8 deletions(-) create mode 100644 Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/RuntimeConsoleBasedScriptConsole.xtend create mode 100644 Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/ScriptConsoleFileHiperlink.xtend (limited to 'Application/hu.bme.mit.inf.dslreasoner.application.ui') diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ui/META-INF/MANIFEST.MF b/Application/hu.bme.mit.inf.dslreasoner.application.ui/META-INF/MANIFEST.MF index 5bb18f44..38bb7dbd 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application.ui/META-INF/MANIFEST.MF +++ b/Application/hu.bme.mit.inf.dslreasoner.application.ui/META-INF/MANIFEST.MF @@ -12,7 +12,12 @@ Require-Bundle: hu.bme.mit.inf.dslreasoner.application, org.eclipse.xtext.ui.codetemplates.ui, org.eclipse.ui.editors;bundle-version="3.5.0", org.eclipse.ui.ide;bundle-version="3.5.0", - org.eclipse.ui, + org.eclipse.ui;bundle-version="3.108.1", + org.eclipse.ui.workbench.texteditor, + org.eclipse.ui.console;bundle-version="3.6.201", + org.eclipse.jface;bundle-version="3.12.2", + org.eclipse.core.filesystem, + org.eclipse.text, org.eclipse.compare, org.eclipse.xtext.builder, org.eclipse.xtend.lib;bundle-version="2.14.0";resolution:=optional, diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/ExecuteScriptHandler.java b/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/ExecuteScriptHandler.java index 43d22ab3..380410d0 100644 --- a/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/ExecuteScriptHandler.java +++ b/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/ExecuteScriptHandler.java @@ -8,21 +8,15 @@ import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.resources.IFile; import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.emf.ecore.resource.ResourceSet; -import org.eclipse.emf.ecore.resource.URIConverter; -import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.ui.handlers.HandlerUtil; -import hu.bme.mit.inf.dslreasoner.application.applicationConfiguration.ConfigurationScript; import hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor; public class ExecuteScriptHandler extends AbstractHandler implements IHandler { - ScriptExecutor scriptExecutor = new ScriptExecutor(); + ScriptExecutor scriptExecutor = new ScriptExecutor(RuntimeConsoleBasedScriptConsole.FACTORY); @Override public Object execute(ExecutionEvent event) throws ExecutionException { diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/RuntimeConsoleBasedScriptConsole.xtend b/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/RuntimeConsoleBasedScriptConsole.xtend new file mode 100644 index 00000000..d344ffba --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/RuntimeConsoleBasedScriptConsole.xtend @@ -0,0 +1,172 @@ +package hu.bme.mit.inf.dslreasoner.application.ui.execute + +import hu.bme.mit.inf.dslreasoner.application.execution.ScriptConsole +import hu.bme.mit.inf.dslreasoner.application.execution.ScriptConsoleDecorator +import java.util.concurrent.CompletableFuture +import org.eclipse.emf.common.util.URI +import org.eclipse.jface.text.BadLocationException +import org.eclipse.jface.text.DocumentEvent +import org.eclipse.jface.text.IDocumentListener +import org.eclipse.swt.graphics.Color +import org.eclipse.ui.console.ConsolePlugin +import org.eclipse.ui.console.MessageConsole +import org.eclipse.ui.console.MessageConsoleStream + +class RuntimeConsoleBasedScriptConsole extends ScriptConsole { + /** + * Console is identified with the name of this class. + */ + static val consoleID = ScriptConsole.name + + val MessageConsole runtimeConsole + + new(boolean cleanFiles, URI messageConsoleURI, URI errorConsoleURI, URI statisticsConsoleURI) { + super(!hasConsolePlugin, cleanFiles, messageConsoleURI, errorConsoleURI, statisticsConsoleURI) + runtimeConsole = prepareRuntimeConsole + writeErrorMessagesDuringInitialisation() + } + + override writeMessage(CharSequence message, String separator, ScriptConsoleDecorator[] decorators) { + super.writeMessage(message, separator, decorators) + if (runtimeConsole !== null) { + writeToRuntimeConsole(message, separator, decorators) + } + } + + override writeMessage(String message) { + super.writeMessage(message) + if (runtimeConsole !== null) { + writeToRuntimeConsole(message) + } + } + + override writeError(CharSequence message, String separator, ScriptConsoleDecorator[] decorators) { + super.writeError(message, separator, decorators) + if (runtimeConsole !== null) { + writeToRuntimeConsole(message, separator, decorators) + } + } + + override writeError(String message) { + super.writeError(message) + if (runtimeConsole !== null) { + writeToRuntimeConsole(message) + } + } + + private def MessageConsole prepareRuntimeConsole() { + val plugin = ConsolePlugin.getDefault(); + if (plugin === null) { + return null + } else { + val conMan = plugin.getConsoleManager(); + val existingConsoles = conMan.getConsoles(); + val existingConsolesWithID = existingConsoles.filter[it.name.equals(consoleID)] + if (existingConsolesWithID.empty) { + val MessageConsole res = new MessageConsole(consoleID, null) + conMan.addConsoles(#[res]); + + return res + } else { + return existingConsolesWithID.head as MessageConsole + } + } + } + + private def writeToRuntimeConsole(CharSequence message) { + // 1. reveal the console view + ConsolePlugin.getDefault().getConsoleManager().showConsoleView(this.runtimeConsole); + val stream = this.runtimeConsole.newMessageStream + stream.println(message.toString) + stream.close + } + + private def writeToRuntimeConsole(CharSequence message, String separator, ScriptConsoleDecorator[] decorators) { + val messageString = message.toString + // 0. split the message + val separatedMessage = if (messageString.startsWith(separator)) { + #[""] + messageString.split(separator, -1) + } else { + messageString.split(separator, -1).toList + } + if (separatedMessage.size - 1 !== decorators.size) { + throw new IllegalArgumentException + } + + // 1. reveal the console view + ConsolePlugin.getDefault().getConsoleManager().showConsoleView(this.runtimeConsole); + val stream = this.runtimeConsole.newMessageStream + + // 2. print the segments of the view + for (i : 0 ..< decorators.size) { + stream.print(separatedMessage.get(i)) + writeDecoratedTextToRuntimeConsole(decorators.get(i), stream) + + } + // 2.1 write the last segment of + stream.println(separatedMessage.last) + + // stream.println(message.toString) + stream.close + } + + private def writeDecoratedTextToRuntimeConsole(ScriptConsoleDecorator message, MessageConsoleStream stream) { + val originalBackgroundColor = this.runtimeConsole.background + var Color newColor = null; + + val text = '''[«message.text»]''' + if (message.red >= 0 && message.green >= 0 && message.blue >= 0) { + newColor = new Color(originalBackgroundColor.device, message.red, message.green, message.blue) + this.runtimeConsole.setBackground(newColor) + } + stream.flush + val CompletableFuture finished = new CompletableFuture + val listener = new IDocumentListener() { + override documentAboutToBeChanged(DocumentEvent event) {} + + override documentChanged(DocumentEvent event) { + // println('''ftext="«event.fText»", message="«message.text»" endswith=«event.fText.endsWith(message.text)»''') + if (event.fText.endsWith(text)) { + val from = event.fDocument.length - text.length + 1 + val length = message.text.length + // println('''from: «from» length «length»''') + try { + runtimeConsole.addHyperlink( + new ScriptConsoleFileHiperlink(message.hyperlink), + from, + length + ) + // println("link added") + } catch (BadLocationException e) { + } finally { + runtimeConsole.document.removeDocumentListener(this) + finished.complete(true) + } + } + + } + } + runtimeConsole.document.addDocumentListener(listener) + stream.print(text) + stream.flush + finished.get + // stream.console.new + if (message.red >= 0 && message.green >= 0 && message.blue >= 0) { + newColor.dispose + this.runtimeConsole.setBackground(originalBackgroundColor) + } + } + + private static def hasConsolePlugin() { + ConsolePlugin.getDefault() !== null + } + + public static val FACTORY = new ScriptConsole.Factory { + + override createScriptConsole(boolean cleanFiles, URI messageConsoleURI, URI errorConsoleURI, + URI statisticsConsoleURI) { + new RuntimeConsoleBasedScriptConsole(cleanFiles, messageConsoleURI, errorConsoleURI, statisticsConsoleURI) + } + + } +} diff --git a/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/ScriptConsoleFileHiperlink.xtend b/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/ScriptConsoleFileHiperlink.xtend new file mode 100644 index 00000000..16d78a31 --- /dev/null +++ b/Application/hu.bme.mit.inf.dslreasoner.application.ui/src/hu/bme/mit/inf/dslreasoner/application/ui/execute/ScriptConsoleFileHiperlink.xtend @@ -0,0 +1,28 @@ +package hu.bme.mit.inf.dslreasoner.application.ui.execute + +import java.io.File +import java.net.URI +import org.eclipse.core.filesystem.EFS +import org.eclipse.ui.PlatformUI +import org.eclipse.ui.console.IHyperlink +import org.eclipse.ui.ide.IDE + +class ScriptConsoleFileHiperlink implements IHyperlink { + + val URI path + + new(File file) { + this.path = file.toURI() + } + + override linkActivated() { + // println("open path: "+path.toString) + val page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + val fileStore = EFS.getStore(path) + IDE.openEditorOnFileStore(page, fileStore) + } + + override linkEntered() {} + + override linkExited() {} +} -- cgit v1.2.3-70-g09d2