좋아, 해결책을 찾았습니다.
보기가 e4 UI 트리의 일부가 아닙니다. view.eContainer
은 직접 MWindow
입니다. 올바른 지점에 배치하기 위해 뷰는에 연결됩니다. 즉, e4 UI 트리의 일부이며 getParent() != null
입니다. 뷰의 크기를 조정하기 위해
단계는 다음과 같습니다
- 쇼보기
- 는
MPartStack
을 찾아보기 MPlaceholder
을 찾아`
- 다시 그리기 위젯
- 이
containerData
을 설정 객체 MPartSashContainer' (예,이 경우 작동하지 않는 솔기 자동 업데이트)
예 :
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
'MPart' (다른 모든'MUIElement' 객체) 당신에게 즉시 부모를주는'의 getParent() '메소드가 있습니다. –
불행히도 내 "보기"MPart에 대해 null을 반환합니다. ( –
아직 컨테이너에 추가되지 않았습니다 ** 항상 ** 표시되는 부분에 대한 부모를 반환합니다 –