org.eclipse.ui.views

º¸±â´Â Á¤º¸ÀÇ °èÃþ ±¸Á¶¸¦ Ž»öÇϰųª ¿ÀºêÁ§Æ®ÀÇ Æ¯¼ºÀ» Ç¥½ÃÇÒ ¼ö ÀÖ´Â Workbench ÆÄÆ®ÀÔ´Ï´Ù.  ´ë°³ ÇØ´ç ÆíÁý±â Áö¿øÀ» À§ÇØ º¸±â°¡ Á¦°øµË´Ï´Ù.  ¿¹¸¦ µé¾î, ¾Æ¿ô¶óÀÎ º¸±â¿¡¼­´Â ÆíÁý±â¿¡ ÀÖ´Â Á¤º¸ÀÇ ±¸Á¶È­µÈ º¸±â¸¦ Ç¥½ÃÇÕ´Ï´Ù.  Ư¼º º¸±â´Â ÇöÀç ÆíÁýÇϰí ÀÖ´Â ¿ÀºêÁ§Æ®ÀÇ Æ¯¼ºÀ» Ç¥½ÃÇÕ´Ï´Ù.

»ç¿ëÀÚ°¡ ¼±ÅÃÇϰųª º¸±â¿¡¼­ º¯°æÇÒ °æ¿ì º¯°æ»çÇ×Àº ¹Ù·Î »ç¿ëÀÚ ÀÎÅÍÆäÀ̽ºÀÇ ´Ù¸¥ °ü·ÃµÈ ÆÄÆ®¿¡ ¹Ý¿µµË´Ï´Ù. ÁöÁ¤ÇÑ º¸±âÀÇ ÀνºÅϽº Çϳª¸¸ Workbench ÆäÀÌÁö¿¡¼­ ¿­¸³´Ï´Ù.

org.eclipse.ui.views È®ÀåÁ¡À» »ç¿ëÇϸé Ç÷¯±×Àο¡¼­ º¸±â¸¦ Workbench¿¡ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. º¸±â¸¦ Á¦°øÇÏ´Â Ç÷¯±×Àο¡¼­ ÀÚ½ÅÀÇ ±¸Çö Ŭ·¡½º, ÀÚ½ÅÀÌ ¼ÓÇÏ´Â º¸±âÀÇ Ä«Å×°í¸®(¶Ç´Â ±×·ì), ¸Þ´º¿Í ·¹À̺íÀÇ º¸±â¸¦ ¼³¸íÇÏ´Â µ¥ »ç¿ëÇØ¾ß ÇÒ À̸§ ¹× ¾ÆÀÌÄÜ µî°ú °°Àº º¸±â¿¡ °üÇÑ ±¸¼º Á¤º¸¿Í ÇÔ²² º¸±â¸¦ ÀÚ½ÅÀÇ plugin.xml ÆÄÀÏ¿¡ µî·ÏÇØ¾ß ÇÕ´Ï´Ù.

º¸±âÀÇ ÀÎÅÍÆäÀ̽º´Â IViewPart¿¡ Á¤ÀǵǾî ÀÖÁö¸¸ Ç÷¯±×Àο¡¼­ óÀ½ºÎÅÍ IViewPart¸¦ ±¸ÇöÇÏ´Â ´ë½Å ViewPart Ŭ·¡½º¸¦ È®ÀåÇϵµ·Ï ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù.

Hello world ¿¹¿¡ ÃÖ¼ÒÇÑÀÇ º¸±â È®ÀåÀ» ±¸ÇöÇß½À´Ï´Ù. ÀÌÁ¦ ´Ù¸¥ Workbench º¸±â¸¦ ÀνÄÇϰí WorkbenchÀÇ »ç¿ëÀÚ Å½»ö°ú ¼±ÅûçÇ׿¡ ÀÀ´äÇÏ´Â ¿¹¸¦ »ìÆìº¸°Ú½À´Ï´Ù. ¸ÕÀú plugin.xmlÀÇ È®Àå ¼±¾ðÀ» »ìÆìº¸°Ú½À´Ï´Ù.

<extension
    point="org.eclipse.ui.views">
    <category 
        id="org.eclipse.ui.examples.readmetool"
        name="&amp;Readme">
    </category>
    <view
        id="org.eclipse.ui.examples.readmetool.views.SectionsView"
        name="Readme Sections"
        icon="icons/basic/view16/sections.gif"
        category="org.eclipse.ui.examples.readmetool"
        class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
    </view>
</extension>

