Eclipse 에서 File 을 Open 할때 기본으로 Open 되는 Editor 가 존재한다.

 Eclipse 에서는 File Content 의 특정 내용을 감지하여, 특정 Editor 로 Open 하도록 설정 할 수 있는 확장점이 제공된다.

 


예제로 다음과 같이 test.xml 이란 파일이 열릴때에 TestEditor 가 열리도록 설정해보도록하자.

- test.xml


  
    leechwin
    test xml
  


- plugin.xml

   - org.eclipse.core.contenttype.contentTypes 을 확장하여 org.leechwin.contenttype.testProfile 이란 id 로 확장점을 생성하고 Root Element 가 test Element 인지 확인한다

   - Editor 에서는 contenttypebinding 를 추가하여 위에서 확장한 org.leechwin.contenttype.testProfile 로 해당 Content 일경우 연결되게 한다.

   
      
         
            
            
            
         
      
   

   
      
          
         
         
      
   


위와 같은 예제로 File Content 의 일부 내용이나 특정 옵션으로 Editor 를 연결 시킬수 있다.

Posted by leechwin
,

 앞선 포스팅에서는 SWT Browser 에서 Javascript 수행결과를 얻는 방법으로는 다음의 첫번째 방법을 포스팅 하였는데, 이번 포스팅에서는 두번째 방법에 대해 자세히 알아 보도록 한다.

  • Browser 의 public Object evaluate (String script) 함수를 이용한 리턴값을 이용하는 방법
  • Javascript 핸들러로 org.eclipse.swt.browser.BrowserFunction 을 확장구현한 클래스를 Browser 에 등록하는 방법

 두번째 방법은 SWT Browser(org.eclipse.swt.browser.Browser)에서 Javascript Function Callback 을 등록하고, Browser 에서 등록된 Javascript Function 이 호출될경우 리턴값을 Java 에서 계속 핸들링 할 수 있는 방법이다.


 main.js 파일에 Java 에서 Callback 으로 사용될 함수 javaFunction 함수를 선언해둔다. 이함수는 Javascript 에서 Java 를 호출하는 함수로 Argument 와 함께 호출 할 수 있다.


 Main.Java 파일에서는 SWT Browser 의 callback 으로 사용될 클래스를 구현해야하는데 org.eclipse.swt.browser.BrowserFunction 클래스를 상속받아야한다.

 BrowserFunction 클래스를 상속받아 구현할때 function 함수에서는 arguments 로 Javascript 에서 전달한 Argument 가 전달되어 오고, 비지니스로직 수행후 Javascript 로 다시 return 값을 전달 할 수 있다.

 BrowserFunction 확장 클래스를 구현후 다음과 같이 SWT Browser 와 Javascript Callbck 을 등록해줘야한다.

new CustomFunction (browser, "javaFunction");


// main.js
function sendToJava() {
    var result;
    try {
        result = javaFunction("javascript argument");
    } catch (e) {
        return;
    }
    for (var i = 0; i < result.length; i++) {
         alert( result[i] );
    }
}


// Main.java

final Browser browser = new Browser(parent, SWT.NONE);
browser.setText( "...skip..." ); // skip html content

final BrowserFunction function = new CustomFunction (browser, "javaFunction");

static class CustomFunction extends BrowserFunction {
    CustomFunction (Browser browser, String name) {
        super (browser, name);
    }
    public Object function (Object[] arguments) {
        Object returnValue = new Object[] {
                "Java Argument",
        };
        return returnValue;
    }
}


이와 같이 수행하면 SWTBrowser 에서 Push to invoke Java 버튼을 누를경우 Javascript 의 SendToJava() 함수가 호출되고 내부에서

Java 의 javaFunction 함수가 "javascript argument" 인자와 함께 호출되어 "Java Argument" 라는 리턴값을 Javascript 로 다시넘겨주게된다.




참고


Posted by leechwin
,

SWT Browser(org.eclipse.swt.browser.Browser)에서 Runtime 에 해당 Browser 상에서 Javascript 의 수행결과를 얻고 싶을 경우가 있다.

 SWT Browser 에서 Javascript 수행결과를 얻는 방법으로는 다음과 같이 2가지 방법이 있다.

  • Browser 의 public Object evaluate (String script) 함수를 이용한 리턴값을 이용하는 방법
  • Javascript 핸들러로 org.eclipse.swt.browser.BrowserFunction 을 확장구현한 클래스를 Browser 에 등록하는 방법

 여기에서는 Browser 의 evaluate 함수를 이용하여 Javascript 수행 값을 얻는 방법을 알아 보도록 한다.

 evaluate 함수는 Javascript 의 eval 함수와 비슷하다고 생각하면 되는데, 이용 방법은 간단하다.

 다음과 같이 Browser 의 evaluate 함수에 Runtime 에 수행할 Javascript Code 를 넣어주면 된다.

