fier = getQualifier(doc, documentOffset);
// Compute completion proposals
computeStructureProposals(qualifier, documentOffset, propList);
}
最后,将自动完成建议列表转换为一个数组,并将这个数组作为结果返回,如清单 6 所示。
清单 6. computeCompletionProposals (续)
// Create completion proposal array
ICompletionProposal[] proposals = new ICompletionProposal[propList.size()];
// and fill with list elements
propList.toArray(proposals);
// Return the proposals
return proposals;
}
为SWT应用程序配备内容助理(4)
时间:2011-02-09 IBM Berthold Daum
构造限定符
现在,让我们看看如何从当前文档检索限定符。我们需要实现方法 getQualifier() ,如清单 7 所示。
清单 7. getQualifier
private String getQualifier(IDocument doc, int documentOffset) {
// Use string buffer to collect characters
StringBuffer buf = new StringBuffer();
while (true) {
try {
// Read character backwards
char c = doc.getChar(--documentOffset);
// This was not the start of a tag
if (c == ''>'' || Character.isWhitespace(c))
return "";
// Collect character
buf.append(c);
// Start of tag. Return qualifier
if (c == ''<'')
return buf.reverse().toString();
} catch (BadLocationException e) {
// Document start reached, no tag found
return "";
}
}
}
这是相当简单的。我们从当前文档偏移位置开始,向后读取文档字符。当检测到一个开括号时,我们就找到了一个标签的开头,并将收集到的字符在逆转顺序之后返回。在无法找到标签开头的其他所有情况下,我们返回一个空字符串。在这样的情况下,建议集是不受限制的。
编译自动完成建议
现在让我们编译一个建议集合。清单 8 显示了构成这些建议的相关标签集。如果您愿意,还可以添加更多的标签。
清单 8. 建议集合
// Proposal part before cursor
private final static String[] STRUCTTAGS1 =
new String[] { "<P>", "<A SRC=\"", "<TABLE>", "<TR>", "<TD>" };
// Proposal part after cursor
private final static String[] STRUCTTAGS2 =
new String[] { "", "\"></A>", "</TABLE>", "</TR>", "</TD>" }
可以看到,我们将每个标签建议划分为两个部分:一部分在预计的光标位置之前,一部分在预计的光标位置之后。清单 9 显示了编译这些建议的 computeStructureProposals() 方法。
清单 9. computeStructureProposals
private void computeStructureProposals(String qualifier, int documentOffset, List propList) {
int qlen = qualifier.length();
// Loop through all proposals
for (int i = 0; i < STRUCTTAGS1.length; i++) {
String startTag = STRUCTTAGS1[i];
// Check if proposal matches qualifier
if (startTag.startsWith(qualifier)) {
// Yes -
|