/** * <p>Copyright: Copyright (c) 2009</p> * <p>Company: �������ӹɷ����޹�˾</p> */ /** */ package com.hundsun.ares.studio.cres.extend.ui.text; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.ITextViewer; import com.hundsun.ares.studio.core.IARESProject; import com.hundsun.ares.studio.core.IARESResource; import com.hundsun.ares.studio.jres.metadata.constant.IMetadataRefType; import com.hundsun.ares.studio.jres.model.metadata.ConstantItem; import com.hundsun.ares.studio.jres.model.metadata.DictionaryItem; import com.hundsun.ares.studio.jres.model.metadata.ErrorNoItem; import com.hundsun.ares.studio.jres.model.metadata.StandardField; import com.hundsun.ares.studio.jres.model.metadata.TypeDefaultValue; import com.hundsun.ares.studio.jres.model.metadata.util.MetadataServiceProvider; import com.hundsun.ares.studio.model.reference.ReferenceInfo; import com.hundsun.ares.studio.reference.ReferenceManager; import com.hundsun.ares.studio.usermacro.UserMacro; import com.hundsun.ares.studio.usermacro.UserMacroItem; import com.hundsun.ares.studio.usermacro.constants.IUserMacroResType; /** * <p> * CreatedDate: 2008-2-21 * </p> * ���ദ��༭����������ʾ * �������ݻ����������ʾ * * ��׼�ֶ� * ҵ���� * ���� * * @author sundl */ public abstract class CRESTextHover implements ITextHover { protected static String LINE_SEPERATOR = "<br>"; /** * ȫ��д�ַ������м������_��,����CNST_FUTURESDIRECTION_ALL */ private static Pattern CONSTANT_PATTERN = Pattern.compile("[[A-Z]+_*]+"); protected IARESProject project; public CRESTextHover(IARESProject project) { this.project = project; } public IRegion getHoverRegion(ITextViewer textViewer, int offset) { return CRESTextUtil.findWord(textViewer.getDocument(), offset); } /* * (non-Javadoc) * * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, * org.eclipse.jface.text.IRegion) */ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { //IMetadataService service = DataServiceManager.getInstance().getService(project, IMetadataService.class); if (hoverRegion != null && hoverRegion.getLength() >= 0) { IDocument document = textViewer.getDocument(); try { String text = document.get(hoverRegion.getOffset(), hoverRegion.getLength()); //���ȫ��д����Ϊ����ƥ�� Matcher m = CONSTANT_PATTERN.matcher(text); if(m.matches()){ return getConstantHoverInfo(text); } char preChar = (char) 0; if (hoverRegion.getOffset() > 0) { preChar = document.getChar(hoverRegion.getOffset() - 1); } //�����@����ͷ��˵���DZ�׼�ֶ� if(preChar == '@'){ ReferenceInfo ref = ReferenceManager.getInstance().getFirstReferenceInfo(project, IMetadataRefType.StdField, text, true); if(null != ref && ref.getObject() instanceof StandardField){ StandardField field = (StandardField)ref.getObject(); // ��׼�ֶ� StringBuffer result = new StringBuffer(); result.append(" <b>��׼�ֶ�:</b> " + field.getName() + LINE_SEPERATOR); result.append(" <b>������ :</b> " + field.getChineseName() + LINE_SEPERATOR); result.append(" <b>��������:</b> " + field.getDataType() + LINE_SEPERATOR); TypeDefaultValue dftValue = MetadataServiceProvider.getTypeDefaultValueOfStdFieldByName(project, text); if(null != dftValue) { result.append(" <b>C����Ĭ��ֵ:</b> " + dftValue.getValue(MetadataServiceProvider.C_TYPE)); } return result.toString(); } } else if(preChar == '<'){ return getConstantHoverInfo(text); }else { // ϵͳ�� IARESResource[] sysMacroRes = project.getResources(IUserMacroResType.SYSTEM_MACRO); if(null != sysMacroRes && sysMacroRes.length > 0){ UserMacro sysMacro = sysMacroRes[0].getInfo(UserMacro.class); if (sysMacro != null) { UserMacroItem macroItem = findMacro(text, sysMacro); if (macroItem != null) { StringBuilder info = new StringBuilder(); info.append(" <b>ϵͳ�� </b>" + LINE_SEPERATOR); info.append(" <b>�����б�: </b>" + LINE_SEPERATOR); info.append(macroItem.getSequence() + LINE_SEPERATOR); info.append(LINE_SEPERATOR); info.append(" <b>��˵��: </b>" + LINE_SEPERATOR); info.append(" " + preProcess(macroItem.getDescription())); return info.toString(); } } } // �û��Զ���� IARESResource[] userMacroRes = project.getResources(IUserMacroResType.USER_MACRO); if (userMacroRes != null && userMacroRes.length > 0) { UserMacro userMacro = userMacroRes[0].getInfo(UserMacro.class); if (userMacro != null) { UserMacroItem macroItem = findMacro(text, userMacro); if (macroItem != null) { StringBuilder info = new StringBuilder(); info.append(" <b>�Զ���� </b>" + LINE_SEPERATOR); info.append(" <b>�����б�: </b>" + LINE_SEPERATOR); info.append(macroItem.getSequence() + LINE_SEPERATOR); info.append(LINE_SEPERATOR); info.append(" <b>��˵��: </b>" + LINE_SEPERATOR); info.append(" " + preProcess(macroItem.getDescription())); return info.toString(); } } } } //�������� return getResHoverInfo(text); } catch (Exception e) { e.printStackTrace(); } } return ""; //$NON-NLS-1$ } private String getConstantHoverInfo(String text) { text = text.replaceFirst("<", "").replaceFirst(">", ""); ReferenceInfo ref = ReferenceManager.getInstance().getFirstReferenceInfo(project, IMetadataRefType.ErrNo, text, true); if(null != ref && ref.getObject() instanceof ErrorNoItem){ // ����� ErrorNoItem errorNO = (ErrorNoItem)ref.getObject(); if (errorNO != null) { StringBuilder info = new StringBuilder(); info.append(" <b>�����: </b>" + errorNO.getNo() + LINE_SEPERATOR); info.append(" <b>������Ϣ: </b>" + errorNO.getMessage() + LINE_SEPERATOR); info.append(" <b>˵ ��: </b>" + errorNO.getDescription()); return info.toString(); } } ReferenceInfo ref1 = ReferenceManager.getInstance().getFirstReferenceInfo(project, IMetadataRefType.Const, text, true); if(null != ref1 && ref1.getObject() instanceof ConstantItem){ //�û����� ConstantItem constantObj = (ConstantItem)ref1.getObject(); if(null != constantObj){ StringBuilder info = new StringBuilder(); info.append(" <b>������: </b>" + constantObj.getName() + LINE_SEPERATOR); info.append(" <b>����ֵ: </b>" + constantObj.getValue() + LINE_SEPERATOR); info.append(" <b>˵ ��: </b>" + constantObj.getDescription()); return info.toString(); } } ReferenceInfo ref2 = ReferenceManager.getInstance().getFirstReferenceInfo(project, IMetadataRefType.Dictionary_Const, text, true); if(null != ref2 && ref2.getObject() instanceof DictionaryItem){ //�����ֵ� DictionaryItem dicItem = (DictionaryItem)ref2.getObject(); if(null != dicItem){ StringBuilder info = new StringBuilder(); info.append(" <b>��Ŀ������: </b>" + dicItem.getParent().getChineseName() + LINE_SEPERATOR); info.append(" <b>��Ŀ��: </b>" + dicItem.getParent().getName() + LINE_SEPERATOR); info.append(" <b>�ֵ���: </b>" + dicItem.getChineseName() + LINE_SEPERATOR); info.append(" <b>ֵ: </b>" + dicItem.getValue() + LINE_SEPERATOR); info.append(" <b>˵ ��: </b>" + dicItem.getDescription()); return info.toString(); } } return text; } /** * ��ȡ��Դ������ʾ��Ϣ * @param name * @return */ protected abstract String getResHoverInfo(String name); /** * �������ֲ��Һ꣬�����������ֲ��������Dz���[ ]�� * @param name * @param macroList * @return */ private UserMacroItem findMacro(String name, UserMacro macroList) { for (UserMacroItem item : macroList.getMacroItems()) { String itemName = item.getName(); if (StringUtils.startsWith(itemName, "[")) { itemName = StringUtils.substringAfter(itemName, "["); } if (StringUtils.endsWith(itemName, "]")) { itemName = StringUtils.substringBeforeLast(itemName, "]"); } if (StringUtils.equals(itemName, name)) return item; } return null; } /** * �Ը������ַ�������Ԥ�����ѻ���ת����<br>���Ա�����Ϣ�ؼ��л��� */ private String preProcess(String text) { if (!StringUtils.isEmpty(text)) { return text.replace("\n", "<br>"); } return text; } }