ÀÌ ³»¿ëÀº ÈξÀ Àͼ÷ÇØ º¸ÀÌ´Â ³»¿ëÀÔ´Ï´Ù. »õ º¸±â ReadmeSectionsView°¡ Workbench¿¡ Á¦°øµË´Ï´Ù. º¸±â id, À̸§ ¹× Ä«Å×°í¸®´Â ÀÌÀüó·³ ÁöÁ¤µË´Ï´Ù. Ç÷¯±×ÀÎÀÇ ¼³Ä¡ µð·ºÅ丮¿¡ °ü·ÃµÈ °æ·Î¸¦ »ç¿ëÇÏ¿© º¸±â¿¡ ¾ÆÀÌÄÜÀ» Á¦°øÇÕ´Ï´Ù.

ReadmeSectionsView¸¦ »ìÆìº¸°Ú½À´Ï´Ù. Perspective->º¸±â Ç¥½Ã->±âŸ... ¸¦ ¼±ÅÃÇÏ°í º¸±â Ç¥½Ã ¸ñ·Ï¿¡¼­ º¸±â¸¦ ¼±ÅÃÇÏ¿© Workbench¿¡ ÀÓÀÇÀÇ º¸±â¸¦ Ç¥½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù.

ReadmeSectionsView¸¦ Ç¥½ÃÇÒ °æ¿ì ¸ñ·ÏÀ» °¡Áø º¸±â°¡ ÆË¾÷À¸·Î ³ªÅ¸³³´Ï´Ù. .readme ÆÄÀÏ È®ÀåÀÚ¸¦ Ŭ¸¯ÇÏÁö ¾ÊÀº °æ¿ì¿¡´Â ¸ñ·ÏÀÌ °ø¹éÀ¸·Î ³ªÅ¸³³´Ï´Ù. ÀÌ °æ¿ì readme ÆÄÀÏÀÇ ¼½¼ÇÀ» »ç¿ëÇÏ¿© ¸ñ·ÏÀ» ä¿ó´Ï´Ù.

Ç÷¯±×Àο¡¼­ ¾î¶»°Ô ¼±ÅûçÇ×ÀÌ º¯°æµÇ¾ú´Â Áö ÆÄ¾ÇÇϰí readme ÆÄÀÏÀ» ÀνÄÇմϱî? ÀÌ »çÇ×À» Äڵ忡¼­ ÃßÀûÇÒ ¼ö ÀÖ´Â °æ¿ì ÅëÇÕµÈ Workbench Ç÷¯±×ÀÎÀ» ºôµåÇÏ´Â ¹æ¹ýÀ» ÀÌÇØÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù.

Àͼ÷ÇÑ createPartControl ¸Þ¼Òµå¸¦ ½ÃÀÛÇϰڽÀ´Ï´Ù. Hello World ¿¹¿¡¼­ º¸¾ÒµíÀÌ º¸±â¸¦ ³ªÅ¸³»´Â À§ÁöÆ®(widget)°¡ À̰÷¿¡¼­ ÀÛ¼ºµË´Ï´Ù. ÀϺΠÄÚµå´Â ¹«½ÃÇÏ°í ½ÃÀÛÇϰڽÀ´Ï´Ù.

public void createPartControl(Composite parent) {
    viewer = new ListViewer(parent);
    ...
    // add myself as a global selection listener
    getSite().getPage().addSelectionListener(this);

    // prime the selection
    selectionChanged(null, getSite().getPage().getSelection());
}

º¸±â¿¡¼­ ListViewer¸¦ ÀÛ¼ºÇϰí ÀúÀåÇϰí ÀÚ½ÅÀ» ÇØ´ç ÆäÀÌÁö¿¡ ¼±ÅûçÇ× ¸®½º³Ê·Î µî·ÏÇÕ´Ï´Ù. Workbench â, Æ÷ÇÔÇÏ´Â ÆäÀÌÁö ¹× Ç÷¯±×ÀÎ µî°ú °°Àº º¸±âÀÇ ÄÁÅØ½ºÆ®¿¡ ´ëÇÑ Á¤º¸¸¦ Æ÷ÇÔÇÏ´Â IViewSite¿¡¼­ ÆäÀÌÁö¸¦ °¡Á®¿É´Ï´Ù. ¼±ÅûçÇ×ÀÇ º¯°æÀ» ÅëÁö¹ÞÀº °æ¿ì¿¡´Â  ´ÙÀ½ Äڵ尡 ½ÇÇàµË´Ï´Ù.

public void selectionChanged(IWorkbenchPart part, ISelection sel) {
    //if the selection is a readme file, get its sections.
    AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel);
    viewer.setInput(input);
}

