亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区

當(dāng)前位置:首頁 > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計(jì)軟件教程 > JFace Text Editor完全掌握之終極指南(4)

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

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

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的實(shí)例化需要兩個參數(shù):一個是IFile實(shí)例,用來執(zhí)行marking(Eclipse Marker API將通過IFile來引用底層的Resource對象),另一個是編輯的IDocument實(shí)例(用來確定插入到文檔中的marker的位置)

在文檔被解析之前,已有的error marker都必須先清掉, 在解析文檔的時候如果發(fā)現(xiàn)錯誤,將調(diào)用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信息,而且還得到了發(fā)生錯誤的位置信息,因此上面的代碼看起來非常的清晰:首先取得錯誤信息的行號和列號,然后使用Eclipse Marker API創(chuàng)建一個Error Marker

內(nèi)容輔助
最后我們將要介紹的一個功能是內(nèi)容輔助, 下圖是我們的實(shí)現(xiàn)效果, 這里我們只是一個簡單的實(shí)現(xiàn),對于一個商業(yè)的XML編輯器來說,更強(qiáng)悍的就是能夠根據(jù)當(dāng)前光標(biāo)的位置以及定義的DTD做更精確的內(nèi)容輔助

Support for content assist in the enhanced XML editor 

為了讓我們的內(nèi)容輔助功能做的更智能,我們需要知道當(dāng)前文檔的結(jié)構(gòu)以及當(dāng)前光標(biāo)在文檔結(jié)構(gòu)中的位置

跟其他功能類似,內(nèi)容輔助功能也是通過SourceViewerConfiguration來提供的,下面是我們的實(shí)現(xiàn)代碼:

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.   

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

內(nèi)容輔助的UI處理都在ContentAssistant中實(shí)現(xiàn),一般情況下我們不需要子類化,除非當(dāng)前的功能無法滿足我們的要求

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

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.   

上面的代碼非常的簡單,首先根據(jù)當(dāng)前位置是否為屬性,是則列出已知的所有屬性名,否則列出所有的節(jié)點(diǎn)名.
當(dāng)然這里我們的做法非常簡單,更高級的實(shí)現(xiàn)是對整個文檔進(jìn)行掃描來確定當(dāng)前光標(biāo)在整個文檔結(jié)構(gòu)中所處的位置, 然后使用DTD驗(yàn)證計(jì)算當(dāng)前需要提示的更精確的內(nèi)容列表, 這就需要根據(jù)DTD來理解我們的文檔

總結(jié)
構(gòu)建一個強(qiáng)大的文本編輯器在Eclipse插件開發(fā)中常常會碰到, 而JFace Text Editor是我們展開工作的基礎(chǔ), 它是Eclipse非常強(qiáng)大,非常重要的一套API, 同時也是非常復(fù)雜的一套API.
這里我們從Eclipse PDE提供的XML Editor向?qū)Ю尤胧?通過對其進(jìn)行擴(kuò)展, 演示了高亮顯示, 內(nèi)容格式化, 內(nèi)容大綱, 錯誤標(biāo)記, 內(nèi)容輔助幾個功能的實(shí)現(xiàn), 希望這篇文章對你來實(shí)現(xiàn)自己強(qiáng)大的文本編輯器能有所幫助


