¹®¼­ ¹× ÆÄƼ¼Ç

Ç÷§Æû ÅØ½ºÆ® ÇÁ·¹ÀÓ¿öÅ©´Â ÅØ½ºÆ®ÀÇ ¹®¼­ ¸ðµ¨À» Á¤ÀÇÇϰí ÀÌ ¸ðµ¨À» »ç¿ëÇÏ¿© ÅØ½ºÆ®¸¦ Ç¥½ÃÇϴ ǥ½Ã±â¸¦ Á¦°øÇÕ´Ï´Ù. Java ÆíÁý±â ¿¹Á¦ ¹× ÀÌ ¸ðµ¨¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» »ìÆìº¸´Â °ÍÀ¸·Î ½ÃÀÛÇÕ´Ï´Ù. org.eclipse.ui.editors¸¦ ³íÇÑ Àý¿¡¼­ ÀÌ¹Ì »ìÆìº¸¾ÒÀ¸¹Ç·Î, ÆíÁý±â È®ÀåÀ» µî·ÏÇÏ´Â ±âº» ±â¼ú¿¡ ´ëÇØ¼­´Â ´Ù·çÁö ¾Ê°Ú½À´Ï´Ù. ´ë½Å, ¿¹Á¦¿¡¼­ ÆíÁý±â Ŭ·¡½º°¡ ±¸ÇöµÇ´Â ¹æ¹ý¿¡ ´ëÇÑ ¼¼ºÎ»çÇ×À» »ìÆìº¸°Ú½À´Ï´Ù.

¹®¼­ Á¦°øÀÚ ¹× ¹®¼­

Workbench¿¡¼­´Â, »ç¿ëÀÚ°¡ µµ¸ÞÀÎ ¿ä¼Ò(¿¹: ÆÄÀÏ ¶Ç´Â ¾ÆÄ«ÀÌºê ÆÄÀÏ¿¡ ÀúÀåµÈ ¿ä¼Ò)¸¦ ¼±ÅÃÇϰí ÀÌ ¿ä¼Ò¸¦ ¿­¸é ÀϹÝÀûÀ¸·Î ÆíÁý±â°¡ ¿­¸³´Ï´Ù. ÆíÁý±â ÀÛ¼º ½Ã ÀÌ ÆíÁý±â´Â ÆíÁý ÁßÀÎ ¿ÀºêÁ§Æ®¸¦ ¼³¸íÇÏ´Â ÆíÁý±â ÀÔ·Â(IEditorInput)°ú ¿¬°üµË´Ï´Ù.

"*.jav" È®ÀåÀÚ¸¦ °¡Áø ÆÄÀÏÀ» ¿­ ¶§ Java ÆíÁý±â ¿¹Á¦°¡ ¿­¸³´Ï´Ù. ÀÌ·± °æ¿ì ÆíÁý±âÀÇ ÀÔ·ÂÀº IFileEditorInputÀÔ´Ï´Ù. Ç÷§Æû ÅØ½ºÆ® ÇÁ·¹ÀÓ¿öÅ©´Â ÆíÁý±â ÀÔ·Â ÀÚü¿¡ ´ëÇØ¼­´Â °ÅÀÇ °í·ÁÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ ÇÁ·¹ÀÓ¿öÅ©´Â È¿À²ÀûÀ¸·Î ÅØ½ºÆ®¸¦ Ç¥½ÃÇϰí Á¶ÀÛÇÒ ¼ö ÀÖµµ·Ï IDocument¶ó°í ÇÏ´Â ÀÔ·ÂÀÇ ÇÁ¸®Á¨Å×ÀÌ¼Ç ¸ðµ¨°ú ÇÔ²² ÀÛµ¿ÇÕ´Ï´Ù.

Áï, ¿¹»óµÈ µµ¸ÞÀÎ ¸ðµ¨(ÆíÁý±â ÀÔ·Â)¿¡¼­ ÇÁ¸®Á¨Å×ÀÌ¼Ç ¸ðµ¨·Î ¸ÊÇÎÇÒ ¹æ¹ýÀÌ ÀÖÀ½À» ÀǹÌÇÕ´Ï´Ù. ÀÌ ¸ÊÇÎÀº IDocumentProvider¿¡¼­ Á¤Àǵ˴ϴÙ. ÆíÁý±â ÀÔ·ÂÀÌ ÀÖ´Â °æ¿ì ¹®¼­ Á¦°øÀÚ´Â ÀûÀýÇÑ IDocument¸¦ ¸®ÅÏÇÕ´Ï´Ù.

Java ÆíÁý±â ¿¹Á¦´Â Ç÷¯±×ÀÎ org.eclipse.ui.editors¿¡¼­ Á¤ÀÇÇÏ´Â TextFileDocumentProvider¸¦ »ó¼ÓÇÕ´Ï´Ù. È®Àå org.eclipse.ui.editors.documentProviders´Â ÆíÁý±â ÀÔ·Â À¯Çü(¶Ç´Â ÆÄÀÏ È®ÀåÀÚ)°ú ¹®¼­ Á¦°øÀÚ °£ ¸ÊÇÎÀ» Á¤ÀÇÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. ÆíÁý±â Ç÷¯±×ÀÎÀº ÇØ´ç ¹®¼­ Á¦°øÀÚ¸¦ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÕ´Ï´Ù.

   <extension
         point="org.eclipse.ui.editors.documentProviders">
<provider
            class="org.eclipse.ui.editors.text.TextFileDocumentProvider"
            inputTypes="org.eclipse.ui.IStorageEditorInput"
            id="org.eclipse.ui.editors.text.StorageDocumentProvider">
   </provider>
   </extension>   

ÀÌ È®ÀåÁ¡À» »ç¿ëÇϸé Ç÷¯±×ÀÎÀÌ ¹®¼­ Á¦°øÀÚ¸¦ µî·ÏÇϰí À̸¦ ÆÄÀÏ È®ÀåÀÚ ¶Ç´Â ÆíÁý±â ÀԷ Ŭ·¡½º¿Í ¿¬°ü½Ãų ¼ö ÀÖ½À´Ï´Ù. Java ÆíÁý±â ¿¹Á¦´Â °íÀ¯ ¹®¼­ Á¦°øÀÚ È®ÀåÀ» Á¤ÀÇÇÏÁö ¾ÊÀ¸¹Ç·Î IStorageEditorInputÀÎ ¸ðµç ÀÔ·Â À¯Çü¿¡ ÁöÁ¤µÈ ÀÏ¹Ý ¹®¼­ Á¦°øÀÚ¸¦ »ó¼ÓÇÕ´Ï´Ù. »ç¿ëÀÚ°¡ ÆíÁýÇϱâ À§ÇØ ÆÄÀÏÀ» ¿­ ¶§ Ç÷§ÆûÀº ÀûÀýÇÑ ¹®¼­ Á¦°øÀÚ ÀνºÅϽº¸¦ ÀÛ¼ºÇÏ´Â ¼¼ºÎ»çÇ×À» °ü¸®ÇÕ´Ï´Ù. ƯÁ¤ ¹®¼­ Á¦°øÀÚ°¡ ÆÄÀÏ È®ÀåÀÚ¿¡ ´ëÇØ µî·ÏµÉ °æ¿ì ÀÌ ¹®¼­ Á¦°øÀÚ°¡ »ç¿ëµË´Ï´Ù. ÆÄÀÏ È®ÀåÀÚ¿¡ ´ëÇÑ Æ¯Á¤ ¹®¼­ Á¦°øÀÚ°¡ ¾øÀ» °æ¿ì ÆíÁý±â ÀÔ·Â À¯ÇüÀÌ ÀûÀýÇÑ Á¦°øÀÚ¸¦ ã´Â µ¥ »ç¿ëµË´Ï´Ù.

