我正在为SWT Java应用程序的OS X版本实现视图,并希望在我的SWT树中使用NSOutlineView提供的“源列表”选项。
我是通过将此代码添加到#createHandle()
方法来黑客攻击我自己的Tree.class版本来实现的:
long NSTableViewSelectionHighlightStyleSourceList = 1;
long hi = OS.sel_registerName("setSelectionHighlightStyle:");
OS.objc_msgSend(widget.id, hi, NSTableViewSelectionHighlightStyleSourceList);
基本上只标记底层NSOutlineView以使用NSTableViewSelectionHighlightStyleSourceList样式。
看起来像这样:
哪种工作,但不能完全模拟NSOutlineView行为。例如,在选择根节点时,即使标题有足够的空间,它仍然会截断它:
另一个问题是我不知道如何实现类别(或组/文件夹),就像你在Finder.app/iTunes.app/Mail.app/中看到的那样:以下例子:
请注意FAVORITES
类别及其格式。这是在常规的ObjC应用程序中通过在outlineView:isGroupItem
委托中的outlineView
方法中返回true来处理的,但我不知道在哪里破解它。
所以我的问题是
如何在OS X上的SWT中实施类别(isGroupItem
)功能?
答案 0 :(得分:6)
我设法对SWT java源代码和本机源进行了调整,以使其工作,如下图所示。
mac cocoa x86_64的自定义SWT可以是dowloaded here.
此时对来源所做的更改可以在commit
中看到显示其工作原理的代码段如下所示。 SWT.SOURCE_LIST
样式用于将树标记为源列表,SWT.GROUP_ITEM
样式用于标记作为组项的项。
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class SourceList {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Tree tree = new Tree (shell, SWT.SOURCE_LIST);
for (int i=0; i<4; i++) {
final TreeItem iItem = new TreeItem (tree, SWT.GROUP_ITEM);
display.asyncExec( new Runnable() {
public void run() {
iItem.setExpanded(true);
}
});
iItem.setText ("GROUP " + i);
for (int j = 0; j < 4; j++) {
TreeItem jItem = new TreeItem (iItem, 0);
jItem.setText ("TreeItem " + j);
}
}
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}