麻豆传媒视频在线,国产91精品不卡视频,欧美jizz19性欧美,污视频网站在线观看,91涩漫在线观看,伊人发布在线,九色porny丨首页在线,福利视频一区,久久av网址,久久人人视频

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > JFace Text Editor完全掌握之終極指南(4)

JFace Text Editor完全掌握之終極指南(4)
2010-01-14 23:09:22  作者:  來源:

錯誤標識(Error Marking)
Error Marking用來對編輯的文檔根據一定的規則進行驗證,比如對于XML文檔來說,可能是XML DTD或者XML Schema.其實現跟內容大綱比較類似,首先在解析文檔的時候對error加以標識.這里我們使用了SAX ErrorHandler來收集和定位所有的error, 接著在生成內容大綱的同時進行驗證和error marking,這個工作在文檔被加載和文檔保存的時候都會進行.

Support for error marking in the enhanced XML editor 
在XMLEditor的validateAndMark()方法中完成對error marking的初始化:

 

java 代碼
 
  1. protected void validateAndMark()   
  2. {   
  3.   
  4.     IDocument document = getInputDocument();   
  5.     MarkingErrorHandler markingErrorHandler =    
  6.      new MarkingErrorHandler(getInputFile(), document);   
  7.     markingErrorHandler.removeExistingMarkers();   
  8.   
  9.     XMLParser parser = new XMLParser();   
  10.     parser.setErrorHandler(markingErrorHandler);   
  11.   
  12.     String text = document.get();   
  13.     parser.doParse(text);   
  14.   
  15. }  

MarkingErrorHandler的實例化需要兩個參數:一個是IFile實例,用來執行marking(Eclipse Marker API將通過IFile來引用底層的Resource對象),另一個是編輯的IDocument實例(用來確定插入到文檔中的marker的位置)

在文檔被解析之前,已有的error marker都必須先清掉, 在解析文檔的時候如果發現錯誤,將調用MarkingErrorHandler的handleError()方法:

java 代碼
 
  1. protected void handleError(SAXParseException e, boolean isFatal)   
  2. {   
  3.   
  4.     int lineNumber = e.getLineNumber();   
  5.     int columnNumber = e.getColumnNumber();   
  6.   
  7.     Map map = new HashMap();   
  8.     MarkerUtilities.setLineNumber(map, lineNumber);   
  9.     MarkerUtilities.setMessage(map, e.getMessage());   
  10.     map.put(IMarker.MESSAGE, e.getMessage());   
  11.     map.put(IMarker.LOCATION, file.getFullPath().toString());   
  12.   
  13.     Integer charStart = getCharStart(lineNumber, columnNumber);   
  14.     if (charStart != null)   
  15.         map.put(IMarker.CHAR_START, charStart);   
  16.   
  17.     Integer charEnd = getCharEnd(lineNumber, columnNumber);   
  18.     if (charEnd != null)   
  19.         map.put(IMarker.CHAR_END, charEnd);   
  20.   
  21.     map.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR));   
  22.   
  23.     try  
  24.     {   
  25.         MarkerUtilities.createMarker(file, map, ERROR_MARKER_ID);   
  26.     }   
  27.     catch (CoreException ee)   
  28.     {   
  29.         ee.printStackTrace();   
  30.     }   
  31. }   
  32.   

這里我們的編輯器通過XML解析器(Xerces)不僅取得了error信息,而且還得到了發生錯誤的位置信息,因此上面的代碼看起來非常的清晰:首先取得錯誤信息的行號和列號,然后使用Eclipse Marker API創建一個Error Marker

內容輔助
最后我們將要介紹的一個功能是內容輔助, 下圖是我們的實現效果, 這里我們只是一個簡單的實現,對于一個商業的XML編輯器來說,更強悍的就是能夠根據當前光標的位置以及定義的DTD做更精確的內容輔助

Support for content assist in the enhanced XML editor 

為了讓我們的內容輔助功能做的更智能,我們需要知道當前文檔的結構以及當前光標在文檔結構中的位置

跟其他功能類似,內容輔助功能也是通過SourceViewerConfiguration來提供的,下面是我們的實現代碼:

java 代碼
 
  1. public IContentAssistant getContentAssistant(ISourceViewer sourceViewer)   
  2. {   
  3.   
  4.     ContentAssistant assistant = new ContentAssistant();   
  5.   
  6.     IContentAssistProcessor tagContentAssistProcessor    
  7.         = new TagContentAssistProcessor(getXMLTagScanner());   
  8.     assistant.setContentAssistProcessor(tagContentAssistProcessor,   
  9.             XMLPartitionScanner.XML_START_TAG);   
  10.     assistant.enableAutoActivation(true);   
  11.     assistant.setAutoActivationDelay(500);   
  12.     assistant.setProposalPopupOrientation(IContentAssistant.CONTEXT_INFO_BELOW);   
  13.     assistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_BELOW);   
  14.     return assistant;   
  15.   
  16. }   
  17.   

