簡體   English   中英

在Eclipse插件中,如何使DirectoryFieldEditor以特定路徑開頭?

[英]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資源管理器:
此(本機接口)基於:

該GUI根據過濾器路徑初始化根路徑,因此您還需要使用路徑初始化(在日食方面)該過濾器字段,以便Windows-GUI SHBrowseForFolder對其進行提取。

根據DirectoryFieldEditor,這正是getTextControl()(您在上面初始化的字段)用於的目的。
但是問題出在以下事實:字段已使用相對路徑初始化。 由於底層操作系統不知道該路徑,因此默認情況下返回到根操作系統路徑。
您需要找到一種方法來存儲項目的完整系統路徑,而不是相對路徑。
這樣,該完整路徑將被Os識別並用作初始路徑。

例如,從IJavaElement ,您可以獲取其關聯資源,然后嘗試從那里獲取(完整系統)路徑。

實際上,從IPackageFragment您應該能夠調用getPath() ,並檢查返回的IPath是否包含完整的系統路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM