Программно изменить размер представления в 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