【问题标题】:Programmatically resize a view in Eclipse在 Eclipse 中以编程方式调整视图的大小
【发布时间】:2018-04-22 10:59:31
【问题描述】:

我正在使用 SWTBot 测试一个非 e4 RCP 应用程序,我需要更改视图的大小。 (移动窗框)

我没有成功

  • 使用 SWTBot 调整我的视图大小(没有这样的 api)
  • 使用 Eclipse 3 API 调整视图大小(不支持)
  • 使用底层 e4 模型调整我的视图大小(调整大小不起作用)

e4 模型接缝很有希望,但我错过了一些东西,所以它不起作用。

我可以

  • 获取我的观点的 MPart:view = ePartService.findPart(ID)
  • 获取 MTrimmedWindow:window = (view as EObject).eContainer as MTrimmedWindow

我不能

  • 语言环境正确的 MPartSashContainer
  • setContainerData()移动窗框

我想知道

  • 如何从 MPart 移动到其直接父级(例如 MPartStack)
  • 为什么像 eContainer() 这样的常见 EObject 方法在 M... 对象上不存在?

【问题讨论】:

  • MPart(以及所有其他 MUIElement 对象)有一个 getParent() 方法,它可以为您提供直接父级。
  • 不幸的是,它为我的“视图”MPart 返回 null :(
  • 那么它还没有被添加到容器中。这总是返回正在显示的部件的父级。
  • @greg-449 我做page.showView(ID,...),然后等待5秒,然后ePartService.findPart(ID).getParent()仍然是null。有什么想法吗?
  • 我不知道在 3.x 兼容模式下零件 ID 会发生什么。我不确定IWorkbenchPage.showPage 使用的 id 是否与应用程序模型 MPart id 相同。

标签: eclipse eclipse-rcp e4 swtbot


【解决方案1】:

好的,我自己找到了解决办法。

问题是,视图不是 e4 UI-Tree 的一部分。 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多