2009-09-08 2 views
1

프로젝트를 마우스 오른쪽 버튼으로 클릭하면 UI가 생성되는 Eclipse 플러그인을 만들고 있습니다.이클립스 플러그인에서 특정 경로로 DirectoryFieldEditor를 시작하려면 어떻게해야합니까?

이 UI에서는 DirectoryFieldEditor를 사용했습니다. 그러면 루트로 "MyComputer"에서 시작하는 디렉토리 대화 상자가 생성됩니다. 내가 원하는 것은 내가 오른쪽 클릭 한 프로젝트에서 시작하는 경로를 보여주는 것입니다. 어떻게이 일을 성취 할 수 있습니까?

프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "새 패키지"라고 말하면 모방하려고합니다. 소스 폴더를 탐색하면 열려있는 프로젝트 인 폴더 만 디렉토리 대화 상자가 나타납니다. 비슷한 디렉토리 대화 상자가 필요합니다.

누군가가 도움을주고 일부 코드 스 니펫이나 제안을 줄 수 있습니까?

+0

요청에 따라 DirectoryFieldEditor 초기화 팁을 추가했습니다. – VonC

+0

텍스트 필드를 상대 경로가 아닌 프로젝트의 전체 시스템 경로로 초기화해야합니다. 나는 내 대답을 업데이트했습니다 – VonC

답변

1

글쎄, "새로운 패키지"를 고려하는 것은 실제로 클래스입니다 : NewPackageWizardPage (source code)를 사용

org.eclipse.jdt.internal.ui.wizards.NewPackageCreationWizard 

, 당신은 볼 수 있습니다 :

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() being part of superclass 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에 정의 된 경우이 값을 기준으로 그 디렉토리 선택 대화 상자를 엽니 표시됩니다 doLoad() :

String JavaDoc value = getPreferenceStore().getString(getPreferenceName()); 
textField.setText(value); 

을 그 사용자 정의 UI에서 기본 설정 저장소를 가져오고 올바른 경로를 ID와 연관시켜야 함을 의미합니다. 해당 ID를 DirectoryFieldEditor 초기화에 사용합니다. Yucan은 an example here을 참조하십시오.

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()); 

당신이 코멘트에 언급 된 바와 같이,이 모든에만 일식 부분 GUI가 아닌 DirectoryDialog에 의해 시작 네이티브 Windows 탐색기 초기화됩니다
이 (네이티브 인터페이스)를 기반으로 :

는 GUI 필터 경로에 따라 루트 경로를 초기화 그건, 그래서 당신은 또한이 윈도우 GUI SHBrowseForFolder에 의해 픽업 얻기 위해 경로로 (일식 측에) 해당 필터 필드를 초기화해야합니다.

DirectoryFieldEditor에 따르면 getTextControl() (위에서 초기화 한 필드)이 대상입니다.
그러나 문제는 필드가 상대 경로로 초기화되었다는 사실에서 기인합니다.이 경로는 기본 OS에서 알 수 없으므로 기본값은 루트 OS 경로로 다시 설정됩니다.
상대 경로가 아닌 프로젝트의 전체 시스템 경로를 저장하는 방법을 찾아야합니다.
그런 식으로 전체 경로는 Os에서 인식하고 초기 경로로 사용됩니다.

예를 들어 IJavaElement에서 관련 리소스를 가져 와서 전체 시스템 경로를 가져올 수 있습니다.

실제로 IPackageFragment에서 getPath()으로 전화를 걸어 IPath에 전체 시스템 경로가 포함되어 있는지 확인해야합니다.

+0

내가 제안한 접근 방식은 나에게 경로를 줄지 만 어떻게 대화 상자 편집기에서이를 루트 폴더로 사용하도록 지시 할 수 있습니까? –

+0

두 번째 솔루션은 상대 경로로 텍스트 상자를 채우고 찾아보기를 클릭하면 루트 "내 컴퓨터"에서 시작합니다 ... 원하는 wht는 differnet ... 찾아보기 단추를 클릭하면 폴더가 표시됩니다. strucute ui를 얻기 위해 오른쪽 클릭 한 루트부터 시작 –

관련 문제