package com.onpositive.google.scrapbook;
import java.util.ArrayList;
//import org.eclipse.core.resources.IFile;
//import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ImportDeclaration;
import org.eclipse.jdt.core.eval.IEvaluationContext;
import org.eclipse.jdt.internal.debug.ui.JDIContentAssistPreference;
import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
import org.eclipse.jdt.internal.debug.ui.JDISourceViewer;
import org.eclipse.jdt.internal.debug.ui.snippeteditor.SnippetMessages;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.text.JavaPairMatcher;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jdt.ui.text.IJavaPartitions;
import org.eclipse.jdt.ui.text.JavaSourceViewerConfiguration;
import org.eclipse.jdt.ui.text.JavaTextTools;
import org.eclipse.jdt.ui.text.java.CompletionProposalCollector;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.preference.PreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.contentassist.ContentAssistant;
import org.eclipse.jface.text.contentassist.IContentAssistant;
import org.eclipse.jface.text.source.ICharacterPairMatcher;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.IVerticalRuler;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.editors.text.EditorsUI;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
import org.eclipse.ui.texteditor.ChainedPreferenceStore;
import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
@SuppressWarnings("restriction")
public class ConsoleEditor extends AbstractDecoratedTextEditor {
private static final String DESCR = "<h3>Type snippet, press launch button, and enjoy the results</h3>"+
"<i>Hint:use 'out' variable to print results to console.</i>";
private Browser browser;
private IJavaProject fJavaProject;
private IEvaluationContext fEvaluationContext;
private Action debugMode;
private ISourceViewer viewer;
//private String[] fImports;
public ConsoleEditor() {
setDocumentProvider(JDIDebugUIPlugin.getDefault()
.getSnippetDocumentProvider());
IPreferenceStore store = new ChainedPreferenceStore(
new IPreferenceStore[] {
PreferenceConstants.getPreferenceStore(),
EditorsUI.getPreferenceStore() });
setSourceViewerConfiguration(new JavaSnippetViewerConfiguration(
JDIDebugUIPlugin.getDefault().getJavaTextTools(), store, this));
setPreferenceStore(store);
}
public boolean isSaveAsAllowed() {
return true;
}
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
super.setSite(site);
super.setInput(input);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.texteditor.AbstractTextEditor#createSourceViewer(org.eclipse
* .swt.widgets.Composite, org.eclipse.jface.text.source.IVerticalRuler,
* int)
*/
protected ISourceViewer createSourceViewer(Composite parent,
IVerticalRuler ruler, int styles) {
fAnnotationAccess = getAnnotationAccess();
fOverviewRuler = createOverviewRuler(getSharedColors());
ISourceViewer viewer = new JDISourceViewer(parent, ruler,
getOverviewRuler(), isOverviewRulerVisible(), styles
| SWT.LEFT_TO_RIGHT);
// ensure decoration support has been created and configured.
getSourceViewerDecorationSupport(viewer);
this.viewer=viewer;
return viewer;
}
public ISourceViewer getViewer(){
return getSourceViewer();
}
protected void configureSourceViewerDecorationSupport(
SourceViewerDecorationSupport support) {
support.setMatchingCharacterPainterPreferenceKeys(PreferenceConstants.EDITOR_MATCHING_BRACKETS, PreferenceConstants.EDITOR_MATCHING_BRACKETS_COLOR);
support.setCharacterPairMatcher(new JavaPairMatcher(new char[]{ '{', '}', '(', ')', '[', ']', '<', '>' }));
super.configureSourceViewerDecorationSupport(support);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.texteditor.AbstractTextEditor#handlePreferenceStoreChanged
* (org.eclipse.jface.util.PropertyChangeEvent)
*/
protected void handlePreferenceStoreChanged(PropertyChangeEvent event) {
JDISourceViewer isv = (JDISourceViewer) getSourceViewer();
if (isv != null) {
IContentAssistant assistant = isv.getContentAssistant();
if (assistant instanceof ContentAssistant) {
JDIContentAssistPreference.changeConfiguration(
(ContentAssistant) assistant, event);
}
SourceViewerConfiguration configuration = getSourceViewerConfiguration();
if (configuration instanceof JavaSourceViewerConfiguration) {
JavaSourceViewerConfiguration jsv = (JavaSourceViewerConfiguration) configuration;
if (jsv.affectsTextPresentation(event)) {
jsv.handlePropertyChangeEvent(event);
isv.invalidateTextPresentation();
}
}
super.handlePreferenceStoreChanged(event);
}
}
public void dispose() {
ISourceViewer viewer = getSourceViewer();
if (viewer != null) {
((JDISourceViewer) viewer).dispose();
}
// getSite().getWorkbenchWindow().getPartService().removePartListener(
// fActivationListener);
super.dispose();
}
public void createPartControl(Composite parent) {
IDocument document = getDocumentProvider().getDocument(getEditorInput());
JavaTextTools tools= JavaPlugin.getDefault().getJavaTextTools();
tools.setupJavaDocumentPartitioner(document, IJavaPartitions.JAVA_PARTITIONING);
FormToolkit tk = new FormToolkit(parent.getDisplay());
Form createForm = tk.createForm(parent);
createForm.setText(getTitle()+" ("+getJavaProject().getElementName()+" )");
/* Action launch = new Action() {
public void run() {
doIt(this,true);
}
};*/
//launch.setText("Run snippet on local server");
debugMode = new Action("Run snippet") { // in context of deployed application
public void run(){
//com.onpositive.gae.baseviewer.Activator
//IPreferenceStore ps = com.onpositive.gae.baseviewer.Activator.getDefault().getPreferenceStore();
boolean isLocal = Platform.getPreferencesService().getBoolean("com.onpositive.gae.base.manager","CONNECTION_MODE",false,null);
//boolean isLocal = ps.getBoolean("CONNECTION_MODE");
doIt(this,isLocal);
}
};
// ImageDescriptor imageDescriptorFromPlugin = Activator.imageDescriptorFromPlugin(
// Activator.PLUGIN_ID, "/icons/launch_run.gif");
//launch.setImageDescriptor(imageDescriptorFromPlugin);
debugMode.setImageDescriptor(Activator.imageDescriptorFromPlugin(
Activator.PLUGIN_ID, "/icons/exec_view_obj.gif"));
IToolBarManager toolBarManager = createForm.getToolBarManager();
//toolBarManager.add(launch);
toolBarManager.add(debugMode);
toolBarManager.update(true);
Composite body = createForm.getBody();
body.setLayout(new FillLayout());
tk.decorateFormHeading(createForm);
SashForm composite = new SashForm(body, SWT.NONE);
super.createPartControl(composite);
createForm.setLayoutData(GridDataFactory.fillDefaults()
.grab(true, true).create());
browser = new Browser(composite, SWT.NONE);
browser
.setText(DESCR);
// browser.setUrl(getConsoleRootUrl());
// composite.setWeights(new int[]{3,2});
Control textWidget = getSourceViewer().getTextWidget();
while (textWidget.getParent() != composite) {
textWidget = textWidget.getParent();
}
}
public void setFocus() {
}
public void codeComplete(CompletionProposalCollector fCollector)
throws JavaModelException {
ITextSelection selection = (ITextSelection) getSelectionProvider()
.getSelection();
int start = selection.getOffset();
String snippet = getSourceViewer().getDocument().get();
IEvaluationContext e = getEvaluationContext();
if (e != null) {
e.codeComplete(snippet, start, fCollector);
}
}
protected String[] getImports() {
String snippet = getSourceViewer().getDocument().get();
ASTParser newParser = ASTParser.newParser(AST.JLS3);
newParser.setSource(snippet.toCharArray());
CompilationUnit createAST = (CompilationUnit) newParser.createAST(null);
ArrayList<String> results = new ArrayList<String>();
for (Object n : createAST.imports()) {
ImportDeclaration decl = (ImportDeclaration) n;
String name = decl.getName().getFullyQualifiedName();
if (decl.isOnDemand()) {
results.add(name + ".*");
} else {
results.add(name);
}
}
return results.toArray(new String[results.size()]);
}
protected IEvaluationContext getEvaluationContext() {
if (fEvaluationContext == null) {
IJavaProject project = getJavaProject();
if (project != null) {
fEvaluationContext = project.newEvaluationContext();
}
}
if (fEvaluationContext != null) {
if (getImports() != null) {
fEvaluationContext.setImports(getImports());
} else {
fEvaluationContext.setImports(new String[] {});
}
fEvaluationContext.newVariable("java.io.PrintWriter", "out", "null");
}
return fEvaluationContext;
}
protected IJavaProject getJavaProject() {
if (fJavaProject == null) {
try {
fJavaProject = findJavaProject();
} catch (CoreException e) {
JDIDebugUIPlugin.log(e);
showError(e.getStatus());
}
}
return fJavaProject;
}
public IFile getFile() {
IEditorInput input = getEditorInput();
return (IFile) input.getAdapter(IFile.class);
}
protected IJavaProject findJavaProject() throws CoreException {
IEditorInput input = getEditorInput();
Object adapter = input.getAdapter(IJavaProject.class);
if (adapter!=null){
return (IJavaProject) adapter;
}
IFile file = getFile();
if (file != null) {
IProject p = file.getProject();
if (p.getNature(JavaCore.NATURE_ID) != null) {
return JavaCore.create(p);
}
}
return null;
}
protected void showError(IStatus status) {
if (!status.isOK()) {
ErrorDialog
.openError(
getShell(),
SnippetMessages
.getString("SnippetEditor.error.evaluating2"), null, status); //$NON-NLS-1$
}
}
protected Shell getShell() {
return getSite().getShell();
}
protected void showError(String message) {
Status status = new Status(IStatus.ERROR, JDIDebugUIPlugin
.getUniqueIdentifier(), IStatus.ERROR, message, null);
showError(status);
}
private void doIt(final Action action,final boolean isDebug) {
if (!com.onpositive.gae.tools.license.LicenseChecker.checkLicense(isDebug)){
return;
}
final IJavaProject pr = getJavaProject();
action.setEnabled(false);
browser.setText("<i>Evaluating...</i>");
Job job = new Job("Evaluating"){
protected IStatus run(IProgressMonitor monitor) {
byte[] compile = new CompilerFacade().compile(getSourceViewer()
.getDocument().get(), pr);
if (compile != null) {
final String evaluate = ConsoleServletCommunicatorFactory
.getCommunicator().evaluate(compile, pr,isDebug);
if (evaluate != null ) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (!browser.isDisposed()){
browser.setText(evaluate);
}
}
});
}
}
return Status.OK_STATUS;
}
};
job.addJobChangeListener(new JobChangeAdapter(){
public void done(IJobChangeEvent event) {
action.setEnabled(true);
}
});
job.schedule();
}
}