使状态修剪栏贡献在其内容更改时增长
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_lbl2
和m_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
的布局是违反规则的,可能会损坏其他组件的布局。
我正在尝试添加一个 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_lbl2
和m_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
的布局是违反规则的,可能会损坏其他组件的布局。