上面的代碼比較簡單,首先創建一個ContentAssistant實例,然后設置一些UI屬性,這里主要注意IContentAssistProcessor的實現,我們實現的內容輔助只是針對節點,而且內容輔助也是建立在對編輯文檔的分割處理的基礎上.分割處理我們前面已經講的夠多了,這里我們就不再做說明

內容輔助的UI處理都在ContentAssistant中實現,一般情況下我們不需要子類化,除非當前的功能無法滿足我們的要求

內容輔助的智能之處主要體現IContentAssistProcessor的實現上,而一般我們最感興趣的就是ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset);方法,內容輔助的提示內容列表就是在該方法中提供,這里是我們的代碼實現:

java 代碼
 
  1. public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset)   
  2. {   
  3.   
  4.     IDocument document = viewer.getDocument();   
  5.     boolean isAttribute = isAttribute(offset, document);   
  6.   
  7.     TextInfo currentText = currentText(document, offset);   
  8.   
  9.     if (!isAttribute)   
  10.     {   
  11.   
  12.         List allElements = dtdTree.getAllElements();   
  13.   
  14.         ICompletionProposal[] result = new ICompletionProposal[allElements.size()];   
  15.         int i = 0;   
  16.         for (Iterator iter = allElements.iterator(); iter.hasNext();)   
  17.         {   
  18.             XMLElement element = (XMLElement) iter.next();   
  19.             String name = element.getName();   
  20.   
  21.             String text = "" + name + ">" + "</" + name + ">";   
  22.             }   
  23.   
  24.             result[i++] = new CompletionProposal(text,    
  25.              currentText.documentOffset,    
  26.              currentText.text.length(),    
  27.              text.length());   
  28.   
  29.         }   
  30.         return result;   
  31.   
  32.     }   
  33.     else  
  34.     {   
  35.   
  36.         List allAttributes = dtdTree.getAllAttributes();   
  37.   
  38.         ICompletionProposal[] result = new ICompletionProposal[allAttributes.size()];   
  39.         int i = 0;   
  40.         for (Iterator iter = allAttributes.iterator(); iter.hasNext();)   
  41.         {   
  42.             String name = (String) iter.next();   
  43.   
  44.             String text = name + "= \"\" ";   
  45.                
  46.             result[i++] = new CompletionProposal(text,    
  47.              currentText.documentOffset,    
  48.              currentText.text.length(),    
  49.              text.length());   
  50.         }   
  51.         return result;   
  52.     }   
  53.   
  54. }   
  55.   

上面的代碼非常的簡單,首先根據當前位置是否為屬性,是則列出已知的所有屬性名,否則列出所有的節點名.
當然這里我們的做法非常簡單,更高級的實現是對整個文檔進行掃描來確定當前光標在整個文檔結構中所處的位置, 然后使用DTD驗證計算當前需要提示的更精確的內容列表, 這就需要根據DTD來理解我們的文檔

總結
構建一個強大的文本編輯器在Eclipse插件開發中常常會碰到, 而JFace Text Editor是我們展開工作的基礎, 它是Eclipse非常強大,非常重要的一套API, 同時也是非常復雜的一套API.
這里我們從Eclipse PDE提供的XML Editor向導例子入手,通過對其進行擴展, 演示了高亮顯示, 內容格式化, 內容大綱, 錯誤標記, 內容輔助幾個功能的實現, 希望這篇文章對你來實現自己強大的文本編輯器能有所幫助


