ÇÊ¿äÇÑ ÇïÆÛ Ŭ·¡½ºÀÇ ¹®¼ ÇÁ¸®Á¨Å×ÀÌ¼Ç ¹× ±¸¼ºÀÇ ±¸ÇöÀº ´ë°³ ÆíÁý±â ¹× ÇØ´ç ÅØ½ºÆ® Ç¥½Ã±â°¡ ¼öÇàÇÕ´Ï´Ù. (Ç¥½Ã±â °³³ä¿¡ Àͼ÷ÇÏÁö ¾ÊÀ¸¸é Ç¥½Ã±â¸¦ ÂüÁ¶ÇϽʽÿÀ.)
TextViewer´Â ¹®¼ ¸ðµ¨ ¸ÊÇÎÀÇ ¸ðµç ÇÏÀ§ ·¹º§ ¼¼ºÎ»çÇ× ¹× ÇØ´ç ÆÄƼ¼ÇÀ» »ç¿ëÀÚ°¡ º¸´Â ä»öµÇ°í Çü½ÄÈµÈ ÅØ½ºÆ®·Î ó¸®ÇÕ´Ï´Ù. ¼Ò½º ÄÚµå ½ºÅ¸ÀÏ ÆíÁý±âÀÇ °æ¿ì SourceViewer°¡ Á¦°øµË´Ï´Ù. ¼Ò½º Ç¥½Ã±â¿¡¼´Â ¼Ò½º ÄÚµå ¾î³ëÅ×À̼ÇÀÇ °³³äÀ» ¼Ò°³ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¾î³ëÅ×À̼ÇÀº ÅØ½ºÆ®ÀÇ ¿ÞÂÊ¿¡ ¼¼·Î ´«±ÝÀÚ, ÅØ½ºÆ®ÀÇ ¿À¸¥ÂÊ¿¡ °³¿ä ´«±ÝÀÚ¿¡ Ç¥½ÃµÇ°Å³ª ¶Ç´Â ÅØ½ºÆ® ¹Ø¿¡ ä»öµÈ ºÒ±ÔÄ¢ÇÑ ¼±À¸·Î Ç¥½ÃµÉ ¼ö ÀÖ½À´Ï´Ù.
SourceViewer ¹× ÇØ´ç ÇïÆÛ Ŭ·¡½º´Â AbstractTextEditor °èÃþ ±¸Á¶¿¡¼ »ç¿ëµË´Ï´Ù. ÆÐŰÁö org.eclipse.jface.text.source´Â ÀÌ Ç¥½Ã±â ¹× ¾î³ëÅ×ÀÌ¼Ç ÇÁ¸®Á¨Å×À̼ÇÀ» Áö¿øÇÏ´Â ±âŸ Ŭ·¡½º¸¦ Á¤ÀÇÇÕ´Ï´Ù.
¹®¼ Á¦°ø¾÷ü°¡ ¹®¼ ÀÚü»Ó¸¸ ¾Æ´Ï¶ó ÇØ´ç ¹®¼ÀÇ ¾î³ëÅ×À̼ǿ¡ ´ëÇÑ ¸ðµ¨ IAnnotationModelÀ» Á¦°øÇÑ´Ù´Â °ÍÀ» ¾Õ¼ È®ÀÎÇß½À´Ï´Ù. ÀÌ ¾î³ëÅ×ÀÌ¼Ç ¸ðµ¨Àº ¾î³ëÅ×À̼ÇÀ» º¸À¯ÇÏ°í ¿äû ½Ã À̸¦ ¿°ÅÇϸç, ÅØ½ºÆ®¿¡ ¸ÂÃç ¾î³ëÅ×À̼ÇÀ» ÃֽŠ»óÅ·ΠÀ¯ÁöÇϵµ·Ï ÅØ½ºÆ® º¯°æ»çÇ×À» ûÃëÇÕ´Ï´Ù. JavaDocumentProvider´Â FileDocumentProvider ¹× ÇØ´ç ¾î³ëÅ×ÀÌ¼Ç ¸ðµ¨¿¡ Á¤ÀÇµÈ ÀÛµ¿À» °è½ÂÇÕ´Ï´Ù.
protected IAnnotationModel createAnnotationModel(Object element) throws CoreException { if (element instanceof IFileEditorInput) { IFileEditorInput input= (IFileEditorInput) element; return new ResourceMarkerAnnotationModel(input.getFile()); } return super.createAnnotationModel(element); }
ResourceMarkerAnnotationModelÀº ÀÛ¾÷°ø°£ÀÇ ÀÚ¿ø¿¡ ¸¶Ä¿¸¦ ³ªÅ¸³»´Â ¾î³ëÅ×À̼ÇÀÇ ¸ðµ¨À» Á¤ÀÇÇÕ´Ï´Ù. (¸¶Ä¿¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â ÀÚ¿ø ¸¶Ä¿¸¦ ÂüÁ¶ÇϽʽÿÀ.) ÀÌ ¸ðµ¨Àº °¢ ¸¶Ä¿¿¡ À̹ÌÁö¿Í ¼³¸íÀ» ÁöÁ¤ÇÏ°í ¸¶Ä¿ÀÇ º¯°æ»çÇ×°ú °ü·ÃÇÑ ÀÚ¿øÀ» ¸ð´ÏÅÍÇÕ´Ï´Ù.
¹®¼ ÆíÁý±â¿¡ ¾î³ëÅ×ÀÌ¼Ç ¸ðµ¨À» Ç¥½ÃÇÏ´Â ¹æ¹ýÀ» È®ÀÎÇϱâ À§ÇØ Ç÷§Æû ¹®¼ ÆíÁý±â ¹× ÇØ´ç ´«±ÝÀÚ¿Í ¾î³ëÅ×À̼ÇÀÇ »ç¿ëÀ» °Ë»çÇÕ´Ï´Ù. ¾î³ëÅ×À̼ÇÀÌ ´«±ÝÀÚ ¹× ÅØ½ºÆ®¿¡ Ç¥½ÃµÇ´Â ¹æ¹ý¿¡ ´ëÇÑ ¼¼ºÎ»çÇ×Àº ¾î³ëÅ×ÀÌ¼Ç ÅÇ¿¡ ÀÖ´Â Workbench > ÆíÁý±â > ¹®¼ ÆíÁý±â¿¡¼ »ç¿ëÀÚ°¡ Á¦¾îÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÆíÁý ¿µ¿ª ¿ÞÂÊÀÇ ¼¼·Î ´«±ÝÀÚ´Â ÅØ½ºÆ® Çà°ú ÀÎÁ¢ÇÑ Çà ±â¹Ý ¾î³ëÅ×ÀÌ¼Ç ¹× ÅØ½ºÆ® ¹üÀ§¸¦ Ç¥½ÃÇÏ´Â °æ¿ì Ç÷§Æû ¹®¼ ÆíÁý±â¿¡¼ »ç¿ëµË´Ï´Ù.
ÀÌ·¯ÇÑ ¾î³ëÅ×À̼ÇÀº Á¦°øµÈ ResourceMarkerAnnotationModel¿¡¼ ¼³¸íµË´Ï´Ù. ÀÌ ¸ðµ¨Àº ¼Ò½º Ç¥½Ã±â°¡ ÆíÁý±â¿¡ ÀÇÇØ Ãʱâ鵃 ¶§ SourceViewer·Î ¼³Á¤µË´Ï´Ù. AbstractTextEditor ·ÎºÎÅÍ ´ÙÀ½ ½º´ÏÆêÀº ¹®¼¿Í ¾î³ëÅ×ÀÌ¼Ç ¸ðµ¨ÀÌ ¹®¼¿Í ¿¬°üµÇ´Â ¹æ¹ýÀ» º¸¿©ÁÝ´Ï´Ù.
private void initializeSourceViewer(IEditorInput input) { IAnnotationModel model= getDocumentProvider().getAnnotationModel(input); IDocument document= getDocumentProvider().getDocument(input); if (document != null) { fSourceViewer.setDocument(document, model); ...
¼Ò½º Ç¥½Ã±â°¡ ÀûÀýÇÑ ¹®¼ ¹× ¾î³ëÅ×ÀÌ¼Ç ¸ðµ¨¿¡ ´ëÇØ ±¸¼ºµÇ¸é, ¼Ò½º Ç¥½Ã±â´Â ¹®¼¸¦ Á¦ÃâÇÏ°í ¿Ã¹Ù¸¥ ¾î³ëÅ×À̼ÇÀÌ ¿ÞÂÊÀÇ ¼¼·Î ´«±ÝÀÚ¿¡ Ç¥½ÃµÇ±â¿¡ ÃæºÐÇÑ Á¤º¸¸¦ °®½À´Ï´Ù. ¹®¼°¡ ¼³Á¤µÉ ¶§ ¸ðµ¨ÀÌ ´«±ÝÀÚ¿Í ¿¬°üµË´Ï´Ù. ´ÙÀ½ ½º´ÏÆê¿¡¼´Â ¹®¼°¡ ¼Ò½º Ç¥½Ã±â·Î ¼³Á¤µÉ ¶§ ÀϾ´Â »óȲÀ» º¸¿©ÁÝ´Ï´Ù. À̰ÍÀº ¸í·áÇÏ°Ô SourceViewerÀÇ ½ÇÁ¦ ÄÚµå·ÎºÎÅÍ ´Ü¼øÈµÇ¾ú½À´Ï´Ù.
public void setDocument(IDocument document, IAnnotationModel annotationModel) { ... // create visual annotation model from the supplied model and store // in fVisualAnnotationModel ... if (fVerticalRuler != null) fVerticalRuler.setModel(fVisualAnnotationModel);
ÀÌ·± ¹æ¹ýÀ¸·Î ´«±ÝÀÚ´Â ÀûÀýÇÑ ¾î³ëÅ×ÀÌ¼Ç ¸ðµ¨°ú ¿¬°üµË´Ï´Ù.
´«±ÝÀÚ¸¦ »ìÆìº¾´Ï´Ù. ¹®¼ ÆíÁý±â¿¡¼ ÀÛ¼ºµÇ¸ç ÆíÁý±â Ç¥½Ã±â¿Í ¿¬°áµË´Ï´Ù. Java ÆíÁý±â ¿¹Á¦°¡ ´«±ÝÀÚÀÇ Æ¯¼ö ÀÛµ¿À» Á¤ÀÇÇÏÁö ¾ÊÀ¸¹Ç·Î, TextEditor¿¡ Á¤ÀÇµÈ ´ë·Î ´«±ÝÀÚ¸¦ °è½ÂÇÕ´Ï´Ù.
protected IVerticalRuler createVerticalRuler() { CompositeRuler ruler= new CompositeRuler(); ruler.addDecorator(0, new AnnotationRulerColumn(VERTICAL_RULER_WIDTH)); if (isLineNumberRulerVisible()) ruler.addDecorator(1, createLineNumberRulerColumn()); return ruler; }
¹®¼ ÆíÁý±â´Â CompositeRuler¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÌ ´«±ÝÀÚ¿¡´Â ÀÚü ºñÁÖ¾ó ÇÁ¸®Á¨Å×À̼ÇÀÌ ¾ø½À´Ï´Ù. ÇÁ¸®Á¨Å×À̼ÇÀº ´«±ÝÀÚÀÇ ¿(IVerticalRulerColumn)À» Ç¥½ÃÇÏ´Â µ¥ÄÚ·¹ÀÌÅÍ ¸ñ·Ï¿¡ Á¦°øµË´Ï´Ù. ÀÌ ¿¹Á¦¿¡¼ ¾î³ëÅ×À̼Ç(AnnotationRulerColumn)À» Ç¥½ÃÇÏ´Â ´«±ÝÀÚ ¿Àº Ç×»ó Ãß°¡µÇ¸ç Çà ¹øÈ£ ´«±ÝÀÚ ¿Àº »ç¿ëÀÚ È¯°æ ¼³Á¤À» ±â¹ÝÀ¸·Î Ãß°¡µË´Ï´Ù. ¾î³ëÅ×ÀÌ¼Ç ´«±ÝÀÚ ¿Àº ÀûÀýÇÑ À§Ä¡¿¡¼ ¾î³ëÅ×ÀÌ¼Ç À̹ÌÁö¸¦ Ç¥½ÃÇϴ ƯÁ¤ Ç׸ñÀ» ó¸®ÇÕ´Ï´Ù.
¸ðµç Ŭ·¡½º°¡ ´«±ÝÀÚ¸¦ Ç¥½ÃÇÏ´Â µ¥ ¿¬°üµÇÁö¸¸ ´«±ÝÀÚ ÀÛµ¿À» °¡Á®¿À´Â °æ¿ì ¿¹Á¦ Ŭ·¡½º¿¡´Â ¼ºêŬ·¡½º ÇÁ·¹ÀÓ¿öÅ© Ŭ·¡½º¸¸ ÇÊ¿äÇÕ´Ï´Ù. JavaDocumentProvider´Â FileDocumentProvider·ÎºÎÅÍ ÀûÀýÇÑ ¸¶Ä¿ ¾î³ëÅ×ÀÌ¼Ç ¸ðµ¨À» °è½ÂÇÕ´Ï´Ù. JavaTextEditor´Â TextEditor·ÎºÎÅÍ ´«±ÝÀÚ ÇÁ¸®Á¨Å×À̼ÇÀ» °è½ÂÇÕ´Ï´Ù.
ÆíÁý ¿µ¿ª ¿À¸¥ÂÊ¿¡ ÀÖ´Â °³¿ä ´«±ÝÀÚ´Â Àüü ¹®¼¿¡ ´ëÇÑ ¾î³ëÅ×À̼ÇÀ» Ç¥½ÃÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. ¹®¼ À§Ä¡¿¡ »ó´ëÀûÀ¸·Î ÀÌ·¯ÇÑ ¾î³ëÅ×À̼ÇÀÌ Ç¥½ÃµÇ¸ç, »ç¿ëÀÚ°¡ ¹®¼¸¦ ȸéÀ̵¿ÇÒ ¶§ ¾î³ëÅ×À̼ÇÀº À̵¿ÇÏÁö ¾Ê½À´Ï´Ù. ¹®¼ÀÇ ÇØ´ç ºÎºÐÀÌ Ç¥½ÃµÇ¸é ¼¼·Î ´«±ÝÀÚ¿¡ ´ë°³ ÇØ´ç ¾î³ëÅ×À̼ÇÀÌ ÀÖ½À´Ï´Ù.
¾Æ·¡ ¼¼·Î ´«±ÝÀÚ´Â ¹®¼¿¡ µÎ °³ÀÇ Å¸½ºÅ©¿Í ÇϳªÀÇ Ã¥°¥Çǰ¡ ÀÖÀ½À» º¸¿©ÁÝ´Ï´Ù. Ã¥°¥ÇÇ Ã³¸®µÈ ÅØ½ºÆ®°¡ Ç¥½ÃµÇ¹Ç·Î ÇØ´ç ¾î³ëÅ×ÀÌ¼Ç ¶ÇÇÑ ¿ÞÂÊ¿¡ Ç¥½ÃµË´Ï´Ù.
»ç¿ëÀÚ´Â ¾î³ëÅ×ÀÌ¼Ç ÀÚü¸¦ ´·¯ Äڵ忡 ¾î³ëÅ×ÀÌ¼Ç À§Ä¡·Î Ž»öÇÒ ¼ö ÀÖ½À´Ï´Ù.
°³¿ä ´«±ÝÀÚ¿¡ Ç¥½ÃµÈ ¾î³ëÅ×ÀÌ¼Ç À¯ÇüÀº ¾î³ëÅ×ÀÌ¼Ç À¯ÇüÀ» ´«±ÝÀÚ¿¡ Ãß°¡ÇÏ¿© ÆÇº°ÇÕ´Ï´Ù. ´ÙÀ½ ½º´ÏÆê¿¡¼ SourceViewerDecorationSupport·ÎºÎÅÍ ¾î³ëÅ×ÀÌ¼Ç À¯ÇüÀÌ µ¿ÀûÀ¸·Î ´«±ÝÀÚ¿¡ Ãß°¡µË´Ï´Ù. (SourceViewerDecorationSupport¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â ´ÙÀ½ ÀýÀ» ÂüÁ¶ÇϽʽÿÀ.)
private void showAnnotationOverview(Object annotationType) {
if (fOverviewRuler != null) { Color c= getAnnotationTypeColor(annotationType);
fOverviewRuler.setAnnotationTypeColor(annotationType, c); int l= getAnnotationTypeLayer(annotationType);
fOverviewRuler.setAnnotationTypeLayer(annotationType, l);
fOverviewRuler.addAnnotationType(annotationType);
fOverviewRuler.update();
} }
¶ÇÇÑ °³¿ä ´«±ÝÀÚ´Â À¯Çü ¹× À¯ÇüÀÌ Ç¥½ÃµÇ´Â ¹æ¹ý µîÀÇ Æ¯Á¤ ¾î³ëÅ×À̼ǿ¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇÏ´Â µ¥ »ç¿ëµÇ´Â IAnnotationAccess¿Í ÇÔ²² Á¦°øµË´Ï´Ù. TextEditor´Â ÇØ´ç ¸¶Ä¿ À¯Çü¿¡ µû¶ó ¾î³ëÅ×À̼ÇÀ» ÇØ¼®ÇÏ°í °³¿ä ´«±ÝÀÚ¿¡ Ç¥½ÃµÉ ¸¶Ä¿ À¯ÇüÀ» È®ÀÎÇÒ ¼ö ÀÖµµ·Ï »ç¿ëÀÚ È¯°æ ¼³Á¤À» Âü°íÇÏ´Â DefaultMarkerAnnotationAccess¸¦ »ç¿ëÇÕ´Ï´Ù.
protected IAnnotationAccess createAnnotationAccess() { return new DefaultMarkerAnnotationAccess(fAnnotationPreferences); }
°³¿ä ´«±ÝÀÚ¿¡ ¸¶Ä¿¸¦ Ç¥½ÃÇÏ´Â µ¥ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº DefaultMarkerAnnotationAccess ¹× MarkerAnnotationÀÇ ±¸ÇöÀ» Âü°íÇϽʽÿÀ.
´«±ÝÀÚ¿¡ ¾î³ëÅ×À̼ÇÀ» Ç¥½ÃÇÏ´Â °Í À̿ܿ¡ ¼Ò½º Ç¥½Ã±â´Â ÅØ½ºÆ®¿¡ ä»öµÈ ºÒ±ÔÄ¢ÇÑ Ç¥½Ã·Î ¾î³ëÅ×À̼ÇÀ» Ç¥½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù.
TextEditor¿¡¼ ¼Ò½º Ç¥½Ã±âÀÇ ÀÛ¼ºÀ» ´Ù½Ã »ìÆìº¾´Ï´Ù.
protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles) { ... ISourceViewer sourceViewer= new SourceViewer(parent, ruler, fOverviewRuler, isOverviewRulerVisible(), styles); fSourceViewerDecorationSupport= new SourceViewerDecorationSupport(sourceViewer, fOverviewRuler, fAnnotationAccess, sharedColors); configureSourceViewerDecorationSupport(); return sourceViewer; }
Ŭ·¡½º SourceViewerDecorationSupport´Â ÅØ½ºÆ® ¾î³ëÅ×À̼Ç, ä»öµÈ ¿©¹é, ä»öµÈ Ä¿¼ Çà µîÀ» Æ÷ÇÔÇÏ¿© ¼Ò½º Ç¥½Ã±â¿¡ Ç¥½ÃµÈ ´Ù¾çÇÑ µ¥ÄÚ·¹À̼ÇÀ» ó¸®ÇÕ´Ï´Ù. ÀÌ Å¬·¡½º´Â »ç¿ëÀÚÀÇ È¯°æ ¼³Á¤ º¯°æ»çÇ×ÀÇ µ¿ÀûÀÎ °»½Å¿¡ ÀÀ´äÇÒ ¼ö ÀÖµµ·Ï »ç¿ëÀÚÀÇ È¯°æ ¼³Á¤°ú ÇÔ²² ±¸¼ºµË´Ï´Ù. ´ëºÎºÐÀÇ ÆíÁý±â´Â ÀÌ·¯ÇÑ µ¥ÄÚ·¹À̼ÇÀÇ Ã¤»ö ¹æ½ÄÀ» ¼¼ºÎÀûÀ¸·Î »ó°üÇÒ Çʿ䰡 ¾ø½À´Ï´Ù. (ÇÊ¿äÇÑ °æ¿ì SourceViewerDecorationSupport ¹× AnnotationPainter¿Í °°Àº °ü·Ã Ŭ·¡½º¸¦ ÂüÁ¶ÇϽʽÿÀ! ) SourceViewer ¹× À̸¦ Áö¿øÇÏ´Â SourceViewerDecorationSupport°¡ ¿Ã¹Ù¸£°Ô ±¸¼ºµÇµµ·Ï »ç¿ëÇÒ ¼ö ÀÖ´Â µ¥ÄÚ·¹À̼ÇÀÌ ¹«¾ùÀÎÁö ¾Ë¾Æ¾ß ÇÕ´Ï´Ù.
µ¥ÄÚ·¹ÀÌ¼Ç Áö¿øÀ» À§ÇØ TextEditor¿¡¼ »ç¿ëÇÏ´Â ±¸¼ºÀ» »ìÆìº¾´Ï´Ù.
protected void configureSourceViewerDecorationSupport() { Iterator e= fAnnotationPreferences.getAnnotationPreferences().iterator(); while (e.hasNext()) fSourceViewerDecorationSupport.setAnnotationPreference((AnnotationPreference) e.next()); fSourceViewerDecorationSupport.setAnnotationPainterPreferenceKeys(DefaultMarkerAnnotationAccess.UNKNOWN, UNKNOWN_INDICATION_COLOR, UNKNOWN_INDICATION, UNKNOWN_INDICATION_IN_OVERVIEW_RULER, 0); fSourceViewerDecorationSupport.setCursorLinePainterPreferenceKeys(CURRENT_LINE, CURRENT_LINE_COLOR); fSourceViewerDecorationSupport.setMarginPainterPreferenceKeys(PRINT_MARGIN, PRINT_MARGIN_COLOR, PRINT_MARGIN_COLUMN); fSourceViewerDecorationSupport.setSymbolicFontName(getFontPropertyPreferenceKey()); }
¾î³ëÅ×ÀÌ¼Ç È¯°æ ¼³Á¤Àº »ç¿ëÀÚ È¯°æ ¼³Á¤¿¡ Ç¥½ÃµÈ ¸ðµç ¾î³ëÅ×À̼ǿ¡ ´ëÇÑ ¾î³ëÅ×ÀÌ¼Ç À¯ÇüÀ» Á¤ÀÇÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. ¿©±â¿¡´Â Ç÷¯±×Àο¡¼ Á¦°øÇÏ´Â ¾î³ëÅ×À̼ÇÀÌ Æ÷ÇԵǸç Workbench Á¦°ø ¾î³ëÅ×À̼ÇÀ¸·Î Á¦ÇѵÇÁö ¾Ê½À´Ï´Ù. ÆíÁý±â¿¡ »ç¿ë °¡´ÉÇÑ ¾î³ëÅ×À̼ÇÀ» ÀϺθ¸ Ç¥½ÃÇÏ·Á¸é ÀÌ ¸Þ¼Òµå¸¦ ´ëüÇÏ¿© Ç¥½ÃÇÏ·Á´Â À¯Çü¸¸ »ç¿ëÇÏ¿© SourceViewerDecorationSupport¸¦ ¼³Á¤ÇØ¾ß ÇÕ´Ï´Ù.