package org.codefaces.ui.internal.editors;
import java.io.IOException;
import org.codefaces.core.models.RepoFile;
import org.codefaces.ui.internal.CodeFacesUIActivator;
import org.codefaces.ui.internal.codeLanguages.CodeLanguage;
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.rwt.lifecycle.UICallBack;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
public class CodeExplorer extends EditorPart {
private class UpdateContentJob extends Job {
private final Display display;
private final RepoFile file;
public UpdateContentJob(Display display, RepoFile file) {
super("");
this.display = display;
this.file = file;
setSystem(true);
}
@Override
protected IStatus run(IProgressMonitor monitor) {
UICallBack.runNonUIThreadWithFakeContext(display, new Runnable() {
@Override
public void run() {
file.getContent();
}
});
display.asyncExec(new Runnable() {
@Override
public void run() {
if (browser != null && !browser.isDisposed()) {
setContent(file);
}
}
});
return Status.OK_STATUS;
}
}
public static final String ID = "org.codefaces.ui.editor.codeExplorer";
private static final String LOADING_HTML = readLoadingHTML();
public static final String PROP_REPO_RESOURCE = "REPO_RESOURCE";
private static String readLoadingHTML() {
String template = "Loading...";
try {
template = CodeFacesUIActivator.getDefault().readFileContent(
"public/templates/code_editor_loading.html");
} catch (IOException e) {
IStatus status = new Status(Status.ERROR,
CodeFacesUIActivator.PLUGIN_ID,
"Errors occur when reading code loading html", e);
CodeFacesUIActivator.getDefault().getLog().log(status);
}
return template;
}
private Browser browser;
@Override
public void createPartControl(Composite parent) {
browser = new Browser(parent, SWT.NONE);
setTitle();
setLoading();
new UpdateContentJob(browser.getShell().getDisplay(), getRepoFile())
.schedule();
}
@Override
public void doSave(IProgressMonitor monitor) {
// do nothing
}
@Override
public void doSaveAs() {
// do nothing
}
public RepoFile getRepoFile() {
return ((RepoFileInput) getEditorInput()).getFile();
}
@Override
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
if (!(input instanceof RepoFileInput)) {
throw new PartInitException("");
}
setSite(site);
setInput(input);
}
@Override
public boolean isDirty() {
return false;
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
private void setContent(RepoFile repoFile) {
try {
CodeLanguage language = CodeFacesUIActivator.getDefault()
.getCodeLanguages().parseFileName(repoFile.getName());
String langName = language.getName();
String resourceURL = language.getResource();
CodeExplorerHTMLTemplate template = new CodeExplorerHTMLTemplate(
repoFile.getName(), langName, resourceURL,
repoFile.getContent());
browser.setText(template.toHTML());
} catch (Exception e) {
String errorMsg = "Errors occurs when loading content of the file "
+ repoFile.getPath().toString();
browser.setText(errorMsg);
IStatus status = new Status(Status.ERROR,
CodeFacesUIActivator.PLUGIN_ID, errorMsg, e);
CodeFacesUIActivator.getDefault().getLog().log(status);
}
}
@Override
public void setFocus() {
browser.setFocus();
}
private void setLoading() {
browser.setText(LOADING_HTML);
}
private void setTitle() {
IEditorInput input = getEditorInput();
setPartName(input.getName());
setTitleToolTip(input.getToolTipText());
}
}