package monolipse.ui.views;
import monolipse.core.interpreter.IInterpreterListener;
import monolipse.core.interpreter.InteractiveInterpreter;
import monolipse.ui.BooUI;
import monolipse.ui.TextViewerUtilities;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.text.contentassist.ContentAssistant;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.custom.VerifyKeyListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
public class BooInteractiveInterpreterView extends ViewPart {
public static final String ID_VIEW = "monolipse.ui.views.BooInteractiveInterpreterView";
Action _actionReset;
Action action2;
private TextViewer _text;
InteractiveInterpreter _interpreter;
/**
* The constructor.
*/
public BooInteractiveInterpreterView() {
}
/**
* This is a callback that will allow us
* to create the viewer and initialize it.
*/
public void createPartControl(Composite parent) {
try {
_interpreter = new InteractiveInterpreter();
} catch (CoreException x) {
BooUI.logException(x);
return;
}
_text = new TextViewer(parent, SWT.FULL_SELECTION|SWT.MULTI/*|SWT.BORDER*/|SWT.V_SCROLL);
_text.setDocument(new Document());
final StyledText textWidget = _text.getTextWidget();
textWidget.setFont(JFaceResources.getTextFont());
_text.prependVerifyKeyListener(new VerifyKeyListener() {
public void verifyKey(VerifyEvent e) {
if (e.character == '\r') {
e.doit = false;
try {
final String currentLine = getCurrentLine();
if (currentLine.equals("cls")) {
textWidget.getContent().setText("");
return;
}
_interpreter.eval(currentLine);
_text.setEditable(false);
} catch (Exception x) {
BooUI.logException(x);
}
}
}
});
_interpreter.addListener(new IInterpreterListener() {
public void evalFinished(final String result) {
textWidget.getDisplay().asyncExec(new Runnable() {
public void run() {
prompt(result);
}
});
}
});
final ContentAssistant assistant = new ContentAssistant();
assistant.setContentAssistProcessor(
new BooContentAssistProcessor(_interpreter),
IDocument.DEFAULT_CONTENT_TYPE);
assistant.install(_text);
assistant.enableAutoActivation(true);
/*
_text.getControl().addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
switch (e.keyCode) {
case SWT.F1:
assistant.showPossibleCompletions();
break;
default:
//ignore everything else
}
}
});*/
makeActions();
hookContextMenu();
contributeToActionBars();
}
protected String getCurrentLine() {
return getLineAtOffset(_text.getTextWidget().getCaretOffset());
}
private String getLineAtOffset(final int offset) {
return TextViewerUtilities.getLineAtOffset(_text, offset);
}
public void dispose() {
if (null != _interpreter) {
_interpreter.dispose();
_interpreter = null;
}
super.dispose();
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
BooInteractiveInterpreterView.this.fillContextMenu(manager);
}
});
//Menu menu = menuMgr.createContextMenu(viewer.getControl());
//viewer.getControl().setMenu(menu);
//getSite().registerContextMenu(menuMgr, viewer);
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
private void fillLocalPullDown(IMenuManager manager) {
manager.add(_actionReset);
manager.add(new Separator());
manager.add(action2);
}
private void fillContextMenu(IMenuManager manager) {
manager.add(_actionReset);
manager.add(action2);
// Other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void fillLocalToolBar(IToolBarManager manager) {
manager.add(_actionReset);
manager.add(action2);
}
private void makeActions() {
_actionReset = new Action() {
public void run() {
if (null != _interpreter) {
_interpreter.unload();
}
prompt("interpreter reset");
}
};
_actionReset.setText("Reset Interpreter");
_actionReset.setToolTipText("resets the interpreter");
_actionReset.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
getImageDescriptor(ISharedImages.IMG_OBJS_WARN_TSK));
action2 = new Action() {
public void run() {
showMessage("Action 2 executed");
}
};
action2.setText("Action 2");
action2.setToolTipText("Action 2 tooltip");
action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
}
private void showMessage(String message) {
MessageDialog.openInformation(
getSite().getShell(),
"Boo Interactive Interpreter",
message);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
_text.getControl().setFocus();
}
private void prompt(String message) {
StyledText widget = _text.getTextWidget();
widget.setSelection(0, 0);
widget.insert(message);
widget.insert("\n");
widget.setCaretOffset(0);
widget.setEditable(true);
}
}