2013-03-18 7 views
2

RSyntaxTextArea 및 자동 완성 호출을 호출하는 코드를 작성했습니다. 사용자가 기능을 입력하면 단어는 기능 <>로 바뀝니다. 아래 코드에서 "label"이라는 단어를 강조하여 사용자가 이름을 입력해야한다는 것을 알고 싶습니다.RSyntaxTextArea의 ShorthandCompletion 부분 강조 표시

provider.addCompletion(new ShorthandCompletion(provider, "function", "function<Label>","function<Label>")); 

코드는 기본적으로 function을 function으로 대체하고 레이블을 강조 표시하고 사용자가 무언가를 입력 할 때까지 기다리는 대신 계속 진행됩니다. 어떻게해야합니까?

답변

1

ShorthandCompletion 대신 사용할 수있는 TemplateCompletion 클래스가 있습니다. 불행히도 이것은 나를 위해 작동하지 않았다 (AutoCompleteDemo 예제에서 시도).

대체 방법은 CodeTemplateManager을 사용하고 CodeTemplate을 확장하는 것입니다. 다음은 예입니다 (CodeTemplateDemo에서 제공).

먼저 AbstractCodeTemplate 확장 :

import java.io.IOException; 
import java.io.ObjectInputStream; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.Caret; 
import javax.swing.text.Element; 

import org.fife.ui.rsyntaxtextarea.RSyntaxDocument; 
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; 
import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities; 

import org.fife.ui.rsyntaxtextarea.templates.*; 

public class ArtemisCodeTemplate extends StaticCodeTemplate { 

    private static final long serialVersionUID = 1; 

    /** 
    * The code inserted before the caret position. 
    */ 
    private String beforeCaret; 

    /** 
    * The code inserted after the caret position. 
    */ 
    private String afterCaret; 

    /** 
    * Cached value representing whether <code>beforeCaret</code> contains 
    * one or more newlines. 
    */ 
    private transient int firstBeforeNewline; 

    /** 
    * Cached value representing whether <code>afterCaret</code> contains 
    * one or more newlines. 
    */ 
    private transient int firstAfterNewline; 

    private static final String EMPTY_STRING  = ""; 

    /** 
    * Placeholder for the selected keyword 
    */ 
    private String placeholder; 

    /** 
    * Constructor. This constructor only exists to support persistance 
    * through serialization. 
    */ 
    public ArtemisCodeTemplate() { 
    } 


    /** 
    * Constructor. 
    * 
    * @param id The ID of this code template. 
    * @param beforeCaret The text to place before the caret. 
    * @param afterCaret The text to place after the caret. 
    */ 
    public ArtemisCodeTemplate(String id, String beforeCaret, String placeholder, String afterCaret){ 
     super(id, beforeCaret, afterCaret); 
     setPlaceholder(placeholder); 
    } 

    public String getPlaceholder() { 
     return placeholder; 
    } 

    public void setPlaceholder(String text) { 
     this.placeholder = text; 
    } 

    private String getAfterTextIndented(String indent) { 
     return getTextIndented(getAfterCaretText(), firstAfterNewline, indent); 
    } 

    private String getBeforeTextIndented(String indent) { 
     return getTextIndented(getBeforeCaretText(),firstBeforeNewline,indent); 
    } 

    private String getTextIndented(String text,int firstNewline,String indent) { 
     if (firstNewline==-1) { 
      return text; 
     } 
     int pos = 0; 
     int old = firstNewline+1; 
     StringBuffer sb = new StringBuffer(text.substring(0, old)); 
     sb.append(indent); 
     while ((pos=text.indexOf('\n', old))>-1) { 
      sb.append(text.substring(old, pos+1)); 
      sb.append(indent); 
      old = pos+1; 
     } 
     if (old<text.length()) { 
      sb.append(text.substring(old)); 
     } 
     return sb.toString(); 
    } 

    public void invoke(RSyntaxTextArea textArea) throws BadLocationException { 

     Caret c = textArea.getCaret(); 
     int dot = c.getDot(); 
     int mark = c.getMark(); 
     int p0 = Math.min(dot, mark); 
     int p1 = Math.max(dot, mark); 
     RSyntaxDocument doc = (RSyntaxDocument)textArea.getDocument(); 
     Element map = doc.getDefaultRootElement(); 

     int lineNum = map.getElementIndex(dot); 
     Element line = map.getElement(lineNum); 
     int start = line.getStartOffset(); 
     int end = line.getEndOffset()-1; // Why always "-1"? 
     String s = textArea.getText(start,end-start); 
     int len = s.length(); 

     // endWS is the end of the leading whitespace 
     // of the current line. 
     int endWS = 0; 
     while (endWS<len && RSyntaxUtilities.isWhitespace(s.charAt(endWS))) { 
      endWS++; 
     } 
     s = s.substring(0, endWS); 
     p0 -= getID().length(); 
     String beforeText = getBeforeTextIndented(s); 
     String afterText = getAfterTextIndented(s); 
     doc.replace(p0,p1-p0, beforeText+ placeholder + afterText, null); 
     textArea.setCaretPosition(p0+beforeText.length()); 
     textArea.moveCaretPosition(p0+beforeText.length() + placeholder.length()); 
    } 

    private void readObject(ObjectInputStream in) throws ClassNotFoundException, 
               IOException { 
      in.defaultReadObject(); 
      // "Resetting" before and after text to the same values will replace 
      // nulls with empty srings, and set transient "first*Newline" values. 
      setBeforeCaretText(this.beforeCaret); 
      setAfterCaretText(this.afterCaret); 
     } 

    /** 
    * Returns a string representation of this template for debugging 
    * purposes. 
    * 
    * @return A string representation of this template. 
    */ 
    public String toString() { 
     return "[ArtemisCodeTemplate: id=" + getID() + 
      ", text=" + getBeforeCaretText() + "|" + 
       getPlaceholder() + "|" + getAfterCaretText() + "]"; 
    } 


} 

을 그리고 다음에 추가 CodeTemplateManager :

RSyntaxTextArea.setTemplatesEnabled(true); 
    CodeTemplateManager ctm = RSyntaxTextArea.getCodeTemplateManager(); 
    CodeTemplate ct = new ArtemisCodeTemplate("sout", "System.out.println(", "<replaceme>", ");"); 
    ctm.addTemplate(ct); 

당신이 System.out.println(<replaceme>);로 확장됩니다 "SOUT"를 입력하고 Ctrl + Shift + 공간을 명중하는 경우와 <replaceme> 부분이 선택되어 입력 할 수 있습니다.

+0

바로 가기 키를 누르지 않고도 호출 할 수있는 방법을 찾으면 도움이되었습니다. – Artemis

관련 문제