자바 API, Javadoc 만들기 - APIviz[API,Javadoc,Java,자바]

이미지출처 : blogs.sun.com

자바 API, Javadoc 만들기 - APIviz









인수인계를 위해, 어떠한 형태의 문서가 좋을까 고민을 하다가,

내가 참여한 클래스와 메소드들에 대한 설명을 적어서 Javadoc으로 뽑고,

메인페이지에 필요한 사항을 수정하였다.



다이어그램을 자동으로 그려주는 APIviz(http://code.google.com/p/apiviz/)를 사용하였는데,

사용법은 이클립스에서 export시에 다음과 같이 doclet설정을 해주면 된다. (APIviz How to use)
Use Custom Doclet

Doclet Name : org.jboss.apiviz.APIviz

Doclet Class-Path : APIvizPath\jar\apiviz-1.3.0.GA.jar

이후 Vm Option에서 Graphviz 경로 설정 (and Graphviz path setting in VM options)

아래와 같이 필요한 Vm 옵션도 몇가지 추가하였다. (My custom vm options)

VM options
-encoding UTF-8 -charset UTF-8 -docencoding UTF-8  (한글 Javadoc을 만들기 위해[for unicode document])
-J-Dgraphviz.home=GraphvizPath\bin (Graphviz 설정 [Graphviz Setting])
-J-Xmx512m (내보낼 문서의 양이 많을때 메모리 부족 에러가 난다. [Prevent out of memory error during export Javadoc])

Extra Javadoc options
-d OutputPath (내보낼 경로 [Output Path])
-tag author:a:"Author:" (작성자 정보를 문서에 포함시킨다. [include author information in document])


마지막으로 스타일시트는 검색을 하다가,  (I used custom stylesheet in follow link.)

http://applegrew.blogspot.com/2008/05/get-my-javadoc-stylesheet-red-n-black.html 를 사용했다.



그동안 주석을 잘 안달아놔서 꽤 바쁜 작업이 되긴 했지만,

막상 문서작성을 마치고 보니, 꽤 만족스럽다.:D




by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

EclipseRCP 퍼스펙티브 다루기(EclipseRCP perspective handling)[퍼스펙티브,perspective,이클립스 RCP,eclipse RCP]

이미지출처 : www.mobilefish.com

EclipseRCP 퍼스펙티브 다루기(EclipseRCP perspective handling)






등록된 퍼스펙티브 배열 받아오기 (Getting registered perspective array)

IPerspectiveRegistry perspectiveRegistry = window.getWorkbench().getPerspectiveRegistry();
IPerspectiveDescriptor[] perspectiveDescriptors = perspectiveRegistry.getPerspectives();


현재의 퍼스팩티브 받아오기 (Getting current perspective)
WorkbenchWindow.getActivePage().getPerspective();


퍼스펙티브 전환하기 (Changing perspective)
WorkbenchWindow.getActivePage().setPerspective(IPerspectiveDescriptor perspective);




by


Tags : , , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

EclipseRCP 체크박스에서 재귀선택 이벤트 (EclipseRCP recursive selection event in checkbox viewer)[checkbox viewer,체크박스,selection event,선택 이벤트,이클립스 RCP,eclipse RCP]

이미지출처 : www.mobilefish.com

EclipseRCP 체크박스에서 재귀선택 이벤트 (EclipseRCP recursive selection event in checkbox viewer)







It’s Tips for CheckboxViewer.



I found bug that throw selection event three times in CheckboxViewer(CheckboxTreeViewer,CheckboxTableViewer).



This bug appear when user click checkbox on selected object.



Then I disable selection as well as “viewer.setSelection(null);";



And I need the checkbox behave likes the radio button.



I implemented it through history clear.





Code:


boolean isHistory;
Object currentObject;
 
public void selectionChanged(SelectionChangedEvent event) {
    if(isHistory) {
      isHistory = false;
      return;
    }
  if (!event.getSelection().isEmpty()) {

      if (event.getSelection() instanceof IStructuredSelection) {

          if(currentObject!= null) {

            if(! currentObject.equals((IStructuredSelection)event.getSelection()).getFirstElement())) {

              isHistory = true;

            viewer.setChecked(currentObject, false);

              viewer.setSelection(new StructuredSelection(currentObject);

              isHistory = false;

              viewer.setSelection(null);

            }

          }

        currentObject = (IStructuredSelection)event.getSelection()).getFirstElement();

            viewer.setChecked(currentObject , !viewer.getChecked(currentObject ));

            viewer.getTable().setSelection(currentObject.index);

          viewer.setSelection(null);

      }

    }

  }



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

