安徽新华电脑专修学院_安徽电脑培训_安徽电脑培训学校_合肥电脑培训

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > 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向導例子入手,通過對其進行擴展, 演示了高亮顯示, 內容格式化, 內容大綱, 錯誤標記, 內容輔助幾個功能的實現, 希望這篇文章對你來實現自己強大的文本編輯器能有所幫助


安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
主站蜘蛛池模板: 西门子伺服电机维修_西门子变频器维修_西门子伺服驱动器维修_数控系统维修_PL维修-上海仰光电子 西克制冷官网│制冷机组冷风机冷库设备厂家-西克制冷(无锡)有限公司_西克制冷(无锡)有限公司 | 青田人才网_青田招聘网_求职找工作平台 | 天津成考网-天津成人高考网| 主轴-电主轴-高速电机-高速电主轴厂家|瑞德沃斯品牌 | 网站制作-网站制作公司-专业制作网站【做网站找企术】 | 中江网-中国江苏网·新江苏, 全国重点新闻网站 | 西藏旅游-西藏中旅-西藏中旅国际旅行社| 氯化氢|二氧化硫|硫化氢|氩气生产厂家_潍坊市景鑫新材料有限公司 | 苏州妙凯电子有限公司-供应军工电源芯片|线性恒流IC|开关电源IC|LED驱动芯片|MOS管|IPM|IGBT|MCU开发|电源模块 | 圣瞳智巡_大模型工业巡检解决方案|【圣瞳科技】 | 螺旋叶片_叶片成型机_叶片冷轧机-深州市广兴五金机械制造有限公司 | 重庆监控-监控系统-大型弱电工程-重庆万建电子工程有限责任公司是智能化一级工程公司 | 拼装式电磁屏蔽室厂家,屏蔽机柜生产厂家,电波暗室制造商,屏蔽配件-常州麦思恩屏蔽机柜生产厂家 | 连云港机械手厂家_全自动焊接机械手_刀轴焊接机_智能轴类焊接机_连云港建博自动化设备有限公司 | 气相色谱仪生产厂家批发价格找上海惠分科学分析仪器有限公司 | 数控机床市场网-专业的数控机床网站 | 模具配件加工厂|东莞模具配件加工|模具配件加工厂|精密塑胶模具配件|东莞市优迪精密模具制品有限公司 | 智能一体化蒸馏仪_氨氮蒸馏仪_全自动智能蒸馏仪器厂家-那艾 | 宁波华路德|交通信号灯|交通信号机|太阳能信号灯|交通警示灯|交通信号灯厂家 | 装盒机|装箱机|封箱机|全自动化包装生产线尽在利悦包装机械 | 模具水垢清洗机_模具管路清洗机_模具专用清洗机-苏州意德特机械有限公司 | 矿用精确定位系统,井下4G无线通讯系统,工作面集控系统,皮带保护系统-山东新云鹏电气有限公司 | 深圳店铺装修-连锁店装修-深圳标榜装饰设计 | 激光切割加工,佛山激光切割加工,钣金加工,机加工-佛山市华锐达金属制品有限公司 | 领先的一站式_专利申请代理知识产权服务平台_乐知网 | 汽车蓄电池配件_蓄电池维护保养产品_叉车电池配件研发生产厂家—联鸿能源 | 摩托车-摩托车配件-摩托车与配件_摩托车与配件行业权威的门户网站! | 现代卓越官网-专注于pmp培训证书-pmp考试报名时间-pmp认证-项目管理pmp-ACP敏捷管理-NPDP认证 | 中港物流|香港专线|香港物流|中港运输|中港货运|深圳理想物流公司|4006899888 | 远东齿轮泵|高粘度齿轮泵|三螺杆油泵|沥青保温泵|高粘度稠油泵-远东泵业官网 | 校服定做厂家-屹奥校服-无限能量·校园绽放 | 西安网站建设,西安网站设计制作,西安短视频拍摄_短视频运营就选动力无限网络推广公司 | 立式/卧式/暖气/管道泵,管道离心泵选型,管道增压泵型号 - 安平鼎千泵业制造厂 | 立式加工中心_龙门加工中心_卧式加工中心-山东威达重工股份有限公司 | 济宁市天众机械有限公司_机械加工,电力产品,冶金产品,造纸机械 | 通风方式信号控制箱_人防呼叫按钮_人防设备厂家–西安鼎兴自控工程有限公司 | 全功能护理训练模拟人-创伤护理人-高级电脑心肺复苏模型-上海康季 | 吉安仁济医院「官网」吉安男科医院-吉安仁济男科医院靠谱吗-男性专科医院 | 免喷涂材料,免喷涂塑料,免喷涂注塑,免喷涂挤塑,免喷涂工艺-中山鸿盛免喷涂 | 万向轴承_福来轮_全向轮_双向转轮_万向球_算盘轮_塑料卷轴-宁津县正彤机械塑料有限公司 | 无塔供水_全自动无塔供水设备_石家庄工泉水处理_无塔供水器 |