Java ÆíÁý±â ¿¹Á¦´Â ÀÏ¹Ý Ç÷§Æû ¹®¼­ Á¦°øÀÚ¸¦ »ç¿ëÇÏ¿© ÆÄÀÏ ¹öÆÛ¸µ ¹× ±âŸ ÃÖÀûÈ­¿Í °°Àº ¹®¼­ Á¦°øÀÚÀÇ ¸ðµç ±â´ÉÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

¹®¼­ ¼³Á¤

Java ÆíÁý±â°¡ Ç÷§Æû ÅØ½ºÆ® ¹®¼­ Á¦°øÀÚ¸¦ »ç¿ëÇÒ °æ¿ì Java ÆÄÀÏÀ» ó¸®Çϱâ À§ÇÑ Æ¯¼ö ÀÛµ¿À» ¾î¶»°Ô Á¦°øÇÒ ¼ö ÀÖ½À´Ï±î?

È®Àå org.eclipse.core.filebuffers.documentSetupÀº ÆÄÀÏ È®ÀåÀÚ¿Í IDocumentSetupParticipant°£ ¸ÊÇÎÀ» Á¤ÀÇÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù. ¼³Á¤ Âü¿©ÀÚ°¡ ÆíÁý±â¿¡ Á¦°øµÇ¸é ¼³Á¤ Âü¿©ÀÚ´Â ¹®¼­¿¡ ¸ðµç Ư¼ö ±â´ÉÀ» ¼³Á¤ÇÕ´Ï´Ù.

<extension
	id="ExampleJavaDocumentSetupParticipant"
	name="%documentSetupParticipantName"
	point="org.eclipse.core.filebuffers.documentSetup">
	<participant
		extensions="jav"
		class="org.eclipse.ui.examples.javaeditor.JavaDocumentSetupParticipant">
	</participant>
   </extension>   

ÀÌ È®Àå Á¤ÀÇ´Â Java ƯÁ¤ Ÿ½ºÅ©¿¡ ¹®¼­¸¦ ¼³Á¤ÇÒ ±âȸ¸¦ ¿¹Á¦¿¡ Á¦°øÇÕ´Ï´Ù. ±×·¯¸é JavaDocumentSetupParticipant°¡ ¼öÇàÇÏ´Â °ÍÀº ¹«¾ùÀԴϱî? ÀÌÁ¦ ¼³Á¤ ¸Þ¼ÒµåÀÇ ´Ü¼øÈ­µÈ ¹öÀüÀ» »ìÆì º¸°Ô µË´Ï´Ù.

 	public void setup(IDocument document) {
		...
		IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);
		partitioner.connect(document);
		...
	}

¼³Á¤ ÄÚµå´Â ÆÄƼ¼Å³Ê¶ó´Â ¿ÀºêÁ§Æ®¸¦ ±¸¼ºÇÕ´Ï´Ù.

ÆÄƼ¼Ç

ÆÄƼ¼Å³Ê(IDocumentPartitioner)´Â ¹®¼­¸¦ ÆÄƼ¼ÇÀ̶ó´Â °ãÄ¡Áö ¾Ê´Â ¿µ¿ªÀ¸·Î ºÐ¸®ÇÕ´Ï´Ù.  ÆÄƼ¼Ç(ITypedRegionÀÌ ³ªÅ¸³»´Â)Àº ±¸¹® °­Á¶Ç¥½Ã ¶Ç´Â Çü½Äȭó·³ ±â´É°ú °ü·ÃÇÏ¿© ¹®¼­ÀÇ ´Ù¸¥ ¼½¼ÇÀ» ´Ù¸£°Ô ó¸®ÇÏ´Â µ¥ À¯¿ëÇÕ´Ï´Ù.

Java ÆíÁý±â ¿¹Á¦ÀÇ °æ¿ì ¹®¼­´Â javadoc ÁÖ¼®, º¹¼ö Çà ÁÖ¼® µîÀ» ³ªÅ¸³»´Â ÆÄƼ¼ÇÀ¸·Î ºÐ¸®µË´Ï´Ù. °¢ ¿µ¿ªÀº ÄÁÅÙÃ÷ À¯Çü ¹× ¹®¼­ÀÇ ÇØ´ç À§Ä¡¿¡ ÁöÁ¤µË´Ï´Ù. À§Ä¡´Â »ç¿ëÀÚ ÆíÁý ÅØ½ºÆ®·Î °»½ÅµË´Ï´Ù.

