Как правильно установить содержимое плагина IFile в Eclipse при открытии редактора - PullRequest
1 голос
/ 16 апреля 2019

Я использую следующий код для установки содержимого IFile:

public static IFile updateFile(IFile file, String content) {
    if (file.exists()) {
        InputStream source = new ByteArrayInputStream(content.getBytes());

        try {
            file.setContents(source, IResource.FORCE, new NullProgressMonitor());

            source.close();
        } catch (CoreException | IOException e) {
            e.printStackTrace();
        }
    }

    return file;
}

Это прекрасно работает, когда файл не открывается в редакторе, но если файл открыт, я получаю следующее предупреждение, как если бы файл был изменен вне Eclipse:

enter image description here

Я пытался обновить файл (вызывая метод refreshLocal()) до и после вызова setContents(), но это не помогло.

Есть ли способ избежать этого предупреждения?

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Оберните ваш метод в WorkspaceModifyOperation.

0 голосов
/ 17 апреля 2019

Реакция редактора выглядит правильно, потому что есть изменение вне org.eclipse.jface.text.IDocument, которое привязано к экземпляру редактора.

Правильный подход будет заключаться в изменении не содержимого файла,но экземпляр "model", представляющий содержимое файла, что-то вроде IJavaElement для JDT.

Также вы можете попытаться манипулировать содержимым документа напрямую (требуется полировка для производства):

        IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
        for (IWorkbenchWindow window : windows) {
            IWorkbenchPage[] pages = window.getPages();
            for (IWorkbenchPage page : pages) {
                IEditorReference[] editorReferences = page.getEditorReferences();
                for (IEditorReference editorReference : editorReferences) {
                    IEditorPart editorPart = editorReference.getEditor(false/*do not restore*/);
                    IEditorInput editorInput = editorPart.getEditorInput();
//skip editors that are not related
                    if (inputAffected(editorInput)) {
                        continue;
                    }
                    if (editorPart instanceof AbstractTextEditor) {
                        AbstractTextEditor textEditor = (AbstractTextEditor) editorPart;
                        IDocument document = textEditor.getDocumentProvider().getDocument(editorInput);
                        document.set(content);
                    }
                }
            }
        }

Честно говоря, я не понимаю сценарий, который вы пытаетесь охватить, возможно, есть лучшие способы сделать это.

...