вторник, 12 января 2010 г.

Eclipse RCP: резолвим и редактируем файлы

Ранее всю работу по резолвингу, открытию и редактированию файлов в своем Eclipse плагине я проворачивала через интерфейс IWorkspaceRoot. Из рута получала ссылку на проект, а дальше оставалась только радоваться удобству интерфейсов IFile, IResource, IProject и прочих.

Зарезолвленный таким образом файл открыть было проще простого:

IWorkbenchPage page = ...;
IFile file = ...;
IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(file.getName());
page.openEditor(new FileEditorInput(file), desc.getId());

Первыми граблями на которые я наступила стала линка.

IFolder#createLink(IPath localLocation, int updateFlags,IProgressMonitor monitor);

При этом линку хотелось создать непременно с таким же именем что носил реальный файл, лежащий в том же проекте. Для чего был использован флаг:

IResource.REPLACE

Все бы ничего если бы мне вдруг не приспичило получить location этого одноименного файла (очень уж хотелось открыть этот файлик и поредактировать обычными средствами IO):) Так много я никогда не материлась, зато с тех пор я читаю доки внимательно, а не как обычно:) При использвании флага REPLACE одноименный файл замещается в воркспейсе линкой !
В итоге был сооружен костыль:

IWorkspaceRoot root = ;
IProject project = root.getProject(name);
IPath location = project.getLocation().append(fileName);

Некрасиво, но заработало :) Если честно не знаю, что будет если открывать такой файл в эдиторе обычным способом: скорее всего он откроется, ибо файл сам по себе резолвится.

Ладно, с файлами которые (хотя бы просто географически) лежат внутри воркспейса все более или менее понятно. Но как открыть файл который лежит где-нибудь у черта на куличках? Лично я со своим воркспейс подходом к ресурсам впала в некоторый ступор :) Зарезолвить такой фал нельзя (то есть получить удобоваримую и такую милую сердцу ссылочку на IFile). В голове тут же пронеслась масса вариантов с созданием ссылки на удаленный файл, однако все оказалось куда проще:

IFileStore fileStore = EFS.getLocalFileSystem().getStore(fileToOpen.toURI());
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IDE.openEditorOnFileStore( page, fileStore );

Заметьте, этот код откроет дефолтный эдитор, хотя там же в IDE есть метод для открытия файла по его URI, в эдиторе с заданным ID. Вобщем, настоятельно рекомендую поразглядывать классик IDE - можно узнать кое что полезное.

Пока все:)

Комментариев нет:

Отправить комментарий