Author: koen.aers(a)jboss.com
Date: 2011-09-19 03:56:48 -0400 (Mon, 19 Sep 2011)
New Revision: 34844
Added:
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/io/ForgeAnsiCommandFilter.java
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeDocument.java
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeTextViewer.java
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeView.java
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/StartDelegate.java
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/StopDelegate.java
Modified:
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/io/ForgeHiddenOutputFilter.java
trunk/forge/plugins/org.jboss.tools.forge.runtime.ext/src/org/jboss/tools/forge/runtime/ext/EventHandler.java
trunk/forge/plugins/org.jboss.tools.forge.runtime.ext/src/org/jboss/tools/forge/runtime/ext/MetaCommandTriggeredAction.java
trunk/forge/plugins/org.jboss.tools.forge.ui/plugin.xml
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/commands/ForgeCommandListHandler.java
Log:
JBIDE-9735:
- add ForgeAnsiCommandFilter
- change hidden output escape sequence : 27 + '%'
- implement new ForgeView, ForgeTextViewer, ForgeDocument
Added:
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/io/ForgeAnsiCommandFilter.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/io/ForgeAnsiCommandFilter.java
(rev 0)
+++
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/io/ForgeAnsiCommandFilter.java 2011-09-19
07:56:48 UTC (rev 34844)
@@ -0,0 +1,55 @@
+package org.jboss.tools.forge.core.io;
+
+
+public abstract class ForgeAnsiCommandFilter implements ForgeOutputListener {
+
+ private ForgeOutputListener target = null;
+ private StringBuffer escapeSequence = new StringBuffer();
+ private StringBuffer targetBuffer = new StringBuffer();
+
+ public ForgeAnsiCommandFilter(ForgeOutputListener target) {
+ this.target = target;
+ }
+
+ public abstract void ansiCommandAvailable(String command);
+
+ @Override
+ public void outputAvailable(String output) {
+ for (int i = 0; i < output.length(); i++) {
+ char c = output.charAt(i);
+ if (c == 27) {
+ if (escapeSequence.length() == 0) {
+ if (targetBuffer.length() > 0) {
+ target.outputAvailable(targetBuffer.toString());
+ targetBuffer.setLength(0);
+ }
+ escapeSequence.append(c);
+ }
+ } else if (c == '[') {
+ if (escapeSequence.length() == 1) {
+ escapeSequence.append(c);
+ } else {
+ targetBuffer.append(c);
+ }
+ } else if (escapeSequence.length() > 1) {
+ escapeSequence.append(c);
+ if (isAnsiEnd(c)) {
+ ansiCommandAvailable(escapeSequence.toString());
+ escapeSequence.setLength(0);
+ }
+ } else {
+ targetBuffer.append(c);
+ }
+ }
+ if (targetBuffer.length() > 0) {
+ target.outputAvailable(targetBuffer.toString());
+ targetBuffer.setLength(0);
+ }
+ }
+
+ private boolean isAnsiEnd(char c) {
+ return c == 'G' ||
+ c == 'K';
+ }
+
+}
Modified:
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/io/ForgeHiddenOutputFilter.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/io/ForgeHiddenOutputFilter.java 2011-09-17
00:21:31 UTC (rev 34843)
+++
trunk/forge/plugins/org.jboss.tools.forge.core/src/org/jboss/tools/forge/core/io/ForgeHiddenOutputFilter.java 2011-09-19
07:56:48 UTC (rev 34844)
@@ -30,21 +30,9 @@
}
escapeSequence.setLength(0);
}
- } else if (c == '[') {
+ } else if (c == '%') {
if (escapeSequence.length() == 1) {
- escapeSequence.append(c);
- } else {
- escapeSequence.append(c);
if (hidden) {
- hiddenBuffer.append(escapeSequence);
- } else {
- targetBuffer.append(escapeSequence);
- }
- escapeSequence.setLength(0);
- }
- } else if (c == '%') {
- if (escapeSequence.length() == 2) {
- if (hidden) {
handleFilteredString(hiddenBuffer.toString());
hiddenBuffer.setLength(0);
} else {
Modified:
trunk/forge/plugins/org.jboss.tools.forge.runtime.ext/src/org/jboss/tools/forge/runtime/ext/EventHandler.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.runtime.ext/src/org/jboss/tools/forge/runtime/ext/EventHandler.java 2011-09-17
00:21:31 UTC (rev 34843)
+++
trunk/forge/plugins/org.jboss.tools.forge.runtime.ext/src/org/jboss/tools/forge/runtime/ext/EventHandler.java 2011-09-19
07:56:48 UTC (rev 34844)
@@ -8,7 +8,7 @@
public class EventHandler {
- private static final String ESCAPE = new String(new char[] { 27, '[',
'%'} );
+ private static final String ESCAPE = new String(new char[] { 27, '%'} );
@Inject
private Shell shell;
Modified:
trunk/forge/plugins/org.jboss.tools.forge.runtime.ext/src/org/jboss/tools/forge/runtime/ext/MetaCommandTriggeredAction.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.runtime.ext/src/org/jboss/tools/forge/runtime/ext/MetaCommandTriggeredAction.java 2011-09-17
00:21:31 UTC (rev 34843)
+++
trunk/forge/plugins/org.jboss.tools.forge.runtime.ext/src/org/jboss/tools/forge/runtime/ext/MetaCommandTriggeredAction.java 2011-09-19
07:56:48 UTC (rev 34844)
@@ -2,6 +2,8 @@
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -17,11 +19,13 @@
public class MetaCommandTriggeredAction implements TriggeredAction {
- private static final String ESCAPE = new String(new char[] { 27, '[',
'%' });
+ private static final String ESCAPE = new String(new char[] { 27, '%' });
@Inject Shell shell;
@Inject PluginRegistry registry;
+
+
@Override
public ActionListener getListener() {
@@ -41,28 +45,58 @@
}
private void handleHiddenCommand(String text) {
- if ("plugin-candidates-query".equals(text)) {
- shell.print(ESCAPE + "plugin-candidates-answer: " + getPluginCandidates() +
ESCAPE);
+ try {
+ FileWriter fileWriter = new
FileWriter("/Users/koen/Temp/handleHiddenCommand.txt", true);
+ BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
+ bufferedWriter.write("handleHiddenCommand(" + text + ")\n");
+ if ("plugin-candidates-query".equals(text)) {
+ bufferedWriter.write("query is plugin-candidates-query\n");
+ shell.print(ESCAPE + "plugin-candidates-answer: " + getPluginCandidates() +
ESCAPE);
+ bufferedWriter.write("response sent back to tools\n");
+ }
+ bufferedWriter.write("about to exit handleHiddenCommand\n");
+ bufferedWriter.flush();
+// fileWriter.close();
+ } catch (Exception e) {
+ // ignored
}
}
private String getPluginCandidates() {
- StringBuffer resultBuffer = new StringBuffer();
- Map<String, List<PluginMetadata>> plugins = registry.getPlugins();
- for (Entry<String, List<PluginMetadata>> entry : plugins.entrySet()) {
- for (PluginMetadata pluginMeta : entry.getValue()) {
- if (pluginMeta.constrantsSatisfied(shell)) {
- List<CommandMetadata> commands = pluginMeta.getAllCommands();
- if (!commands.isEmpty()) {
- resultBuffer.append("p:").append(pluginMeta.getName()).append('
');
- for (CommandMetadata commandMeta : commands) {
- resultBuffer.append("c:").append(commandMeta.getName()).append('
');
+ try {
+ FileWriter fileWriter = new
FileWriter("/Users/koen/Temp/getPluginCandidates.txt", true);
+ BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
+ bufferedWriter.write("getPluginCandidates()\n");
+ StringBuffer resultBuffer = new StringBuffer();
+ Map<String, List<PluginMetadata>> plugins = registry.getPlugins();
+ bufferedWriter.write("got the plugins\n");
+ for (Entry<String, List<PluginMetadata>> entry : plugins.entrySet()) {
+ bufferedWriter.write("processing entry : " + entry.getKey() +
"\n");
+ for (PluginMetadata pluginMeta : entry.getValue()) {
+ bufferedWriter.write("processing pluginMeta : " + pluginMeta.getName());
+ if (pluginMeta.constrantsSatisfied(shell)) {
+ bufferedWriter.write("pluginMeta : " + pluginMeta.getName() + "
satisfies constraints\n");
+ List<CommandMetadata> commands = pluginMeta.getAllCommands();
+ bufferedWriter.write("got the commands\n");
+ if (!commands.isEmpty()) {
+ bufferedWriter.write("commands is not empty\n");
+ resultBuffer.append("p:").append(pluginMeta.getName()).append('
');
+ bufferedWriter.write("result becomes : " + resultBuffer.toString() +
"\n");
+ for (CommandMetadata commandMeta : commands) {
+ bufferedWriter.write("processing command : " + commandMeta.getName() +
"\n");
+ resultBuffer.append("c:").append(commandMeta.getName()).append('
');
+ bufferedWriter.write("result becomes : " + resultBuffer.toString() +
"\n");
+ }
}
}
}
}
+ bufferedWriter.write("about to return result : " + resultBuffer.toString() +
"\n");
+ bufferedWriter.flush();
+ return resultBuffer.toString();
+ } catch (Exception e) {
+ return null;
}
- return resultBuffer.toString();
}
@Override
Modified: trunk/forge/plugins/org.jboss.tools.forge.ui/plugin.xml
===================================================================
--- trunk/forge/plugins/org.jboss.tools.forge.ui/plugin.xml 2011-09-17 00:21:31 UTC (rev
34843)
+++ trunk/forge/plugins/org.jboss.tools.forge.ui/plugin.xml 2011-09-19 07:56:48 UTC (rev
34844)
@@ -9,11 +9,18 @@
</category>
<view
category="org.jboss.tools.forge"
- class="org.jboss.tools.forge.ui.part.ConsoleView"
+ class="org.jboss.tools.forge.ui.trials.ForgeView"
id="org.jboss.tools.forge.console"
name="Forge Console"
restorable="true">
</view>
+<!-- <view
+ category="org.jboss.tools.forge"
+ class="org.jboss.tools.forge.ui.part.ConsoleView"
+ id="org.jboss.tools.forge.console"
+ name="Forge Console"
+ restorable="true">
+ </view> -->
</extension>
<extension
point="org.eclipse.ui.viewActions">
@@ -24,7 +31,7 @@
id="org.jboss.tools.forge.menubar"
label="Forge">
</menu>
- <action
+<!-- <action
class="org.jboss.tools.forge.ui.action.StopDelegate"
icon="icons/stop.gif"
id="org.jboss.tools.forge.stop"
@@ -41,7 +48,25 @@
menubarPath="org.jboss.tools.forge.menu"
style="push"
toolbarPath="org.jboss.tools.forge.toolbar">
+ </action> -->
+ <action
+ class="org.jboss.tools.forge.ui.trials.StopDelegate"
+ icon="icons/stop.gif"
+ id="org.jboss.tools.forge.stop"
+ label="Stop Forge"
+ menubarPath="org.jboss.tools.forge.menubar"
+ style="push"
+ toolbarPath="org.jboss.tools.forge.toolbar">
</action>
+ <action
+ class="org.jboss.tools.forge.ui.trials.StartDelegate"
+ icon="icons/start.gif"
+ id="org.jboss.tools.forge.start"
+ label="Start Forge"
+ menubarPath="org.jboss.tools.forge.menu"
+ style="push"
+ toolbarPath="org.jboss.tools.forge.toolbar">
+ </action>
</viewContribution>
</extension>
<extension point="org.eclipse.ui.preferencePages">
Modified:
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/commands/ForgeCommandListHandler.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/commands/ForgeCommandListHandler.java 2011-09-17
00:21:31 UTC (rev 34843)
+++
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/commands/ForgeCommandListHandler.java 2011-09-19
07:56:48 UTC (rev 34844)
@@ -7,7 +7,7 @@
import org.eclipse.ui.handlers.HandlerUtil;
import org.jboss.tools.forge.core.process.ForgeRuntime;
import org.jboss.tools.forge.ui.dialog.ForgeCommandListDialog;
-import org.jboss.tools.forge.ui.part.ConsoleView;
+import org.jboss.tools.forge.ui.trials.ForgeView;
public class ForgeCommandListHandler extends AbstractHandler {
@@ -17,12 +17,12 @@
if (window == null) {
return null;
}
- IViewPart part = window.getActivePage().findView(ConsoleView.ID);
- if (part == null || !(part instanceof ConsoleView)) {
+ IViewPart part = window.getActivePage().findView(ForgeView.ID);
+ if (part == null || !(part instanceof ForgeView)) {
return null;
}
- ForgeRuntime runtime = ((ConsoleView)part).getRuntime();
+ ForgeRuntime runtime = ((ForgeView)part).getRuntime();
if (runtime == null || !(ForgeRuntime.STATE_RUNNING.equals(runtime.getState()))) {
return null;
}
Added:
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeDocument.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeDocument.java
(rev 0)
+++
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeDocument.java 2011-09-19
07:56:48 UTC (rev 34844)
@@ -0,0 +1,28 @@
+package org.jboss.tools.forge.ui.trials;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Document;
+import org.eclipse.swt.widgets.Display;
+
+public class ForgeDocument extends Document {
+
+ public void appendString(final String str) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ for (int i = 0; i < str.length(); i++) {
+ char c = str.charAt(i);
+ if (c == '\r') continue; //ignore
+ if (str.charAt(i) == '\b') {
+ replace(getLength() - 1, 1, "");
+ } else {
+ replace(getLength(), 0, str.substring(i, i + 1));
+ }
+ }
+ } catch (BadLocationException e) {}
+ }
+ });
+ }
+
+}
Added:
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeTextViewer.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeTextViewer.java
(rev 0)
+++
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeTextViewer.java 2011-09-19
07:56:48 UTC (rev 34844)
@@ -0,0 +1,201 @@
+package org.jboss.tools.forge.ui.trials;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.jboss.tools.forge.core.io.ForgeAnsiCommandFilter;
+import org.jboss.tools.forge.core.io.ForgeHiddenOutputFilter;
+import org.jboss.tools.forge.core.io.ForgeOutputListener;
+import org.jboss.tools.forge.core.process.ForgeRuntime;
+import org.jboss.tools.forge.ui.ForgeUIPlugin;
+import org.jboss.tools.forge.ui.console.CommandRecorder;
+
+public class ForgeTextViewer extends TextViewer {
+
+ private static String BACKSPACE = new Character('\b').toString();
+ private static String UP_ARROW = new Character((char)16).toString();
+ private static String DOWN_ARROW = new Character((char)14).toString();
+
+ private class RuntimeStopListener implements PropertyChangeListener {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (ForgeRuntime.PROPERTY_STATE.equals(evt.getPropertyName()) &&
+ ForgeRuntime.STATE_NOT_RUNNING.equals(evt.getNewValue())) {
+ handleRuntimeStopped();
+ }
+ }
+ }
+
+ private class ConsoleKeyListener implements KeyListener {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ }
+ @Override
+ public void keyReleased(KeyEvent e) {
+ if (e.keyCode == SWT.BS) {
+ handleBackspace();
+ } else if (e.keyCode == SWT.ARROW_UP) {
+ handleArrowUp();
+ } else if (e.keyCode == SWT.ARROW_DOWN) {
+ handleArrowDown();
+ } else if (e.keyCode == SWT.F1) {
+ handleF1Down();
+ }
+ }
+ }
+
+ private class DocumentListener implements IDocumentListener {
+ @Override
+ public void documentAboutToBeChanged(DocumentEvent event) {
+ }
+ @Override
+ public void documentChanged(DocumentEvent event) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ StyledText textWidget = getTextWidget();
+ if (textWidget != null && !textWidget.isDisposed()) {
+ int lineCount = textWidget.getLineCount();
+ textWidget.setTopIndex(lineCount - 1);
+ textWidget.setCaretOffset(textWidget.getCharCount());
+ }
+ }
+ });
+ }
+ }
+
+ private RuntimeStopListener stopListener;
+ private ForgeOutputListener outputListener;
+ private ForgeRuntime runtime;
+ private ForgeDocument document;
+
+ public ForgeTextViewer(Composite parent, ForgeRuntime runtime) {
+ super(parent, SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
+ this.runtime = runtime;
+ initialize();
+ }
+
+ private void initialize() {
+ initDocument();
+ initViewer();
+ initCommandRecorder();
+ initOutputListener();
+ initStopListener();
+ }
+
+ private void initDocument() {
+ document = new ForgeDocument();
+ document.addDocumentListener(new DocumentListener());
+ setDocument(document);
+ }
+
+ private void initViewer() {
+ StyledText textWidget = getTextWidget();
+ textWidget.setFont(JFaceResources.getFont(JFaceResources.TEXT_FONT));
+ textWidget.addKeyListener(new ConsoleKeyListener());
+ }
+
+ private void initCommandRecorder() {
+ getDocument().addDocumentListener(new CommandRecorder());
+ }
+
+ private void initOutputListener() {
+ ForgeOutputListener target = new ForgeOutputListener() {
+ @Override
+ public void outputAvailable(String output) {
+ document.appendString(output);
+ }
+ };
+ ForgeAnsiCommandFilter ansiCommandFilter = new ForgeAnsiCommandFilter(target) {
+ @Override
+ public void ansiCommandAvailable(String command) {
+ executeAnsiCommand(command);
+ }
+ };
+ outputListener = new ForgeHiddenOutputFilter(ansiCommandFilter) {
+ @Override
+ public void handleFilteredString(String str) {
+ System.out.println("handleHiddenOutput : " + str);
+ }
+ };
+ runtime.addOutputListener(outputListener);
+ }
+
+ private void initStopListener() {
+ stopListener = new RuntimeStopListener();
+ runtime.addPropertyChangeListener(stopListener);
+ }
+
+ private void handleRuntimeStopped() {
+ runtime.removePropertyChangeListener(stopListener);
+ stopListener = null;
+ runtime.removeOutputListener(outputListener);
+ outputListener = null;
+ }
+
+ protected void handleVerifyEvent(VerifyEvent e) {
+ runtime.sendInput(e.text);
+ e.doit = false;
+ }
+
+ private void handleBackspace() {
+ runtime.sendInput(BACKSPACE);
+ }
+
+ private void handleArrowUp() {
+ runtime.sendInput(UP_ARROW);
+ }
+
+ private void handleArrowDown() {
+ runtime.sendInput(DOWN_ARROW);
+ }
+
+ private void handleF1Down() {
+ runtime.sendInput(new Character((char)31).toString() + "hidden
command!\n");
+ }
+
+ private void executeAnsiCommand(final String command) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ char c = command.charAt(command.length() - 1);
+ switch (c) {
+ case 'G' : moveCursorAbsolute(command); break;
+ case 'K' : clearCurrentLine(command); break;
+ }
+ }
+ });
+ }
+
+ private void moveCursorAbsolute(final String command) {
+ try {
+ int column = Integer.valueOf(command.substring(2, command.length() - 1));
+ int lineStart =
document.getLineOffset(document.getLineOfOffset(getTextWidget().getCaretOffset()));
+ getTextWidget().setCaretOffset(lineStart + column - 1);
+ } catch (BadLocationException e) {
+ ForgeUIPlugin.log(e);
+ }
+ }
+
+ private void clearCurrentLine(String command) {
+ try {
+ int caretOffset = getTextWidget().getCaretOffset();
+ document.replace(caretOffset, document.getLength() - caretOffset,
"");
+ } catch (BadLocationException e) {
+ ForgeUIPlugin.log(e);
+ }
+ }
+
+}
Added:
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeView.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeView.java
(rev 0)
+++
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/ForgeView.java 2011-09-19
07:56:48 UTC (rev 34844)
@@ -0,0 +1,228 @@
+package org.jboss.tools.forge.ui.trials;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.part.MessagePage;
+import org.eclipse.ui.part.Page;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.ui.part.PageSite;
+import org.eclipse.ui.part.ViewPart;
+import org.jboss.tools.forge.core.preferences.ForgeRuntimesPreferences;
+import org.jboss.tools.forge.core.process.ForgeRuntime;
+import org.jboss.tools.forge.ui.ForgeUIPlugin;
+
+public class ForgeView extends ViewPart implements PropertyChangeListener {
+
+ public static final String ID = "org.jboss.tools.forge.console";
+
+ private static final String NOT_RUNNING_MESSAGE = "Forge is not running.";
+ private static final String STARTING_MESSAGE = "Please wait while Forge is
starting";
+
+ public static ForgeView INSTANCE;
+
+ private class ForgePage extends Page {
+
+ private ForgeTextViewer viewer;
+ private ForgeRuntime runtime;
+
+ public ForgePage(ForgeRuntime runtime) {
+ this.runtime = runtime;
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ viewer = new ForgeTextViewer(parent, runtime);
+ }
+
+ @Override
+ public Control getControl() {
+ return viewer == null ? null : viewer.getControl();
+ }
+
+ @Override
+ public void setFocus() {
+ viewer.getControl().setFocus();
+ }
+
+ }
+
+ private PageBook pageBook = null;
+ private Control notRunning;
+ private Control running;
+ private Page runningPage;
+ private MessagePage notRunningPage;
+ private String notRunningMessage;
+
+ private ForgeRuntime runtime;
+
+ public ForgeView() {
+ if (INSTANCE == null) {
+ INSTANCE = this;
+ }
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ pageBook = new PageBook(parent, SWT.NONE);
+ createNotRunningPage(parent);
+ showPage(notRunning);
+ }
+
+ private void createNotRunningPage(Composite parent) {
+ MessagePage page = new MessagePage();
+ page.createControl(pageBook);
+ page.init(new PageSite(getViewSite()));
+ notRunningMessage = NOT_RUNNING_MESSAGE;
+ page.setMessage(notRunningMessage);
+ notRunning = page.getControl();
+ notRunningPage = page;
+ }
+
+ @Override
+ public void setFocus() {
+ if (runtime != null && ForgeRuntime.STATE_RUNNING.equals(runtime.getState()))
{
+ runningPage.setFocus();
+ }
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (ForgeRuntime.PROPERTY_STATE.equals(evt.getPropertyName())) {
+ if (ForgeRuntime.STATE_STARTING.equals(evt.getNewValue())) {
+ handleStateStarting();
+ } else if (ForgeRuntime.STATE_RUNNING.equals(evt.getNewValue())) {
+ handleStateRunning();
+ } else if (ForgeRuntime.STATE_NOT_RUNNING.equals(evt.getNewValue())) {
+ handleStateNotRunning();
+ }
+ }
+ }
+
+ private void handleStateStarting() {
+ getDisplay().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ notRunningMessage = STARTING_MESSAGE;
+ notRunningPage.setMessage(notRunningMessage);
+ createRunningPage();
+ }
+ });
+ }
+
+ private void handleStateRunning() {
+ showPage(running);
+ }
+
+ private void handleStateNotRunning() {
+ if (runtime != null) {
+ runtime.removePropertyChangeListener(INSTANCE);
+ runtime = null;
+ }
+ getDisplay().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ notRunningMessage = NOT_RUNNING_MESSAGE;
+ if (!notRunningPage.getControl().isDisposed()) {
+ notRunningPage.setMessage(notRunningMessage);
+ }
+ showPage(notRunning);
+ }
+ });
+ }
+
+ private void showPage(final Control control) {
+ if (getSite().getShell() != null) {
+ getDisplay().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ pageBook.showPage(control);
+ }
+ });
+ }
+ }
+
+ private void createRunningPage() {
+ Control oldForgeIsRunning = running;
+ Page oldForgeIsRunningPage = runningPage;
+ runningPage = new ForgePage(runtime);
+ runningPage.createControl(pageBook);
+ runningPage.init(new PageSite(getViewSite()));
+ running = runningPage.getControl();
+ if (oldForgeIsRunningPage != null) {
+ oldForgeIsRunningPage.dispose();
+ }
+ if (oldForgeIsRunning != null) {
+ oldForgeIsRunning.dispose();
+ }
+ }
+
+ public void dispose() {
+ if (runtime != null) {
+ runtime.stop(null);
+ runtime = null;
+ }
+ super.dispose();
+ }
+
+ public void startForge() {
+ if (runtime != null) return;
+ runtime = ForgeRuntimesPreferences.INSTANCE.getDefault();
+ runtime.addPropertyChangeListener(INSTANCE);
+ Job job = new Job("Starting Forge") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ runtime.start(monitor);
+ return Status.OK_STATUS;
+ }
+ };
+ job.schedule();
+ Thread waitThread = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ while (!ForgeRuntime.STATE_RUNNING.equals(runtime.getState())) {
+ try {
+ Thread.sleep(1000);
+ updateNonRunningPage();
+ } catch (InterruptedException e) {
+ ForgeUIPlugin.log(e);
+ }
+ }
+ }
+ });
+ waitThread.start();
+ }
+
+ private void updateNonRunningPage() {
+ getDisplay().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ notRunningMessage += '.';
+ notRunningPage.setMessage(notRunningMessage);
+ }
+ });
+ }
+
+ public void stopForge() {
+ if (runtime == null) return;
+ final IProgressMonitor progressMonitor =
getViewSite().getActionBars().getStatusLineManager().getProgressMonitor();
+ runtime.stop(progressMonitor);
+ }
+
+ private Display getDisplay() {
+ return getSite().getShell().getDisplay();
+ }
+
+ public ForgeRuntime getRuntime() {
+ return runtime;
+ }
+
+}
Added:
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/StartDelegate.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/StartDelegate.java
(rev 0)
+++
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/StartDelegate.java 2011-09-19
07:56:48 UTC (rev 34844)
@@ -0,0 +1,27 @@
+package org.jboss.tools.forge.ui.trials;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+public class StartDelegate implements IViewActionDelegate {
+
+ @Override
+ public void run(IAction action) {
+ ForgeView.INSTANCE.startForge();
+ }
+
+ @Override
+ public void selectionChanged(IAction action, ISelection selection) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void init(IViewPart view) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
Added:
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/StopDelegate.java
===================================================================
---
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/StopDelegate.java
(rev 0)
+++
trunk/forge/plugins/org.jboss.tools.forge.ui/src/org/jboss/tools/forge/ui/trials/StopDelegate.java 2011-09-19
07:56:48 UTC (rev 34844)
@@ -0,0 +1,27 @@
+package org.jboss.tools.forge.ui.trials;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+public class StopDelegate implements IViewActionDelegate {
+
+ @Override
+ public void run(IAction action) {
+ ForgeView.INSTANCE.stopForge();
+ }
+
+ @Override
+ public void selectionChanged(IAction action, ISelection selection) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void init(IViewPart view) {
+ // TODO Auto-generated method stub
+
+ }
+
+}