私は (JFace TreeViewer を介して) SWT ツリーを持っています。これは項目を列に表示し、その一部には長い文字列が含まれています。文字列の末尾は、ユーザーにとって意味のあるビットであり、先頭ではありません。そのため、テキストがクリップされると、末尾ではなく文字列の先頭でクリッピングが発生するようにします。例:
「これはツリー列の境界を完全に超える非常に長い文字列です」のようなものを含むセルのデフォルトの動作は次のとおりです。
|This is a very l...|
私が望むところ:
|... the tree column|
編集:
ここで説明されているように、カスタム PaintItem リスナーでこれを解決しました: http://www.eclipse.org/articles/article.php?file=Article-CustomDrawingTableAndTreeItems/index.html
次のコードを思いつきました(完全ではありません。いくつかの重複とマジックナンバーがあります):
tree.addListener(SWT.EraseItem, new Listener()
{
public void handleEvent(Event event)
{
String text = ((TreeItem)event.item).getText(event.index);
Point size = event.gc.textExtent(text);
TreeColumn column = ((Tree)event.widget).getColumn(event.index);
int columnWidth = column.getWidth() - 10; /* magic number alert - the cells have some padding - must be a way of determining this... */
if(size.x > columnWidth)
{
event.detail &= ~SWT.FOREGROUND;
}
}
});
tree.addListener(SWT.PaintItem, new Listener()
{
@Override
public void handleEvent(Event event)
{
String text = ((TreeItem)event.item).getText(event.index);
Point size = event.gc.textExtent(text);
TreeColumn column = ((Tree)event.widget).getColumn(event.index);
int columnWidth = column.getWidth() - 10; /* magic number alert - the cells have some padding - must be a way of determining this... */
if(size.x > columnWidth)
{
drawTextTail(event, text, columnWidth);
}
}
private void drawTextTail(Event event, String text, int columnWidth)
{
String clippedText = "";
int offset = text.length() - 1;
String nextClippedText = text.charAt(offset) + clippedText;
while(fits(nextClippedText, columnWidth, event.gc))
{
clippedText = nextClippedText;
offset--;
nextClippedText = text.charAt(offset) + clippedText;
}
event.gc.drawText("..." + clippedText,
event.x + 5, /* magic number alert - the cells have some padding - must be a way of determining this... */
event.y, false);
}
private boolean fits(String clippedText, int columnWidth, GC gc)
{
Point size = gc.textExtent("..." + clippedText);
return size.x < columnWidth;
}
});