首页 > 解决方案 > 使用我们的编辑器插件时,删除按钮偶尔会停止工作,仅在 Windows 上

问题描述

我们正在为 Eclipse 开发一个降价编辑器插件。我使用 Windows 10 的同事遇到了导致按键停止工作的错误。最常用的键是 delete,其他时候是 ctrl + s。

这是编辑器扩展的代码:

public class MarkdownEditor extends AbstractTextEditor {

private Activator activator;
private MarkdownRenderer markdownRenderer;
private IWebBrowser browser;

public MarkdownEditor() throws FileNotFoundException {

    setSourceViewerConfiguration(new TextSourceViewerConfiguration());

    setDocumentProvider(new TextFileDocumentProvider());

    // Activator manages connections to the Workbench
    activator = Activator.getDefault();

    markdownRenderer = new MarkdownRenderer();
}

private IFile saveMarkdown(IEditorInput editorInput, IDocument document, IProgressMonitor progressMonitor) {
    IProject project = getCurrentProject(editorInput);

    String mdFileName = editorInput.getName();
    String fileName = mdFileName.substring(0, mdFileName.lastIndexOf('.'));
    String htmlFileName = fileName + ".html";
    IFile file = project.getFile(htmlFileName);

    String markdownString = "<!DOCTYPE html>\n" + "<html>" + "<head>\n" + "<meta charset=\"utf-8\">\n" + "<title>"
            + htmlFileName + "</title>\n" + "</head>" + "<body>" + markdownRenderer.render(document.get())
            + "</body>\n" + "</html>";
    try {
        if (!project.isOpen())
            project.open(progressMonitor);
        if (file.exists())
            file.delete(true, progressMonitor);
        if (!file.exists()) {
            byte[] bytes = markdownString.getBytes();
            InputStream source = new ByteArrayInputStream(bytes);
            file.create(source, IResource.NONE, progressMonitor);
        }
    } catch (CoreException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return file;
}

private void loadFileInBrowser(IFile file) {
    IWorkbench workbench = PlatformUI.getWorkbench();
    try {
        if (browser == null)
            browser = workbench.getBrowserSupport().createBrowser(Activator.PLUGIN_ID);
        URL htmlFile = FileLocator.toFileURL(file.getLocationURI().toURL());
        browser.openURL(htmlFile);
        IWorkbenchPartSite site = this.getSite();
        IWorkbenchPart part = site.getPart();
        site.getPage().activate(part);
    } catch (IOException | PartInitException e) {
        e.printStackTrace();
    }
}

@Override
public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
    super.init(site, editorInput);
    IDocumentProvider documentProvider = getDocumentProvider();
    IDocument document = documentProvider.getDocument(editorInput);
    IFile htmlFile = saveMarkdown(editorInput, document, null);
    loadFileInBrowser(htmlFile);
}

@Override
public void doSave(IProgressMonitor progressMonitor) {

    IDocumentProvider documentProvider = getDocumentProvider();
    if (documentProvider == null)
        return;
    IEditorInput editorInput = getEditorInput();
    IDocument document = documentProvider.getDocument(editorInput);
    if (documentProvider.isDeleted(getEditorInput())) {

        if (isSaveAsAllowed()) {

            /*
             * 1GEUSSR: ITPUI:ALL - User should never loose changes made in the editors.
             * Changed Behavior to make sure that if called inside a regular save (because
             * of deletion of input element) there is a way to report back to the caller.
             */
            performSaveAs(progressMonitor);

        } else {

        }

    } else {
        // Convert document from string to string array with each instance a single line
        // of the document
        String[] stringArrayOfDocument = document.get().split("\n");
        String[] formattedLines = PipeTableFormat.preprocess(stringArrayOfDocument);
        StringBuilder builder = new StringBuilder();
        for (String line : formattedLines) {
            builder.append(line);
            builder.append("\n");
        }
        String formattedDocument = builder.toString();

        // Calculating the position of the cursor
        ISelectionProvider selectionProvider = this.getSelectionProvider();
        ISelection selection = selectionProvider.getSelection();
        int cursorLength = 0;
        if (selection instanceof ITextSelection) {
            ITextSelection textSelection = (ITextSelection) selection;
            cursorLength = textSelection.getOffset(); // etc.
            activator.log(Integer.toString(cursorLength));
        }
        // This sets the cursor on at the start of the file
        document.set(formattedDocument);

        // Move the cursor
        this.setHighlightRange(cursorLength, 0, true);
        IFile htmlFile = saveMarkdown(editorInput, document, progressMonitor);
        loadFileInBrowser(htmlFile);
        performSave(false, progressMonitor);
    }
}

private IProject getCurrentProject(IEditorInput editorInput) {
    IProject project = editorInput.getAdapter(IProject.class);
    if (project == null) {
        IResource resource = editorInput.getAdapter(IResource.class);
        if (resource != null) {
            project = resource.getProject();
        }
    }
    return project;
}
}

这是存储库:https ://github.com/borisv13/GitHub-Flavored-Markdown-Eclipse-Plugin

接受任何帮助

标签: eclipse-plugin

解决方案


推荐阅读