EclipseRCP 문제해결 (EclipseRCP Trouble Shooting)[Trouble shooting,이클립스 RCP,eclipse RCP]

이미지출처 : www.mobilefish.com

EclipseRCP 문제해결 (EclipseRCP Trouble Shooting)







Product export errors



Q. I did product exported. But it can not run properly. Why?!



A. I recommend you to confirm ‘Build Configuration’ for missing any folders and files to include in the binary build.



Q. How can I ignore check event in CheckedTableViewer or CheckedTreeViewer?



A. You can use this trick.


Code:



//// ignore Check Event  //

    table = viewer.getTable();

    table.addListener(SWT.Selection,new Listener() {

         public void handleEvent(Event event) {

             if( event.detail == SWT.CHECK ) {

                    event.detail = SWT.NONE;

                    event.type   = SWT.None;

                    event.doit   = false;

                    try {

                      table.setRedraw(false);

                       TableItem item = (TableItem)table.getItem(0);

                       item.setChecked(! item.getChecked() );

                    } finally {

                      table.setRedraw(true);

                    }

             }

         }

      });



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

EclipseRCP 다른플러그인에서 환경설정 가져오기. (EclipseRCP How to get Preferences from other Plug-ins?)[다른 플러그인 환경가져오기,get preferences,이클립스 RCP,eclipse RCP]

이미지출처 : www.mobilefish.com

EclipseRCP 다른플러그인에서 환경설정 가져오기. (EclipseRCP How to get Preferences from other Plug-ins?)






최신의 이클립스 RCP 어플리케이션에서 Platform.getPlugin("plugin name") 을 사용하지 말라고 권고하기 때문에

Platform.getPlugin("plugin name").getPluginPreferences() 를 이용해서 가져올 수가 없다.



Latest Eclipse RCP Application API not recommended to use Platform.getPlugin("plugin name"). Then we can not get preferences from

Platform.getPlugin("plugin name").getPluginPreferences();



그럼 어떻게 다른 플러그인에서 Preference를 가져오느냐?

How to get Preference from other Plug-ins?

다음을 이용하면 다른 플러그인의 환경을 가져올 수 있다.

You can get Preferences use these.



IEclipsePreferences pref = [each scope what your need.]



new ConfigurationScope().getNode("plugin name");

or

new InstanceScope().getNode("plugin name");




Reference : http://dev.eclipse.org/newslists/news.eclipse.platform/msg72722.html



by


Tags : , , , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

EclipseRCP 번들 네이티브코드 사용하기.(EclipseRCP  Bundle-NativeCode)[Bundle-NativeCode,이클립스 RCP,eclipse RCP]

이미지출처 : www.mobilefish.com

EclipseRCP 번들 네이티브코드 사용하기.(EclipseRCP  Bundle-NativeCode)







번들네이티브 코드는 무엇인가?



이클립스 RCP 환경에서 개발시에, 네이티브 코드 사용을 편리하게 하기위해,



manifest 파일에 사용할수 있도록 Bundle-NativeCode라는 헤더를 만들어 놨다.




어떻게 사용하는가?



예시)



LWJGL을 사용하기위해 번들화하여, 실행을 했는데,



분명 jar파일을 의존성에 추가했는데도 불구하고,아래와 같은 에러가 난다.



java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path



LWJGL 포럼을 찾아보니, 실행할때 자바 VM Arguments로 네이티브 코드의 패스를 넣어주라고 한다.



-Djava.library.path="native code path”



이때 물론 실핼할때마다 VM Arguments에 넣어줄 수도 있지만,



Manifest.MF 파일에 다음과 같이 추가해주면 같은 효과를 볼 수 있다.




Tip.



만약 No Bundle-NativeCode match 라는 에러를 만난다면? Alias를 사용하지말고 os.name 프로퍼티를 확인하여, 그대로 써보자.



If you meet error that “No Bundle-NativeCode match", recommand you just confirm os.name property and use it.



Code:



Bundle-NativeCode: native/windowslib.dll;

native/windowslib2.dll;

osname=Windows95; osname=Windows 95; osname=Win95;

osname=Windows98; osname=Windows 98; osname=Win98;

osname=WindowsNT; osname=Windows NT; osname=WinNT;

osname=WindowsCE; osname=Winndows CE; osname=WinCE;

osname=WindowsXP; osname=Windows XP; osname=WinXP;

osname=WindowsVista; osname=Windows Vista;

processor = i386; processor = x86

native/linuxlib.so;

osname=Linux; processor=x86

(processordef | osnamedef | osversiondef | languagedef)


Reference

secrets-of-bundle-nativecode

Processor aliases

OS aliases



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

EclipseRCP 사용자 정의 다이얼로그 사용하기.( EclipseRCP SWT Custom dialog)[Custom Dialog,이클립스 RCP,eclipse RCP]

이미지출처 : www.mobilefish.com

EclipseRCP 사용자 정의 다이얼로그 사용하기.( EclipseRCP SWT Custom dialog)







SWT에서는 다음의 5가지 Dialog를 제공하고 있다.


  • ColorDialog
  • DirectoryDialog
  • FileDialog
  • FontDialog
  • MessageBox


하지만 필요에따라 자신만의 Dialog를 만들어 쓸 일이 생기는데..



간단한 SlideDialog의 예제로 알아보자.



Code:


private IWorkbenchWindow window;

  private Shell customDialog;

  private Button buttonOK;

  private Button buttonCancel;

  private boolean isSetting;

  private float density;

 

    private Listener listener = new Listener() {

        public void handleEvent(Event event) {

          if (event.widget == buttonOK) {

            isSetting = true;

          } else {

            isSetting = false;

          }

          customDialog.close();

          customDialog.dispose();

        }

 

      };

     

    private void initialize() {

      customDialog = new Shell(window.getShell(), SWT.APPLICATION_MODAL| SWT.DIALOG_TRIM);

    customDialog.setText("Setting Density");

    customDialog.setSize(210, 100);

   

    buttonOK = new Button(customDialog, SWT.PUSH);

      buttonOK.setText("OK");

      buttonOK.setBounds(10, 40, 80, 25);

 

      buttonCancel = new Button(customDialog, SWT.PUSH);

      buttonCancel.setText("Cancel");

      buttonCancel.setBounds(110, 40, 80, 25);

     

      final Slider slider = new Slider (customDialog, SWT.HORIZONTAL);

      slider.setBounds (10, 10, 180, 24);

      slider.setIncrement(10);

      slider.setMaximum(109);

      slider.setToolTipText("MIN <--!--> MAX");

      buttonOK.addListener(SWT.Selection, listener);

      buttonCancel.addListener(SWT.Selection, listener);

    slider.addListener (SWT.Selection, new Listener () {

      public void handleEvent (Event event) {

        density = slider.getSelection()*0.01f;

      }

    });

    }

  public void run(IAction action) {

    initialize();

    customDialog.open();

 

    // sleep during dialog work. dialog 가 닫힐때까지 기다리게 해준다.

     while (!customDialog.isDisposed()) {

          if (!window.getShell().getDisplay().readAndDispatch())

            window.getShell().getDisplay().sleep();

        }

 

     if(isSetting) {

        System.out.println("Density : "+density);

      }

  }


코드 후반의 while문 부분이 없다면, Dialog에서 어떤 조작을 하기도 전에 if문이 실행되버리니 유의해야 한다.



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

EclipseRCP 마법사 사용하기(EclipseRCP Wizard)[마법사,wizard,이클립스 RCP,eclipse RCP]

이미지출처 : www.mobilefish.com

EclipseRCP 마법사 사용하기(EclipseRCP Wizard)







When you use wizard, you and users probably will be happy.

마법사를 이용하면 개발자 사용자 모두 편해 질 수 있습니다.

Wizard can have one ore more pages.

마법사는 하나 또는 여러개의 페이지를 가질 수 있습니다.

I wrote simple single page wizard code in this post.

이 포스트에는 간단하게 만들수 있는 단일 페이지 마법사 코드를 작성 해 봤습니다.



MyWizard.java


Code:



public class MyWizard extends Wizard {

 

  MyWizardPage mainPage;

 

  public MyWizard() {    

  }

 

    public void addPages() {

          super.addPages();

          mainPage = new MyWizardPage();

      addPage(mainPage);

      }

   

    public boolean performFinish() {

      if(mainpage.isActionValid()) return true;

      return false;

    }

 

  public boolean performCancel() {

    return true;

  }

}


MyWizardPage.java


Code:



public class MyWizardPage  extends WizardPage {

 

   public MyWizardPage() {

      super("pageName");

      setTitle("Title");

      setDescription("Description");

//    super(pageName,title,titleImage);

   }

 

