獨自等待
          那曾經從自己身邊溜走的人……
          posts - 0,comments - 3,trackbacks - 0
              前陣子,做了一個表達式編輯器,基于JavaScript語法的,支持表達式語法驗證錯誤提示、內容輔助輸入、語法高亮等,JS語法解析部分采用ANTLR3.0實現,諸如編輯器內容輔助、內容信息裝飾等在網絡上有相當多的文章介紹,google搜索能有一堆,這里就不再敘述了。
              簡單說回本篇文章的主題吧,Undo、Redo功能在代碼編輯器中應該是最基本的也是必備的功能,翻閱了一下SourceViewer的代碼,發現它提供了一個setUndoManager(IUndoManager undoManager) 方法,再詳細的閱讀了下SourceViewer對Undo/Redo部分的相關支持,要實現Undo/Redo功能還是相當簡單方便的,還是閑話少說,貼出代碼片段大家看看就很明白了

          SourceViewer expressionViewer = new SourceViewer(viewerComposite, null
                              SWT.V_SCROLL 
          | SWT.H_SCROLL | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
                      expressionViewer.getTextWidget().setFont(JFaceResources.getFont(JFaceResources.TEXT_FONT));



          //支持99次
          IUndoManager undoManager = new TextViewerUndoManager(99);
                      undoManager.connect(expressionViewer);
                      expressionViewer.setUndoManager(undoManager);
                      
                      Control styleTextWidget 
          = expressionViewer.getTextWidget();
                      expressionViewer.appendVerifyKeyListener(
          new VerifyKeyListener() {
                          
          public void verifyKey(VerifyEvent event) {
                              
          if ((event.stateMask & SWT.CTRL) != 0)
                                  event.doit 
          = false;
                          }

                      }
          );
                      styleTextWidget.addKeyListener(
          new KeyAdapter() {
                          
          public void keyPressed(KeyEvent e) {
                              
          // Only if CTRL was pressed
                              if ((e.stateMask & SWT.CTRL) == 0return;
                              
          int operation = 0;
                              
          if (e.character == ' '{
                                  
          // Ctrl + Spacebar: Content Assist
                                  operation = SourceViewer.CONTENTASSIST_PROPOSALS;
                              }
           else if ((e.character | '\u0040'== 'Z'{
                                  
          // Ctrl + Z: Undo
                                  operation = ITextOperationTarget.UNDO;
                              }
           else if ((e.character | '\u0040'== 'Y'{
                                  
          // Ctrl + Y: Redo
                                  operation = ITextOperationTarget.REDO;
                              }

                              
          // Check if operation is possible
                              if (operation != 0 && expressionViewer.canDoOperation(operation)) 
                                  
          // Perform operation
                                  expressionViewer.doOperation(operation);
                          }

                      }
          );
          大家現在可以試試了,Ctrl+Z Undo; Ctrl+Y Redo
          posted on 2008-09-28 14:41 自由 閱讀(679) 評論(0)  編輯  收藏 所屬分類: Eclipse
          主站蜘蛛池模板: 高唐县| 白朗县| 资阳市| 江山市| 平遥县| 阿克陶县| 汕尾市| 旬邑县| 临城县| 谢通门县| 宜春市| 叙永县| 武功县| 双江| 麦盖提县| 象山县| 黄梅县| 咸丰县| 南宁市| 遂溪县| 常山县| 宁强县| 忻城县| 鄂伦春自治旗| 疏附县| 稻城县| 海林市| 宣武区| 凌云县| 宜兴市| 思茅市| 新巴尔虎左旗| 吉木乃县| 鸡西市| 年辖:市辖区| 西乌珠穆沁旗| 揭阳市| 哈巴河县| 丰台区| 科技| 高尔夫|