final Browser browser = new Browser(parent, SWT.NONE);
browser.setJavascriptEnabled(true);    	
browser.addProgressListener(new ProgressAdapter() {
    public void completed(ProgressEvent event) {
        String bodyHTML = (String) browser.evaluate("return document.body;");
        // TODO:
    }
});

evaluate 함수는 다음과 같이 5개의 type 을 리턴한다.

  • javascript null or undefined -> null
  • javascript number -> java.lang.Double
  • javascript string -> java.lang.String
  • javascript boolean -> java.lang.Boolean
  • javascript array whose elements are all of supported types -> java.lang.Object[]


evaluate 함수를 사용할때 주의 할 점은 Browser 객체와 같은 Thread 에서 수행하면 evaluate 함수가 Async 하게 동작하므로 제대로 된 값을 리턴받지 못하는 경우가 발생 할 수 있다. 따라서 다른 Thread 혹은 ProgressListener 등에서 수행되도록 작성하여야 한다.

Posted by leechwin
,

 Eclipse Plug-in 의 내부 resource 들은 Plug-in 과 함께 jar 로 묶여 Eclipse 에 포함되게 된다.

 예를들어 jar 내에 "resources/index.html" 이라는 파일이 있다면 이를 접근하기 위해 다음과 같은 함수가 사용된다.

URL url = Activator.class.getClassLoader().getResource("resources/index.html"); InputStream stream = Activator.class.getClassLoader().getResourceAsStream("resources/index.html");

 이때 URL 의 경우, 해당 resource 가 포함된 plug-in 의 feature 설정이 unpack 설정이 되어 있지 않으면 Eclipse 에 jar 로 묶이기 때문에 Local File URL 을 얻을 수 가 없다.


 쉽게 말하면, jar 로 묶여있는 상태의 plug-in 혹은 라이브러리에 포함된 resource 파일들에 대한 Runtime 시의 절대경로를 얻을 수 없다는 뜻이다.


 절대경로를 얻을수 없는 resource 들은 Browser.setURL() 같은 함수에서 쓰일수 없는 유효하지 않은 URL 값을 가지게 된다.


 위와 같은 문제를 Eclipse 에서는 jar 의 일부 리소스들을 다음폴더에 압축해제시켜놓고 사용한다.

  • workspace/configuration/org.eclipse.osgi/bundles/..

 위의 디렉토리는 Runtime 에 jar 안의 resource 들에 대한 절대경로로 해당 resource 에 대한 절대경로를 얻으려면 다음 API 를 사용하면 된다.

Platform.asLocalURL(URL) - Deprecated FileLocator.toFileURL(URL) //example Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID); URL url= bundle.getEntry("resources/index.html"); // bundleresource://547.fwk25421790:1/resources/index.html URL localurl = FileLocator.toFileURL(url); // file:/home/leechwin/eclipse/workspace/.metadata/.plugins/org.eclipse.pde.core/Indigo.product/org.eclipse.osgi/bundles/547/1/.cp/resources/index.html

 

 참고로 Eclipse 는 Resource 에 Access 가 되는 파일들만 미리 bundles 밑에 폴더에 압축을 풀어놓고 Access 가 되지 않는 파일들은 압축을 풀어놓지 않아, html 과 같은 파일만 Access 하게 되면, 해당 html 에 연관된 css, javascript 등은 압축이 해제되어있지않아 원하는 결과를 얻지 못할 수 있다.

 이럴경우 해당 파일의 Parent 경로(파일의 디렉토리)를 인자로 주면 해당 폴더의 내용들이 모두 압축이 풀리게 된다.


참고: http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fmisc%2Fmulti_user_installs.html

Posted by leechwin
,

 Eclipse 의 extension point 를 extension 한경우 그값으로 IConfigurationElement  를 얻어 올 수 있다.

 extension 을 한 해당 plugin 에 대한 Bundle 을 얻고 싶은 경우가 있는데 다음과 같이 수행하면 해당 Bundle 을 얻어 올 수 있다.


Bundle bundle = Platform.getBundle( IConfigurationElement.getContributor().getName() );


해당 번들에서 어떠한 리소스들 찾고 싶다면 다음과 같이 수행하면된다.


