![](/img/trans.png)
[英]How can I get the absolute path of the preference file for a particular plugin in eclipse plugin development?
[英]In an Eclipse plugin, how can I make a DirectoryFieldEditor start with a particular path?
我正在制作一個Eclipse插件,右鍵單擊一個項目會生成一個UI。
在此UI中,我使用了DirectoryFieldEditor。 這將以根目錄從“ MyComputer”開始生成目錄對話框。 我想要的是顯示從我右鍵單擊的項目開始的路徑。 如何做到這一點?
當您右鍵單擊一個項目並說“新軟件包”時,我試圖模仿-源文件夾瀏覽器只提供一個目錄對話框,其中只包含那些打開的項目的文件夾。...我想要一個類似的目錄對話框。
有人可以幫忙給我一些代碼片段或建議嗎?
好吧,考慮到“新包裝”實際上是該類:
org.eclipse.jdt.internal.ui.wizards.NewPackageCreationWizard
使用NewPackageWizardPage
(源代碼) ,您將看到:
public void init(IStructuredSelection selection) {
IJavaElement jelem = getInitialJavaElement(selection);
initContainerPage(jelem);
String pName = ""; //$NON-NLS-1$
if (jelem != null) {
IPackageFragment pf = (IPackageFragment) jelem
.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
if (pf != null && !pf.isDefaultPackage())
pName = pf.getElementName();
}
setPackageText(pName, true);
updateStatus(new IStatus[] { fContainerStatus, fPackageStatus });
}
由於getInitialJavaElement()是超類NewContainerWizardPage
一部分 :
/**
* Utility method to inspect a selection to find a Java element.
*
* @param selection the selection to be inspected
* @return a Java element to be used as the initial selection, or <code>null</code>,
* if no Java element exists in the given selection
*/
protected IJavaElement getInitialJavaElement(
IStructuredSelection selection) {
IJavaElement jelem = null;
if (selection != null && !selection.isEmpty()) {
Object selectedElement = selection.getFirstElement();
if (selectedElement instanceof IAdaptable) {
IAdaptable adaptable = (IAdaptable) selectedElement;
jelem = (IJavaElement) adaptable
.getAdapter(IJavaElement.class);
if (jelem == null) {
IResource resource = (IResource) adaptable
.getAdapter(IResource.class);
if (resource != null
&& resource.getType() != IResource.ROOT) {
while (jelem == null
&& resource.getType() != IResource.PROJECT) {
resource = resource.getParent();
jelem = (IJavaElement) resource
.getAdapter(IJavaElement.class);
}
if (jelem == null) {
jelem = JavaCore.create(resource); // java project
}
}
}
}
}
if (jelem == null) {
IWorkbenchPart part = JavaPlugin.getActivePage()
.getActivePart();
if (part instanceof ContentOutline) {
part = JavaPlugin.getActivePage().getActiveEditor();
}
if (part instanceof IViewPartInputProvider) {
Object elem = ((IViewPartInputProvider) part)
.getViewPartInput();
if (elem instanceof IJavaElement) {
jelem = (IJavaElement) elem;
}
}
}
if (jelem == null
|| jelem.getElementType() == IJavaElement.JAVA_MODEL) {
try {
IJavaProject[] projects = JavaCore.create(
getWorkspaceRoot()).getJavaProjects();
if (projects.length == 1) {
jelem = projects[0];
}
} catch (JavaModelException e) {
JavaPlugin.log(e);
}
}
return jelem;
}
在這兩種方法之間,您應該能夠使用所需的確切信息(即“相對源路徑”)來初始化自定義UI。
如果查看DirectoryFieldEditor
的源代碼,將會看到它基於StringFieldEditor
定義的主Text字段的值打開其目錄選擇器對話框: doLoad ():
String JavaDoc value = getPreferenceStore().getString(getPreferenceName());
textField.setText(value);
這意味着您需要在自定義UI中獲取首選項存儲並將正確的路徑與ID相關聯。 您將使用該ID進行DirectoryFieldEditor
初始化。 您可以在此處查看示例 。
public static final String MY_PATH = "my.init.path";
IPreferenceStore store = myPlugin.getDefault().getPreferenceStore();
store.setValue(MY_PATH, theRightPath);
myDirFieldEditor = new DirectoryFieldEditor(MY_PATH, "&My path", getFieldEditorParent());
正如您在評論中提到的那樣,所有這一切只會初始化eclipse-part GUI,而不會初始化DirectoryDialog
啟動的本機Windows資源管理器:
此(本機接口)基於:
BROWSEINFO
結構中的參數 SHBrowseForFolder
函數使用 ,該函數實際上顯示一個對話框,使用戶可以選擇Shell文件夾。 該GUI根據過濾器路徑初始化根路徑,因此您還需要使用路徑初始化(在日食方面)該過濾器字段,以便Windows-GUI SHBrowseForFolder
對其進行提取。
根據DirectoryFieldEditor,這正是getTextControl()(您在上面初始化的字段)用於的目的。
但是問題出在以下事實:字段已使用相對路徑初始化。 由於底層操作系統不知道該路徑,因此默認情況下返回到根操作系統路徑。
您需要找到一種方法來存儲項目的完整系統路徑,而不是相對路徑。
這樣,該完整路徑將被Os識別並用作初始路徑。
例如,從IJavaElement
,您可以獲取其關聯資源,然后嘗試從那里獲取(完整系統)路徑。
實際上,從IPackageFragment
您應該能夠調用getPath()
,並檢查返回的IPath
是否包含完整的系統路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.