我正在尝试打开SWT的DirectoryDialog而不在Windows上显示“Make new folder”按钮。 Windows的API支持这一点,但不幸的是SWT没有。
您可以在此处查看SWT的Windows实施:http://kickjava.com/src/org/eclipse/swt/widgets/DirectoryDialog.java.htm
第193行是神奇发生的地方。
lpbi.ulFlags = OS.BIF_NEWDIALOGSTYLE | OS.BIF_RETURNONLYFSDIRS | OS.BIF_EDITBOX | OS.BIF_VALIDATE;
我想将BIF_NONEWFOLDERBUTTON添加到标志中(请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205(v=vs.85).aspx)。
我尝试通过丑陋的反射黑客来实现这一点,我通过对静态字段执行按位OR将BIF_NONEWFOLDERBUTTON添加到OS.BIF_NEWDIALOGSTYLE。
不幸的是没有效果。我假设它是因为Java内联它(因为它是编译时常量)。
因此,我的问题是:如何在运行时修改第193行以使其包含此常量?
答案 0 :(得分:3)
我认为不可能。如果你能以某种方式访问lpbi
(例如,如果它是一个字段而不是局部变量),你可以这样做。如果你有一个单独的应用程序而不是Eclipse插件,你可以"只是"修补SWT并在应用程序中包含修补版本。
答案 1 :(得分:2)
我认为你能做到这一点的唯一方法是制作你自己的DirectoryDialog
副本并修改它。我没有在Windows上试过这个,但类似的代码适用于Mac OS X.
由于此类使用内部类(尤其是OS
类),因此会破坏Eclipse API Rules of Engagement。您可以通过更新新版本中的内部类来破坏您的代码。
该类还特定于特定的操作系统和体系结构(Windows 32位或Windows 64位)。这可以通过使用特定于操作系统和体系结构的插件或片段来管理。