±ÔÄ¢ ±â¹Ý ¹®¼­ ÆÄƼ¼Å´×

¹®¼­ ÆÄƼ¼Å³à¿¡ ´ëÇÑ ÀûÀýÇÑ ±¸ÇöÀ» ÆÇº°ÇÏ´Â °ÍÀº °¢ ÆíÁý±â¿¡ ´Þ·Á ÀÖ½À´Ï´Ù. ±ÔÄ¢ ±â¹Ý ¹®¼­ ½ºÄ³´×À» À§ÇÑ Áö¿øÀº org.eclipse.jface.text.rules¿¡ Á¦°øµË´Ï´Ù. ±ÔÄ¢ ±â¹Ý ±â¹Ý ½ºÄ³³Ê¸¦ »ç¿ëÇÏ¸é ÆíÁý±â´Â ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ Á¦°øÇÏ´Â FastPartitioner¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);

RuleBasedPartitionScanner´Â ±ÔÄ¢ ±â¹Ý ½ºÄ³³ÊÀÇ ¼öÆÛŬ·¡½ºÀÔ´Ï´Ù. ¼­ºêŬ·¡½º´Â ¹®¼­¸¦ ½ºÄµÇÒ ¶§ Çà ºÐ¸®¹®ÀÚ, °ø¹é ¹× ÀÏ¹Ý ÆÐÅÏ µîÀÇ ÅäÅ«À» ±¸º°ÇÏ´Â µ¥ »ç¿ëÇØ¾ß ÇÒ ±ÔÄ¢À» ¿­°ÅÇÏ°í ±¸ÇöÇØ¾ß ÇÕ´Ï´Ù. ¿¹Á¦ÀÇ JavaPartitionScanner´Â ´ÜÀÏÇà ÁÖ¼®, ¹®ÀÚ »ó¼ö, javadoc. º¹¼ö Çà ÁÖ¼® ¹× ´Ü¾î¸¦ ±¸º°ÇÏ´Â µ¥ ÇÊ¿äÇÑ ±ÔÄ¢À» Á¤ÀÇÇÕ´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ½ºÄ³³ÊÀÇ »ý¼ºÀÚ¿¡¼­ À̸¦ ¼öÇàÇÕ´Ï´Ù.

public JavaPartitionScanner() {
	super();
	IToken javaDoc= new Token(JAVA_DOC);
	IToken comment= new Token(JAVA_MULTILINE_COMMENT);

	List rules= new ArrayList();
	// Add rule for single line comments.
	rules.add(new EndOfLineRule("//", Token.UNDEFINED)); 

	// Add rule for strings and character constants.
	rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); 
	rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); 

	// Add special case word rule.
	rules.add(new WordPredicateRule(comment));

	// Add rules for multi-line comments and javadoc.
	rules.add(new MultiLineRule("/**", "*/", javaDoc, (char) 0, true)); 
	rules.add(new MultiLineRule("/*", "*/", comment, (char) 0, true)); 

	IPredicateRule[] result= new IPredicateRule[rules.size()];
	rules.toArray(result);
	setPredicateRules(result);
}

»ç¿ë °¡´ÉÇÑ ±ÔÄ¢ À¯Çü ¹× ±ÔÄ¢À» Á¤ÀÇÇÏ´Â µ¥ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº org.eclipse.jface.text.rulesÀÇ Å¬·¡½º¸¦ ÂüÁ¶ÇϽʽÿÀ. ±¸¹® »ö»óÀ» »ìÆì º¼ ¶§ ½ºÄ³³Ê¸¦ ´Ù½Ã »ìÆì º¸°Ú½À´Ï´Ù.