Миграция Eclipse и org.eclipse.ui.internal api

#java #eclipse #eclipse-plugin #eclipse-rcp

#java #eclipse #eclipse-плагин #eclipse-rcp

Вопрос:

В настоящее время я переношу очень старый фрагмент кода, написанный в Eclipse Helios, в Eclipse Mars. В коде используются определенные API-интерфейсы из org.eclipse.ui.internal пакета, такие как EditorSashContainer , EditorStack , и т.д. PartStack LayoutPart Это то, что эти API больше не доступны на уровне совместимости e4? Или мне нужно импортировать еще несколько плагинов? Каков наилучший подход для переноса кода, который может потребовать минимальных изменений кода. Мы используем эти API-интерфейсы для того, чтобы в основном разбрасывать редактор, чтобы он выглядел как рабочая книга.

Заранее спасибо!

Ответ №1:

Вот фрагмент кода, в котором я разделяю редактор в среде E4.

Вот как я выполняю: splitEditor(0.5f, 3, currentEditor, newEditor)

 @Override
public void splitEditor(float ratio, int where, IEditorPart containerEditor, IEditorPart editorToInsert) {
    MPart container = containerEditor.getSite().getService(MPart.class);
    if (container == null) {
        return;
    }
    MPart toInsert = editorToInsert.getSite().getService(MPart.class);
    if (toInsert == null) {
        return;
    }

    insertEditor(ratio, where, container, toInsert);
}

/**
 * Inserts the editor into the container editor.
 *
 * @param ratio the ratio
 * @param where where to insert ({@link EModelService#LEFT_OF}, {@link EModelService#RIGHT_OF}, {@link EModelService#ABOVE} or
 * {@link EModelService#BELOW})
 * @param containerEditor the container editor
 * @param editorToInsert the editor to insert
 */
public void insertEditor(float ratio, int where, MPart containerEditor, MPart editorToInsert) {
    IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
    EModelService service = window.getService(EModelService.class);
    MPartStack toInsert = getPartStack(editorToInsert);

    MArea area = getArea(containerEditor);
    MPartSashContainerElement relToElement = area.getChildren().get(0);
    service.insert(toInsert, relToElement, where, ratio);
}

@SuppressWarnings("restriction")
private MPartStack getPartStack(MPart childPart) {
    MStackElement stackElement = childPart;
    MPartStack newStack = org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl.eINSTANCE.createPartStack();
    newStack.getChildren().add(stackElement);
    newStack.setSelectedElement(stackElement);
    return newStack;
}

private MArea getArea(MPart containerPart) {
    MUIElement targetParent = containerPart.getParent();
    while (!(targetParent instanceof MArea)) {
        targetParent = targetParent.getParent();
    }
    MArea area = (MArea) targetParent;
    return area;
}
  

Ответ №2:

Вы не должны использовать внутренние API-интерфейсы Eclipse API Правила взаимодействия

Внутренности Eclipse были полностью переписаны для Eclipse 4, и многие внутренние интерфейсы были изменены или удалены. Теперь все основано на модели EMF, представляющей объекты в графическом интерфейсе. Уровень совместимости предоставляет API-интерфейсы старого стиля, но поддерживает только официальные API.

Нет простого способа справиться с изменениями во внутренних API. Вам нужно будет понять новый способ работы Eclipse.

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