安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区
久久精品国产第一区二区三区最新章节 | 国产成人一区二区三区小说| 国产精品国模在线| 日av中文字幕| 久久草.com| 日本亚洲欧美三级| 91精品视频免费| 人禽交欧美网站免费| 久久久久久艹| 亚洲aa中文字幕| 成人动漫在线观看视频| 国产精品久久久久免费a∨大胸 | 欧洲中文字幕国产精品| 久久全球大尺度高清视频| 伊人色综合久久天天五月婷| 国产日韩欧美精品在线观看| 国产精品免费小视频| 91九色在线观看视频| 亚洲一区二区三区欧美| av在线不卡一区| 欧美日韩国产999| 国产女同一区二区| 欧美日韩不卡合集视频| 欧美日本韩国在线| www.美女亚洲精品| 秋霞成人午夜鲁丝一区二区三区| 久久久久亚洲精品| 日韩免费高清在线观看| 国产成人精品久久亚洲高清不卡 | 成人91免费视频| 一区二区三区四区视频在线观看| 国产日韩专区在线| 在线观看一区欧美| 国产伦精品一区二区三区免费视频| 国产精品黄页免费高清在线观看 | 欧美一区国产一区| 日韩在线观看免费高清| 欧美精品一区二区三区免费播放 | 色大师av一区二区三区| 91福利视频网| 日本a级片在线播放| 国产成人精品一区二区| 精品一区二区三区自拍图片区| 国产精品三区www17con| 国模精品一区二区三区| 久久91精品国产| 日韩女优中文字幕| 久久精品国产免费观看| 免费久久久一本精品久久区| 久久亚洲春色中文字幕| 国产伦精品一区二区三区照片 | 日本精品二区| 国产精品视频中文字幕91| 精品视频免费在线播放| 在线观看av的网址| 久久久com| 免费在线观看日韩视频| 精品丰满人妻无套内射| 97人人爽人人喊人人模波多| 日韩黄色片在线| 精品国偷自产一区二区三区| 97久久精品人搡人人玩| 人妻精品无码一区二区三区| 久久久精品2019中文字幕神马| 精品亚洲第一| 亚洲欧美日韩不卡一区二区三区| 久久久久久九九九九| 国产在线观看91精品一区| 午夜欧美性电影| 国产精品日韩精品| 91久久精品国产91久久| 狠狠噜天天噜日日噜| 亚洲国产另类久久久精品极度 | 激情六月天婷婷| 国产aaa一级片| 久久久噜噜噜久噜久久| 国产欧美一区二区三区在线| 少妇高清精品毛片在线视频 | 国产伦精品一区二区三区免费视频 | 欧美二区在线看| 无码人妻精品一区二区蜜桃百度| 国产精品乱码一区二区三区| 国产成人精品久久| 成人在线精品视频| 黄色一级片播放| 日韩avxxx| 亚洲午夜久久久影院伊人| 久久久国产影院| 国产成人精品免费看在线播放| 国产一区二区片| 欧美一区二区在线| 日韩在线国产| 中文字幕久精品免| 久久精品国产99国产精品澳门| 国产伦精品一区二区三区高清版| 欧美一级淫片播放口| 欧美日韩aaaa| 日韩亚洲精品电影| 久久免费精品视频| 蜜桃传媒视频麻豆第一区免费观看| 一区国产精品| 国产精品网站大全| 精品一区二区日本| 奇米888一区二区三区| 中日韩在线视频| 国产精品欧美日韩| 国产成人精品视| 国产欧美在线一区| 日韩免费av片在线观看| 亚洲一卡二卡| 久久久天堂国产精品女人| 国产欧美精品日韩| 欧美又大粗又爽又黄大片视频| 欧美区二区三区| 日韩色av导航| 久久久最新网址| 俄罗斯精品一区二区| 精品一区二区三区毛片| 日韩免费毛片视频| 日韩av高清| 亚洲精品一区二| 蜜月aⅴ免费一区二区三区| 久久精品国产电影| 国产精彩视频一区二区| 高清不卡一区二区三区| 国产精品香蕉av| 国产欧亚日韩视频| 蜜桃91精品入口| 欧美极品欧美精品欧美图片| 日韩福利二区| 色狠狠久久av五月综合| 亚洲精品一区二区三区樱花| 亚洲精品免费av| 亚洲国产高清国产精品| 亚洲中文字幕无码一区二区三区| 欧美精品做受xxx性少妇| 国产精品视频在线播放| 久久久久久久国产| 97干在线视频| 国产女主播自拍| chinese少妇国语对白| 国产欧美一区二区三区另类精品| 免费国产一区| 精品日韩美女| 国产私拍一区| 国产美女网站在线观看| 欧美尤物巨大精品爽| 欧美亚洲国产成人精品| 欧美日本韩国一区二区三区| 欧美激情专区| 国产偷久久久精品专区| 国产伦精品一区二区三区视频孕妇| 国产免费黄视频| 麻豆av免费在线| 国产美女精彩久久| 国产九九精品视频| 成人3d动漫一区二区三区| 成人av一级片| 久久婷婷国产综合尤物精品| 久久免费一级片| 成人免费在线网址| 久久久久国产精品熟女影院| 九色91在线视频| 国产精品日韩av| 久久综合伊人77777| 欧美激情xxxx性bbbb| 中文字幕在线观看一区二区三区| 欧美日韩国产成人在线| 亚洲欧洲中文| 日本一本a高清免费不卡| 欧美又大粗又爽又黄大片视频| 欧美黄色免费影院| 国产美女在线一区| 久久久免费电影| 国产成人avxxxxx在线看| 国产精品激情av在线播放| 尤物av无码色av无码| 日日噜噜噜夜夜爽爽| 欧美激情国产精品日韩| 国产欧美欧洲| 国产精品av一区| 丝袜美腿亚洲一区二区| 久久国产精彩视频| 亚洲最大av网| 日韩国产在线一区| 国产淫片免费看| 久久久亚洲国产精品| 日韩在线观看网址| 精品免费久久久久久久| 懂色一区二区三区av片| 欧美最猛性xxxx| 国产一区二区香蕉| 久久久久久久久久久久久久久久久久av| 国产精品网站视频| 亚洲精品乱码久久久久久自慰| 热re99久久精品国99热蜜月| 国产午夜精品一区| 久久99精品久久久久久水蜜桃| 国产精品极品美女在线观看免费| 亚洲欧美日韩另类精品一区二区三区 |