使状态修剪栏贡献在其内容更改时增长

Make status trimbar contribution grow when its content changes

我正在尝试添加一个 Eclipse 状态修剪栏贡献,其中贡献的内容(即 child 元素的文本)动态变化。请注意,我 不是 试图将 "line, column" 信息添加到状态栏。

理想情况下,贡献的宽度应适应其内容的宽度,有点像 VSCode:

中发生的情况

但是,如果这不容易实现,一个可接受的替代方案是为状态修剪栏设置一个“固定”宽度,或者甚至为每个人设置一个固定宽度child(因为我不打算让 children 出现和消失)。

以下是我试过的方法。如果我过去 2 天的尝试都没有奏效,你认为我应该怎么做?

如果您认为问题实际上可能是 Eclipse 错误,请注意我在 Linux 上使用的 Eclipse 版本 2021-06 (4.20.0)


我试过的

我在 plugin.xml 中有这个:

<extension
    point="org.eclipse.ui.menus">
    <menuContribution
        locationURI="toolbar:org.eclipse.ui.trim.status">
        <toolbar
            id="some.package.StatusTrimBarContribution">
            <control
                class="some.package.StatusTrimBarContribution">
            </control>
        </toolbar>
    </menuContribution>
</extension>

我已经尝试过至少 4 种不同的方法。作为参考,这里是 class StatusTrimBarContribution:

public class StatusTrimBarContribution extends WorkbenchWindowControlContribution {
    // A
    private static String currText = /* see below */;

    private Label m_lbl = null;
    private Label m_lbl2 = null;
    private Control m_root = null;

    public StatusTrimBarContribution() {
        // Register to String event
    }

    @Override
    public void dispose() {
        // Unregister from String event
    }

    @Override
    protected Control createControl(Composite parent) {
        // B
    }

    @Subscribe // From guava
    private void someEventHandler(String event) {
        currText = "lp_much_longer";
        if (m_lbl != null) {
            m_lbl.setText();
            m_root.getParent().requestLayout();
        }
    }
}

尝试 #1

在这次尝试中,我们在标签和parent之间添加了一个中介Composite,我们在中介上使用了一个GridLayout,并且我们在[中添加了一个GridData =24=].

// A
private static String currText = "empty";

// B
@Override
protected Control createControl(Composite parent) {
    GridLayout gl = new GridLayout(2, false);
    Composite comp = new Composite(parent, SWT.NONE);
    comp.setLayout(gl);
    m_lbl = new Label(comp, SWT.RIGHT);
    m_lbl.setText(currText);
    GridDataFactory.defaultsFor(m_lbl).hint(200, SWT.DEFAULT).applyTo(m_lbl);
    m_lbl2 = new Label(comp, SWT.RIGHT);
    m_lbl2.setText("lbl2");
    m_root = comp;
    return comp;
}

结果是标签太高而被截断。请注意,我还尝试将边距高度设置为 0,虽然它比下面的要好,但标签仍然会被截断。

尝试 #2

与#1 相比,我们去掉了中介 Composite,而是直接在 parent 上使用布局。另外,我们删除了 GridData,因为在这一点上,为什么不呢。

// A
private static String currText = "empty";

// B
@Override
protected Control createControl(Composite parent) {
    GridLayout gl = new GridLayout(2, false);
    parent.setLayout(gl);
    m_lbl = new Label(parent, SWT.RIGHT);
    m_lbl.setText(currText);
    m_lbl2 = new Label(parent, SWT.RIGHT);
    m_lbl2.setText("lbl2");
    m_root = m_lbl;
    return m_lbl;
}

除了 m_lbl 不足以容纳文本外,结果与之前相同:

尝试 #3

与#2 相比,我们额外删除了布局。

// A
private static String currText = "empty";

// B
@Override
protected Control createControl(Composite parent) {
    m_lbl = new Label(parent, SWT.RIGHT);
    m_lbl.setText(currText);
    m_lbl2 = new Label(parent, SWT.RIGHT);
    m_lbl2.setText("lbl2");
    m_root = m_lbl;
    return m_lbl;
}

标签不再太高,但是标签的宽度对于文本来说还是太小了:

尝试 #4

与#3 相比,我们最初将一个很长的字符串分配给 m_lbl

// A
// Yes, this is ridiculous
private static String currText = " ".repeat(60);

// B
@Override
protected Control createControl(Composite parent) {
    m_lbl = new Label(parent, SWT.RIGHT);
    m_lbl.setText(currText);
    m_lbl2 = new Label(parent, SWT.RIGHT);
    m_lbl2.setText("lbl2");
    m_root = m_lbl;
    return m_lbl;
}

结果是两个标签都完全可见,但是现在m_lbl2m_lbl一样的宽度,远远超过我想要的。另外,如果用户的字体与我的不同,标签的宽度可能会由于初始字符串而变得太大或太小。

使用 GridData 的最小宽度设置对我有用:

  @Override
  protected Control createControl(final Composite parent)
  {
    final Composite comp = new Composite(parent, SWT.NONE);
    GridLayoutFactory.fillDefaults().numColumns(2).applyTo(comp);

    m_lbl = new Label(comp, SWT.RIGHT);
    m_lbl.setText("label 1");

    GridDataFactory.fillDefaults().grab(true, false).minSize(200, SWT.DEFAULT).applyTo(m_lbl);

    m_lbl2 = new Label(comp, SWT.RIGHT);
    m_lbl2.setText("lbl2");

    GridDataFactory.fillDefaults().grab(true, false).minSize(100, SWT.DEFAULT).applyTo(m_lbl2);

    m_root = comp;

    return comp;
  }

注意:更改parent的布局是违反规则的,可能会损坏其他组件的布局。