createPartControl ¸Þ¼Òµå¿¡¼­ ¸¸µç Ç¥½Ã±âÀÇ ÀÔ·ÂÀ¸·Î ¾Ë°í ÀÖ´Â readme ¼½¼ÇÀ¸·Î ¼±ÅûçÇ×À» º¯È¯ÇÒ ¶§ ReadmeModelFactory Ŭ·¡½º°¡ °ü·ÃµÈ °ÍÀ¸·Î º¸ÀÔ´Ï´Ù.

º¸±â´Â ÀÚ½ÅÀÇ °ü½É Ç׸ñÀ» ¼±ÅûçÇ× º¯°æ¿¡ µî·ÏÇÕ´Ï´Ù. ¼±ÅûçÇ×ÀÌ Ç¥½Ã±âÀÇ ÇØ´ç ÀÔ·ÂÀ¸·Î º¯È¯µË´Ï´Ù. ±×·± ´ÙÀ½ Ç¥½Ã±â°¡ ¸ñ·Ï À§ÁöÆ®(widget)¸¦ ä¿ó´Ï´Ù.

Ç¥½Ã±â¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀ» º¸·Á¸é Ç¥½Ã±â·Î À̵¿ÇϽʽÿÀ. Ç¥½Ã±â¿¡ ÀÚ½ÅÀÇ ÀÔ·Â ¿ä¼Ò¸¦ ¾Ë¸®°í ³ª¸é ÇØ´ç Á¤º¸·Î ¸ñ·Ï À§ÁöÆ®(widget)¸¦ ä¿ì´Â ¹æ¹ýÀ» ¾Ë ¼ö Àִµ¥  ¹Ù·Î ListViewerÀÔ´Ï´Ù. ±×·¯³ª readme ÆÄÀÏÀ» °¡Áø ½Ã±â¿Í Ç¥½Ã±âÀÇ ¼½¼Ç Á¤º¸¸¦ °¡Á®¿Â °÷À» ¾î¶»°Ô ¾Ë ¼ö ÀÖ½À´Ï±î? ReadmeModelFactory¸¦ »ìÆìº¸¸é ¾Ë ¼ö ÀÖ½À´Ï´Ù.

public AdaptableList getSections(ISelection sel) {
    // If sel is not a structured selection just return.
    if (!(sel instanceof IStructuredSelection))
        return null;
    IStructuredSelection structured = (IStructuredSelection)sel;

    //if the selection is a readme file, get its sections.
    Object object = structured.getFirstElement();
    if (object instanceof IFile) {
        IFile file = (IFile) object;
        String extension = file.getFileExtension();
        if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) {
            return getSections(file);
        }
    }

    //the selected object is not a readme file
    return null;
}

±¸Á¶È­µÈ º¹¼ö ¼±ÅûçÇ×ÀÎÁö È®ÀÎÇϱâ À§ÇØ ¼±ÅûçÇ×À» °Ë»çÇÕ´Ï´Ù. ±¸Á¶È­µÈ ¼±ÅûçÇ×ÀÇ °³³äÀº JFace Ç¥½Ã±â¿¡¼­ °¡Á®¿É´Ï´Ù. ¼±ÅûçÇ×ÀÇ Ã¹ ¹øÂ° ¿ÀºêÁ§Æ®ÀÇ °æ¿ì ÆÄÀÏ(IFile) ÀÚ¿øÀÎÁö È®ÀÎÇÕ´Ï´Ù. ÆÄÀÏ ÀÚ¿øÀÏ °æ¿ì È®ÀåÀÚ°¡ ".readme" È®ÀåÀÚ¿Í ÀÏÄ¡ÇÏ´ÂÁö È®ÀÎÇÕ´Ï´Ù. readme ÆÄÀÏÀÌ ÀÖÀ¸¸é ´Ù¸¥ ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© ¼±ÅûçÇ×À» ±¸¹®ºÐ¼®ÇÒ ¼ö ÀÖ½À´Ï´Ù.  ÆÄÀÏ ±¸¹®ºÐ¼®¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ReadmeModelFactoryMarkElement ¹× DefaultSectionsParserÀÇ ³ª¸ÓÁö ºÎºÐ¿¡¼­ ã¾Æº¼ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ È®ÀåÀ» ¿¬±¸ÇÏ¿© ÀÏ¹Ý Workbench °³³äÀ» ¸¹ÀÌ ´Ù·ç¾ú½À´Ï´Ù. ÀÌÁ¦ ÀϺΠ´Ù¸¥ Workbench È®ÀåÀ¸·Î À̵¿ÇÏ¿© Ç÷¯±×Àο¡¼­ Workbench UI¿¡ Á¦°øÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» °ËÅäÇϰڽÀ´Ï´Ù.