   public void createControl(Composite parent) {

      // $begin code generated by SWT-Designer$

      Composite container = new Composite(parent, SWT.NULL);

      final GridLayout gridLayout = new GridLayout();

      gridLayout.numColumns = 3;

      container.setLayout(gridLayout);

      setControl(container);

      //add Components

    //....    

   }

 

   public void init(ISelection selection) {

   if (!(selection instanceof IStructuredSelection)) return;

   //init..

   }

 

}



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

EclipseRCP 환경설정 페이지 사용하기(EclipseRCP Preference Page)[Preference Page,이클립스 RCP,eclipse RCP]

이미지출처 : www.mobilefish.com

EclipseRCP 환경설정 페이지 사용하기(EclipseRCP Preference Page)







1. add (org.eclipse.ui.preferencePages)extension to plugin.xml

- plugin.xml파일에 환경설정 확장점을 추가해준다.

2. create new class that implements IWorkbenchPreferencePage

- IWorkbenchPreferencePage를 구현한 클래스를 생성한다.

3. If you need to adjust, you can make Preference constants and Preference initializer classes.

- 필요하다면, 환경설정 상수나, 초기화 클래스관련 클래스를 생성할 수 있습니다.

범위 : 기본, 환경, 인스턴스

scopes : default , configuration , instance



Preference.java


Code:

public class PreferencePage
  extends FieldEditorPreferencePage
  implements IWorkbenchPreferencePage {
 
  public PreferencePage() {
    super(GRID);
    setPreferenceStore(Plugin.getDefault().getPreferenceStore());
    setDescription("Preferences");
  }

 

  public void createFieldEditors() {

    String[] filterExtension = { "*.file extension" };

    addField(new DirectoryFieldEditor(PreferenceConstants.DIR_PATH,         "&Directory preference:", getFieldEditorParent()));

                      FileFieldEditor filePathPrefEditor = new FileFieldEditor(PreferenceConstants.FILE_PATH,

        "&File Path preference:", getFieldEditorParent());

    filePathPrefEditor.setFileExtensions(filterExtension);

    addField(filePathPrefEditor);

    addField(

      new BooleanFieldEditor(

        PreferenceConstants.P_BOOLEAN,

        "&An example of a boolean preference",

        getFieldEditorParent()));

 

    addField(new RadioGroupFieldEditor(

        PreferenceConstants.P_CHOICE,

      "An example of a multiple-choice preference",

      1,

      new String[][] { { "&Choice 1", "choice1" }, {

        "C&hoice 2", "choice2" }

    }, getFieldEditorParent()));

    addField(

      new StringFieldEditor(PreferenceConstants.P_STRING, "A &text preference:", getFieldEditorParent()));

  }

 

  /* (non-Javadoc)

   * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)

   */

  public void init(IWorkbench workbench) {

  }

 

}

PreferenceConstants.java


Code:










public class PreferenceConstants {
  public static final String DIR_PATH = "dirPath";
  public static final String FILE_PATH = "filePath";
 
  public static final String P_PATH = "pathPreference";
  public static final String P_BOOLEAN = "booleanPreference";
  public static final String P_CHOICE = "choicePreference";
  public static final String P_STRING = "stringPreference";
}

PreferenceInitializer.java


Code:







public class PreferenceInitializer extends AbstractPreferenceInitializer {
  public void initializeDefaultPreferences() {
    IPreferenceStore store = Plugin.getDefault().getPreferenceStore();
    store.setDefault(PreferenceConstants.DIR_PATH,"C:\\Program Files");
  }
}


RadioGroupFieldEditor 사용팁

만약 아직 지원하지 않는 값을 사용자가 클릭했을 경우,

다음과 같이 propertyChange를 overriding하여 필드값을 Initializer에서 설정해준 값으로 불러와 변경시키는 방법을 사용 하면된다.



Code:

public void propertyChange(PropertyChangeEvent event) {
    super.propertyChange(event);
    if(event.getProperty().equals(FieldEditor.VALUE)) {
      if(event.getSource() instanceof RadioGroupFieldEditor) {
        if(!event.getNewValue().equals("available value")){
          Dialog.showWarningMessageDialog(getFieldEditorParent(), "Not available", "Sorry, Now available only for available value.");
          RadioGroupFieldEditor radioGroupEditor = (RadioGroupFieldEditor) event.getSource();
          radioGroupEditor .loadDefault();
        }   

      }

    }

  }



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

