West Farm
          吾本布衣,生于川北,躬耕于代碼的田地上。
          posts - 16,  comments - 15,  trackbacks - 0

          import java.util.ArrayList;
          import java.util.Arrays;
          import java.util.List;

          import org.eclipse.core.databinding.observable.value.IObservableValue;
          import org.eclipse.jface.databinding.swt.SWTObservables;
          import org.eclipse.swt.SWT;
          import org.eclipse.swt.custom.LineStyleEvent;
          import org.eclipse.swt.custom.LineStyleListener;
          import org.eclipse.swt.custom.StyleRange;
          import org.eclipse.swt.custom.StyledText;
          import org.eclipse.swt.custom.VerifyKeyListener;
          import org.eclipse.swt.events.TraverseEvent;
          import org.eclipse.swt.events.TraverseListener;
          import org.eclipse.swt.events.VerifyEvent;
          import org.eclipse.swt.graphics.Color;
          import org.eclipse.swt.layout.FillLayout;
          import org.eclipse.swt.widgets.Composite;
          import org.eclipse.wb.swt.SWTResourceManager;

          /**
           * 關鍵字高亮編輯器。This class is a simple customized widget that wrappes a  {
          @link org.eclipse.swt.custom.StyledText StyledText}. 
           * It consumes a keyword array and highlight them.
           * 
          @author ggfan@amarsoft
           *
           
          */
          public class KeywordsHighlightingEditor extends Composite{
              
              
          private Color color = SWTResourceManager.getColor(SWT.COLOR_BLUE);
              
              
          private Color variableColor = SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN);

              
          private String[] keywords;
              
              
          private StyledText st;
              
              
          public void setKeywordsColor(Color color){
                  
          this.color = color;
              }
              
              
          public void setKeywordsBgColor(Color color){
              
              }
              
              
          public IObservableValue observerContent(){
                  
          return SWTObservables.observeText(st, SWT.Modify);
              }

              
          public KeywordsHighlightingEditor(Composite parent, String[] keywords) {
                  
          super(parent, SWT.NONE);
                  
          this.keywords = keywords;
                  
          this.setLayout(new FillLayout());
                  st 
          = new StyledText(this, SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
                  
          // 禁止回車鍵換行
                  st.addVerifyKeyListener(new VerifyKeyListener(){
                      
          public void verifyKey(VerifyEvent event) {
                          
          if(event.keyCode == SWT.CR){
                              event.doit 
          = false;
                          }
                      }
                  });
                  
          // Tab鍵失去焦點而不是插入制表符
                  st.addTraverseListener(new TraverseListener(){
                      
          public void keyTraversed(TraverseEvent e) {
                          
          if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
                              e.doit 
          = true;
                          }
                      }
                  });
                  st.addLineStyleListener(
          new SQLSegmentLineStyleListener());
              }
              
              
          private class SQLSegmentLineStyleListener implements LineStyleListener {

                  @Override
                  
          public void lineGetStyle(LineStyleEvent event) {
                      
          if(keywords == null || keywords.length == 0){
                          
          return;
                      }
                      List
          <StyleRange> styles = new ArrayList<StyleRange>();
                      
          int start = 0;
                      
          int length = event.lineText.length();
                      
          while (start < length) {
                          
          if (Character.isLetter(event.lineText.charAt(start))) {
                              StringBuffer buf 
          = new StringBuffer();
                              
          int i = start;
                              
          for (; i < length && Character.isLetter(event.lineText.charAt(i)); i++) {
                                  buf.append(event.lineText.charAt(i));
                              }
                              
          if(Arrays.asList(keywords).contains(buf.toString())) {
                                  styles.add(
          new StyleRange(event.lineOffset + start, i - start, color, null, SWT.BOLD));
                              }
                              start 
          = i;
                          }
          else if (event.lineText.charAt(start) == '#') {
                              StringBuffer buf 
          = new StringBuffer();
                              buf.append(
          '#');
                              
          int i = start + 1;
                              
          for (; i < length && Character.isLetter(event.lineText.charAt(i)); i++) {
                                  buf.append(event.lineText.charAt(i));
                              }
                              
          if(buf.toString().matches("#[a-zA-Z]+\\d?")) {
                                  styles.add(
          new StyleRange(event.lineOffset + start, i - start, variableColor, null, SWT.NORMAL));
                              }
                              start 
          = i;
                          }
                          
          else{
                              start 
          ++;
                          }
                      }
                      event.styles 
          = (StyleRange[]) styles.toArray(new StyleRange[0]);
                  }

              }
              
          }
          posted on 2011-10-12 10:42 West Farmer 閱讀(935) 評論(0)  編輯  收藏 所屬分類: Eclipse-RCP

          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 日喀则市| 海淀区| 凉城县| 鄂尔多斯市| 彰化市| 安泽县| 台南市| 特克斯县| 盐源县| 类乌齐县| 巴塘县| 徐闻县| 沂源县| 怀仁县| 册亨县| 新乡县| 灯塔市| 遂宁市| 抚顺市| 衡南县| 怀柔区| 抚州市| 当雄县| 新泰市| 鲜城| 普陀区| 钦州市| 图片| 和平区| 安义县| 三明市| 理塘县| 牟定县| 宣威市| 噶尔县| 增城市| 富阳市| 县级市| 隆昌县| 莲花县| 阿合奇县|