安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
在线免费av电影| 国产精品videossex| 国产免费一区视频观看免费 | 国产精品视频久久| 国产精品久久77777| 国产精品成人观看视频国产奇米| 久久久久国色av免费观看性色| 欧美成人中文字幕| 亚州欧美日韩中文视频| 国产精品网站视频| 黄色三及免费看| 99re6热在线精品视频播放| 中文字幕毛片| 91av资源在线| 男人av在线播放| 久久精品一级| 久久不见久久见中文字幕免费| 成人免费在线播放| 伊人久久综合| 紧缚奴在线一区二区三区| 国产成人免费xxxxxxxx| 91美女蜜桃在线| 亚洲精品免费在线| 欧美自拍丝袜亚洲| 亚洲福利在线视频| 欧美精品在线免费播放| 国产精品日韩欧美综合| 神马久久精品| 日韩深夜视频| 国产欧美一区| 亚洲欧美日韩国产一区二区| 成人激情综合网| 国产日韩欧美精品一区| 韩日在线视频| 婷婷久久综合九色综合伊人色| 91青娱乐在线视频| 国产精品五区| 亚洲瘦老头同性70tv| 麻豆tv免费在线观看| 91精品国产高清一区二区三区 | 欧美午夜网站| 欧美一区一区| 色综合色综合| 精品在线亚洲视频| 中文字幕一区二区三区在线观看 | av毛片在线| 日本午夜免费一区二区| 精品美女在线视频| 久久电影国产免费久久电影 | 亚洲国产精品久久一线不卡| 欧美电影一区二区三区| 久久久91精品国产| 天堂男人av| 欧美激情网站| 黑人操亚洲人| 韩国av一区二区三区在线观看| 国产偷国产偷精品高清尤物 | 欧美日韩精品在线| 精品视频中文字幕| 国产精品一区电影| 1024在线播放| 亚洲第一二三区| 蜜臀久久99精品久久久久久9| 18涩涩午夜精品.www| 日韩亚洲欧美一区二区三区| 91精品国产成人www| 欧美女优在线观看| 美国十次综合久久| 国产免费成人| 玛雅亚洲电影| 伊人精彩视频| 国产精品粉嫩| 99riav1国产精品视频| 久久精品亚洲一区二区三区浴池| 色婷婷久久久久swag精品| 亚洲色图欧洲色图婷婷| 亚洲精品v欧美精品v日韩精品| 国产精品第100页| 成人黄色动漫| 在线视频免费在线观看一区二区| 亚洲精品小区久久久久久| 国模一区二区三区白浆| 色综合欧美在线视频区| 国模精品系列视频| 在线观看中文字幕的网站| 性欧美孕妇孕交| 91精品尤物| 懂色av中文字幕一区二区三区| 欧美视频一区二区三区在线观看| 欧美激情xxxxx| 91探花在线观看| 亚洲黄页一区| 午夜精品一区二区三区电影天堂 | jizz一区二区三区| 精品96久久久久久中文字幕无| 亚洲免费高清视频在线| 欧美成aaa人片免费看| av免费在线网站| 91精品天堂福利在线观看| 国产精品毛片久久久久久久| 国产一区二区三区三区在线观看 | 国产66精品| 岛国av在线一区| 日韩经典中文字幕| 国产香蕉视频在线看| 九九综合在线| 国产精品国模大尺度视频| 久久夜色精品亚洲噜噜国产mv | 欧美人与动牲性行为| 国产精品激情电影| 国产成人综合一区二区三区| 黄色的视频在线观看| 午夜在线播放视频欧美| 欧美最猛黑人xxxxx猛交| 国产在线久久久| 日韩中文字幕在线一区| 93久久精品日日躁夜夜躁欧美| 国产亚洲精品久久久久动| 日本电影在线观看网站| 欧美精品一卡| 欧美男生操女生| 国产一二三区在线视频| 夜夜爽av福利精品导航| 欧美一二三四在线| a免费在线观看| 国产精品伊人色| 久久夜色精品国产| 高清久久精品| 亚洲精品美腿丝袜| www 四虎| 欧美在线三区| 日韩精品一区二区三区中文精品| 91在线免费看| 精品一区二区精品| 久久艳片www.17c.com| 视频一区中文字幕精品| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美日本在线播放| 国产中文在线观看| 婷婷激情综合| 欧美在线观看视频在线| 日韩av色综合| 手机在线电影一区| 日本高清无吗v一区| 性感美女激情视频在线观看| 午夜精品久久99蜜桃的功能介绍| 色综合咪咪久久| 性开放的欧美大片| 蜜臀91精品一区二区三区| 亚洲男人第一网站| 欧美一区 二区 三区| 国产一区二区精品久久91| 欧美精品xxx| 卡一精品卡二卡三网站乱码| 一级做a爱片久久| 人成网站免费观看| 欧美国产三级| 亚洲免费影视第一页| 成人午夜sm精品久久久久久久| 99热精品国产| 久久久久久久久综合| 国产乱人伦丫前精品视频| 91黄色免费版| 日韩伦理在线电影| va亚洲va日韩不卡在线观看| 久久久最新网址| 深爱激情综合网| 日韩欧美一区视频| 主播国产精品| 久久久噜噜噜久久人人看| 91精品国产综合久久香蕉的用户体验| 日韩影院二区| 一区二区日韩精品| 欧美男男freegayvideosroom| 日韩欧美在线观看| 久草免费在线| 国产一区二区三区黄视频| 国产精品久久久久久搜索| 欧美二区视频| 亚洲视频专区在线| 欧美日韩麻豆| 在线观看视频欧美| 欧美最新精品| 欧美日韩国产丝袜另类| av免费在线免费| 欧美国产日韩一二三区| 日韩大胆人体| 国产精品亚洲午夜一区二区三区| 91精品国产乱码久久久久久久久 | 日本美女一区二区| 欧美极品美女视频网站在线观看免费 | 国产乱码精品一区二区三区av| 韩剧1988在线观看免费完整版| 日本精品黄色| 亚洲少妇激情视频| 亚洲欧美日本国产| 亚洲日本欧美中文幕| 欧美男男gaytwinkfreevideos| 日韩精品综合一本久道在线视频| 日韩城人网站|