Программно изменить размер представления в Eclipse

Я тестирую не R4-приложение R4, используя SWTBot, и мне нужно изменить размер моего представления. (Переместить панель)

Я безуспешно пытался

  • Изменить размер моего представления с помощью SWTBot (нет такого API)
  • Измените размер моего представления, используя Eclipse 3 API (не поддерживается)
  • Изменение размера моего вида с использованием базовой модели e4 (изменение размера не работает)

Швы модели е4 обещают быть многообещающими, но я что-то упускаю, так что это не работает.

Я могу

  • Получите MPart моего взгляда: view = ePartService.findPart(ID)
  • Получить MTrimmedWindow: window = (view as EObject).eContainer as MTrimmedWindow

Я не могу

  • языковой стандарт правильный MPartSashContainer
  • переместить панель с setContainerData()

я бы хотел знать

  • Как я могу перейти от MPart к его прямому родителю (например, MPartStack)
  • Почему обычные методы EObject, такие как eContainer(), отсутствуют на объектах M...?

1 ответ

Хорошо, я нашел решение сам.

Дело в том, что представление не является частью дерева пользовательского интерфейса e4. view.eContainer непосредственно MWindow, Чтобы быть размещенным в правильном месте, вид связан с MPlaceholder, который является частью e4 UI-Tree и имеет getParent() != null,

Чтобы изменить размер представления, выполните следующие действия:

  • Показать вид
  • найти MPlaceholder зрения
  • найти MPartStack и объект `MPartSashContainer´
  • Задавать containerData
  • Перерисовать виджет (да, автоматическое обновление шва в этом случае не работает)

Пример:

EModelService modelService = PlatformUI.getWorkbench().getService(EModelService.class);
EPartService  partService  = PlatformUI.getWorkbench().getService(EPartService.class);

// Show view
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
page.showView(MyView.ID, null, IWorkbenchPage.VIEW_ACTIVATE);

MPart view = partService.findPart(MyView.ID);
// view.getParent() => null, because 'view' is not a part of the e4 UI-model!
// It is connected to the Model using MPlaceholder

// Let's find the placeholder
MWindow window = (MWindow)(((EObject)eView).eContainer);
MPlaceholder placeholder = modelService.findPlaceholderFor(window, view);

MUIElement element = placeholder;
MPartStack partStack = null;
while (element != null) {
    // This may not suite your configuration of views/stacks/sashes
    if (element instanceof MPartStack && ((Object)element.parent) instanceof MPartSashContainer) {
            partStack = (MPartStack)element;
            break;
        }
        element = element.parent;
    }
}
if (partStack == null) { /* handle error */ }

// Now let's change the width weights
for (MUIElement element : partStack.getParent().getChildren()) {
    if (element == partStack) {
        element.setContainerData("50"); // Width for my view
    } else {
        element.setContainerData("25"); // Widths for other views & editors
    }
}

// Surprisingly I had to redraw tho UI manually
// There is for sure a better way to do it. Here is my (quick & very dirty):
partStack.toBeRendered = false
partStack.toBeRendered = true
Другие вопросы по тегам