Eclipse FormText控件

By | 2018年4月14日

1. FormText简介

image

这个截图是Eclipse manifest editor的内容,如果单纯的使用Button, Label,hyper link等控件,想要做到这种现实效果,很困难。为了解决这个问题,Eclispe提供了一个FormText控件。

  • 里面的内容根据宽度自适应换行。
  • 以“http://”开头的文本,被自动转换成超链接。
  • 使用类似HTML标签,来管理内容。

FormText –> setText(text, parseTags, expandUrls),调用此方法添加内容。

  • text:String,文本内容。
  • parseTags:boolean,是否解析tag,如果是false,直接显示字符串,相当于查看网页源码。
  • expandUrls:boolean,true表示将URL转换成超链接。

不解析Tag,URL不转换超链接,显示效果。

formText.setText(getTextString(), false, false);

image

解析Tag,URL转换成超链接,显示效果。

image

超链接事件监听。

formText.addHyperlinkListener(new HyperlinkAdapter() {
    public void linkActivated(HyperlinkEvent e) {
        System.out.println(String.format("LABEL=%s, HREF=%s", e.getLabel(), e.getHref()));
    }
});

2. 格式化语法

它是一个XML格式的文本,多个whitespace会显示成一个,使用的font和color是通过程序set过来的。

  • 根节点必须是<form></form>
  • <form/>里面只能放<p/>和<li/>,可以放一个或多个。
  • <p/>和<li/>里面不能放<p/>和</li>。
  • 图片:<img href=”image key”/>,没有内容。
  • 超链接:<a href=”href”>text</a>。

有些tag可以设置些attribbute,<a>中nowrap=”true”表示不wrap换行。<p>中vspace=”false”,表示跟上面<p>,没有空白距离,默认是true。<li>有很多的attribute。

  • style – 默认是bullet,可以是text, bullet或image。
  • value – 如果style是bullet,该值没用。如果style是text,该值会在bullet位置显示。如果style是image,value是image的key。
  • vspace – 是否和上面的<li>留间距。
  • indent – text的indent。
  • bindent – bullet的indent,注意不要让bullet和text重叠了。

其它的tag。

  • <b>其中的内容粗体。
  • <span>对其中的内容设置字体或者颜色。
  • <br/>换行。

Example – 使用FormText控件,显示效果就是上面简介的截图。

@Override
public void fillContent(Composite parent) {
    parent.setLayout(new FillLayout());

    FormText formText = toolkit.createFormText(parent, true);
    formText.setWhitespaceNormalized(true);
    formText.setImage("image", SWTImgResource.HEART);
    formText.setColor("header", toolkit.getColors().getColor(FormColors.TITLE));
    formText.setFont("header", JFaceResources.getHeaderFont());
    formText.setFont("code", JFaceResources.getTextFont());
    formText.setText(getTextString(), true, true);

    formText.addHyperlinkListener(new HyperlinkAdapter() {
        public void linkActivated(HyperlinkEvent e) {
            System.out.println(String.format("LABEL=%s, HREF=%s", e.getLabel(), e.getHref()));
        }
    });
}

private String getTextString() {
    URL url = FormTextUsage.class.getResource("form-text.txt");
    StringBuilder strBuilder = new StringBuilder();
    try {
        Files.readAllLines(Paths.get(url.toURI())).forEach(str -> strBuilder.append(str));
    } catch (IOException | URISyntaxException e) {
        e.printStackTrace();
    }
    return strBuilder.toString();
}

FormText的内容(form-text.txt文件)。

<form>

<p>
Here is some plain text for the text to render. This text is at 
<a href="http://www.eclipse.org" nowrap="true">Eclipse Official</a> web site.
</p>

<p>
<span color="header" font="header">
This text is in header font and color.
</span>
</p>

<p vspace='false'>
vspace is false.<br/>
This line will contain some <b>bold</b> and some 
<span font="code">source</span> text.
We can also add <img href="image"/> an image.
</p>

<li>A default (bulleted) list item.</li>
<li vspace="true">vaspace is false. There's no effect in my case.</li>
<li style="text" value="1.">A list item with text.</li>
<li style="text" value="2.">Another list item with text.</li>
<li style="image" value="image">List item with an image bullet</li>
<li style ="text" bindent="20" indent="40" value="3.">
A list item with text.
</li>
<li style="text" bindent="20" indent="40" value="4.">
A list item with text.
</li>

<p>
        leading blanks;           more white   \n\n   new lines    <br/>
   more   <b>     bb    </b>   white  .
</p>

<control href="loginComp" fill="false" />

</form>

3. 使用说明

“Form text control is not, nor will it ever be, a web browser.”

FormText不是web浏览器,<p>和<li>不能nested嵌套,支持Bold(<b/>),但是没有italic。图片和文字不能设置vertical alignment(TOP, CENTER…)等。

FormText的Performace和内存消耗都很好,因为它的初衷就是个小控件,并不是很强大。

如果FormText不能满足要求,就考虑使用别的方法:

  • 如果需要编辑,内容需要格式化(使用不同字体和颜色),就用StyledText(Java Editor就是用它实现的)。
  • 如果是只读的文本,且有复杂的格式要求,就用org.eclipse.swt.browser.Browser。SWT内嵌的浏览器,可以显示HTML文件。

在如下情况时,可以考虑使用FormText:

  • 文本内容不是很长,但是里面含有text,hyperlinks和images,而且有一定的布局要求。
  • 想让文本和SWT其它控件,混合使用,它可以放在任何SWT容器里。