EclipseRCP 백그라운드잡 템플릿 (EclipseRCP Background Job Template)[Background Job,이클립스 RCP,eclipse RCP]

이미지출처 : www.mobilefish.com

EclipseRCP 백그라운드잡 템플릿 (EclipseRCP Background Job Template)







Code:

Job job = new Job("Title") {
          protected IStatus run(IProgressMonitor monitor) {
           monitor.beginTask(TaskName, totalWork);
              monitor.subTask(SubTaskName);
                  monitor.worked(work);
                  if (monitor.isCanceled()){
                    return Status.CANCEL_STATUS;
                  }
//                  try { Thread.sleep(1000); } catch (Exception e) { }
                        Display.getDefault().asyncExec(new Runnable() {
                           public void run() {
                                           //  UI Update Jobs
                           }
                        });
                 
               return endJob(monitor);
            }
         };
 
//         job.setUser(true);
         job.schedule();
 
   public boolean isModal(Job job) {
          Boolean isModal = (Boolean)job.getProperty(
                                 IProgressConstants.PROPERTY_IN_DIALOG);
          if(isModal == null) return false;
          return isModal.booleanValue();
       }
   protected  Action getCompletedAction() {
      return new Action("View status") {
        public void run() {
         
          MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                  dialogTitle,
                  dialogContent);
        }
      };
    }
   
    protected  void showResults() {
          Display.getDefault().asyncExec(new Runnable() {
             public void run() {
                getCompletedAction().run();
             }
          });
       }
   
    protected IStatus endJob(IProgressMonitor monitor) {
    if (isModal(this)) {
          // The progress dialog is still open so
          // just open the message
          showResults();
       } else {
       setProperty(IProgressConstants.KEEP_PROPERTY, Boolean.TRUE);
       setProperty(IProgressConstants.ACTION_PROPERTY,
              getCompletedAction());
       }
      monitor.done();
       return Status.OK_STATUS;
      
  }



by


Tags : , , , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

이클립스 RCP TableViewer. Table에 Edit 기능을 붙일때[TableViewer,이클립스 RCP,eclipse RCP]

이미지출처 : www.mobilefish.com

이클립스 RCP TableViewer. Table에 Edit 기능을 붙일때..









TableViewer에

setCellEditors(CellEditor[])와

setCellModifier(ICellModifier)를 해 주어도.

셀 에디트가 되지 않을때에는,

setColumnProperties(String[] colimnNames)

를 이용하여 컬럼 프로퍼티를 정해주면 에디트가 가능하다.



by


Tags : , , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

자바 성능팁 배열리스트,링크드리스트 (Java PerformenceTip ArrayList/LinkedList)[Java,자바,ArrayList/LinkedList]

이미지출처 : blogs.sun.com

자바 성능팁 배열리스트,링크드리스트 (Java PerformenceTip ArrayList/LinkedList)









http://java.sun.com/developer/JDCTechTips/2002/tt0910.html

ArrayList/LinkedList

———————————–

ArrayList가 빠르다! 아니다 LinkedList가 빠르다!



말이 많다..



사람마다 잘하는 일이 다르듯이..



ArrayList와 LinkedList도 잘하는 일이 다르다.



ArrayList는 어릴적에 주로 레고를 가지고 놀아서,

임의적 접근에 강하다.



예를 들자면..

1000개의 음반중에 128번째 들어있는 음반을 듣고 싶다던가 할 때. musicArrayList.get(128) 으로 찾는게 빠르다는 것이다.



LinkedList는 어릴적에 주로 도미노게임을 하며 자라서 그런지..

줄세우는것에 강하다.

1000개의 음반을 사와서 차곡차곡 음반진열장에 넣는데 특화되있는것이다.

for(int i=0;i<1000;i++) {

musicLinkedList.add(musicAlbum[i]);

}




Zero Length Array

———————————–

리스트를 배열로 바꿀때 길이가 0인 배열을 파라메터로 넣어주면..

리스트가 비어있을때엔 길이가 0인 배열을 바로 넣어주고,

리시트가 차있을때엔 리스트에 들어있는 (Object)타입을 파라메터에 맞게 변환해주는 효과가 있다.




String out[] = (String[])stringlist.toArray(new String[0]);




Reference

———————————–

Using ArrayList/LinkedList and Using Zero-Length Arrays

(http://java.sun.com/developer/JDCTechTips/2002/tt0910.html)



by


Tags : , , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.