Bundle bundle = Platform.getBundle( IConfigurationElement.getContributor().getName() );
URL url = bundle.getResource( filepath );
URL resolvedURL = FileLocator.resolve( url );

참고로 번들에서 Resource 를 얻어오면 "bundleresource://" 등의 prefix 가 붙는 경우가 있는데,

이런때에는 org.eclipse.core.runtime.FileLocator.resolve(URL url) 함수를 사용하면 된다.


참고: http://www.eclipsezone.com/eclipse/forums/t82616.html

참고: http://stackoverflow.com/questions/9030830/file-and-bundleresource-urls

Posted by leechwin
,

Eclipse 에서 org.eclipse.jface.dialogs.Dialog 를 상속받아 Custom Dialog  를 구현하다보면,

setTitle() 이나 setImage() 등의 메소드가 존재하지 않아 당황 스러운 경우가 있다.


이때는 당황하지말고 protected void configureShell(Shell shell) 함수를 override 하면 title 이나 title image 등을 편집할 수 있다.

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText("My Custom Label");
    }


configureShell 함수 Override 전


configureShell 함수 Override 후



참고: http://wiki.eclipse.org/FAQ_How_do_I_set_the_title_of_a_custom_dialog%3F

Posted by leechwin
,

Eclipse 에서 Context Menu 등을 사용할 때에 현재 Selection 한 객체가 어떤종류의 객체인지(IEditor 인지, IResource 인지) 판별을 해야 할 경우가 있다.


이때 주로 selection 의 instanceof 로 보고 확인하는데, 현재 선택한 Selection 정보를 보통 다음과 같이 가져온다.

IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
ISelection selection = window.getSelectionService().getSelection();

if ( selection instanceof ITreeSelection ) {
    ...code...
} else if ( selection instanceof ITextSelection ) {
    ...code...
}

ISelection 은 다음과 같이 정의되어 있다.



위의 정의를 참고하여, 현재 Selection 한 객체가 Package Explorer 에서 Selection 한것인지 확인하려면 ITreeSection 이나 IStructuredSelection 으로 확인하고,

if ( selection instanceof ITreeSelection ) {
    // selected object in a tree view
    ...code...
}


Editor 에서 Selection 한것인지 확인하려면 ITextSelection 으로 확인하면 된다.

if ( selection instanceof ITextSelection ) {
    // selected text in a editor
    ...code...
}


Posted by leechwin
,

Java Decompiler 설치

Eclipse 2013. 5. 6. 22:01

Eclipse 에서 Java 의 class 파일을 보기쉽게 Decompile 해주는 툴 설치하는 법을 알아보자.


JD-Eclipse

Eclipse 에서 Java Decompiler 을 해주는 툴인 JD-Eclipse 설치법을 알아보자.

  • 설치법은 아래 URL에서 JD-Eclipse의 Download 탭에서 jd-eclipse-site-XXX.zip 파일을 다운받는다.
  • 다운받은후 Widnow > Help > Install New Software > Add 버튼을 누르고 Location에 다운받은 zip 파일을 선택하고 설치를 하면 쉽게 JD-Eclipse 플러그인이 설치가 된다.


JadClipse

Eclipse 에서 Java Decompiler 을 해주는 툴인 JadClipse 설치법을 알아보자.

  • Eclipse 4.x 이상 버전부터는 eclipse market place에서 바로 설치가 가능하다.
  • 수동으로 설치하려면 Update Site 에 다음 URL 을 입력하면 설치가 가능하다.
  • Update Site 에서 설치가 끝나면 Window > Preferences > Java > Decompiler 에서 추가 설정이 가능하다.



Posted by leechwin
,

Eclipse 로 자바 프로젝트를 진행하다가 JRE 혹은 JDK 를 Vesrion Update 하는 경우가 가끔 발생 한다.


개발환경이 달라지기때문에 주의해야 하지만, 때때로 자동업데이트로 Update 되는 경우 JRE, JDK 업데이트이후 프로젝트가 다음과 같은 에러가 발생하면서 Run/Debug 실행이 안되는 경우가 있다.


"Specified VM install not found: type Standard VM, name jre6"


이때에는 당황하지 말고 Eclipse workspace 의 다음 경로의 Run/Debug 를 실행했던 projectname build.xml.launch 파일을 삭제해준다.

 

/.metadata/.plugins/org.eclipse.debug.core/.launches/<projectname>build.xml.launch



이후 Eclipse 로 다시 실행하면 Specified VM install not found 에러가 발생하지 않는다.

Posted by leechwin
,

Eclipse 의 WTP(Web Tool Platform) 에 대한 정리



Posted by leechwin
,