/* * Copyright (C) 2010---2014 星星(wuweixing)<349446658@qq.com> * * This file is part of Wabacus * * Wabacus is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.wabacus.system.inputbox; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.wabacus.config.Config; import com.wabacus.config.ConfigLoadManager; import com.wabacus.config.component.application.report.ConditionBean; import com.wabacus.config.component.application.report.ReportBean; import com.wabacus.config.typeprompt.ITypePromptOptionMatcher; import com.wabacus.config.typeprompt.TypePromptBean; import com.wabacus.config.typeprompt.TypePromptColBean; import com.wabacus.config.xml.XmlElementBean; import com.wabacus.exception.WabacusConfigLoadingException; import com.wabacus.system.ReportRequest; import com.wabacus.system.dataset.select.common.AbsCommonDataSetValueProvider; import com.wabacus.system.inputbox.option.TypepromptOptionBean; import com.wabacus.util.Tools; public class TextBox extends AbsInputBox implements Cloneable { private TypePromptBean typePromptBean; public TextBox(String typename) { super(typename); } public TypePromptBean getTypePromptBean() { return typePromptBean; } public void setTypePromptBean(TypePromptBean typePromptBean) { this.typePromptBean=typePromptBean; } protected String doGetDisplayStringValue(ReportRequest rrequest,String value,String style_property,boolean isReadonly) { StringBuffer resultBuf=new StringBuffer(); resultBuf.append(this.getBeforedescription(rrequest)); String inputboxid=getInputBoxId(rrequest); resultBuf.append("<input type='"+this.getTextBoxType()+"' id='"+inputboxid+"' name='"+inputboxid+"'"); resultBuf.append(" value=\""+getInputBoxValue(rrequest,value)+"\" "); style_property=Tools.mergeHtmlTagPropertyString(style_property,getTextBoxExtraStyleProperty(rrequest,isReadonly),1); if(isReadonly) style_property=addReadonlyToStyleProperty1(style_property); if(style_property!=null) resultBuf.append(" ").append(style_property).append(" "); resultBuf.append("/>"); resultBuf.append(this.getAfterdescription(rrequest)); return resultBuf.toString(); } protected String getTextBoxExtraStyleProperty(ReportRequest rrequest,boolean isReadonly) { StringBuffer resultBuf=new StringBuffer(); if(typePromptBean!=null) { resultBuf.append(" onfocus=\"try{initializeTypePromptProperties(this,'"+getTypePromptJsonString(rrequest,getInputBoxId(rrequest)) +"');}catch(e){logErrorsAsJsFileLoad(e);}\""); } return resultBuf.toString(); } private String getTypePromptJsonString(ReportRequest rrequest,String inputboxid) { if(typePromptBean==null) return ""; StringBuffer resultBuf=new StringBuffer("{"); resultBuf.append("pageid:\"").append(owner.getReportBean().getPageBean().getId()).append("\""); resultBuf.append(",reportid:\"").append(owner.getReportBean().getId()).append("\""); resultBuf.append(",inputboxid:\"").append(inputboxid).append("\""); resultBuf.append(",spanOutputWidth:").append(typePromptBean.getResultspanwidth()); resultBuf.append(",spanOutputMaxheight:").append(typePromptBean.getResultspanMaxheight()); resultBuf.append(",resultCount:").append(typePromptBean.getResultcount()); resultBuf.append(",timeoutSecond:").append(typePromptBean.getTimeout()); resultBuf.append(",isShowTitle:").append(typePromptBean.isShowtitle()); resultBuf.append(",isCasesensitive:").append(typePromptBean.isCasesensitive()); if(this.owner instanceof ConditionBean) { if(ConditionBean.LABELPOSITION_INNER.equals(((ConditionBean)this.owner).getLabelposition())&&((ConditionBean)this.owner).getLabel(rrequest)!=null) {//inputvalue为显示在输入框中的提示信息 resultBuf.append(",conditionlabel:\"").append(((ConditionBean)this.owner).getLabel(rrequest)).append("\""); } } if(typePromptBean.getCallbackmethod()!=null&&!typePromptBean.getCallbackmethod().trim().equals("")) { resultBuf.append(",callbackmethod:").append(typePromptBean.getCallbackmethod()); } StringBuffer colBuf=new StringBuffer(); for(TypePromptColBean tpColBean:typePromptBean.getLstPColBeans()) { colBuf.append("{"); colBuf.append("collabel:\"").append(tpColBean.getLabel()).append("\""); if(tpColBean.getValue()!=null) colBuf.append(",colvalue:\"").append(tpColBean.getValue()).append("\""); colBuf.append(",coltitle:\"").append(tpColBean.getTitle()==null?"":rrequest.getI18NStringValue(tpColBean.getTitle())).append("\""); colBuf.append(",matchmode:").append(tpColBean.getMatchmode()); colBuf.append(",hidden:").append(tpColBean.isHidden()); colBuf.append("},"); } if(colBuf.charAt(colBuf.length()-1)==',') colBuf.deleteCharAt(colBuf.length()-1); resultBuf.append(",colsArray:[").append(colBuf.toString()).append("]"); if(typePromptBean.getClientMatcherMethodName()!=null&&!typePromptBean.getClientMatcherMethodName().trim().equals("")) { resultBuf.append(",clientMatchMethod:").append(typePromptBean.getClientMatcherMethodName()); } resultBuf.append("}"); return Tools.jsParamEncode(resultBuf.toString()); } protected String initDisplaySpanStart(ReportRequest rrequest) { if(this.typePromptBean==null) return super.initDisplaySpanStart(rrequest); StringBuilder resultBuf=new StringBuilder(); resultBuf.append(super.initDisplaySpanStart(rrequest)); resultBuf.append(" typePrompt=\"").append(getTypePromptJsonString(rrequest,this.owner.getInputBoxId())).append("\""); return resultBuf.toString(); } public String filledInContainer() { StringBuilder resultBuf=new StringBuilder(); resultBuf.append(" boxstr=\"<input type='"+this.getTextBoxType()+"' value=\\\"\"+boxValue+\"\\\"\";"); resultBuf.append(getInputBoxCommonFilledProperties()); resultBuf.append("boxstr+=\">\";"); resultBuf.append("setColDisplayValueToEditable2Td(parentTdObj,boxstr);"); return resultBuf.toString(); } protected String addPropValueToFillStyleproperty() { StringBuilder resultBuf=new StringBuilder(); resultBuf.append(super.addPropValueToFillStyleproperty()); resultBuf.append("var typePrompt=boxMetadataObj.getAttribute('typePrompt');"); resultBuf.append("if(typePrompt!=null&&typePrompt!=''){"); resultBuf.append(" arrTmp=getPropertyValueFromHtmlProperties(styleproperty,'onfocus');"); resultBuf.append(" arrTmp[1]=wx_trim(arrTmp[1]);if(arrTmp[1]!=''&&arrTmp[1].lastIndexOf(';')!=arrTmp[1].length-1) arrTmp[1]=arrTmp[1]+';';"); resultBuf.append(" arrTmp[1]=arrTmp[1]+\"initializeTypePromptProperties(this,'\"+typePrompt+\"');\";"); resultBuf.append(" styleproperty=arrTmp[0]+\" onfocus=\\\"\"+arrTmp[1]+\"\\\"\";"); resultBuf.append("}"); return resultBuf.toString(); } protected String getTextBoxType() { return "text"; } public String getIndependentDisplayString(ReportRequest rrequest,String value,String dynstyleproperty,Object specificDataObj,boolean isReadonly) { StringBuffer resultBuf=new StringBuffer(); resultBuf.append("<input type='"+this.getTextBoxType()+"' value=\""+value+"\""); dynstyleproperty=Tools.mergeHtmlTagPropertyString(this.defaultstyleproperty,dynstyleproperty,1); if(isReadonly) dynstyleproperty=addReadonlyToStyleProperty1(dynstyleproperty); if(dynstyleproperty!=null) resultBuf.append(" ").append(dynstyleproperty).append(" "); resultBuf.append("/>"); return resultBuf.toString(); } public void loadInputBoxConfig(XmlElementBean eleInputboxBean) { super.loadInputBoxConfig(eleInputboxBean); if(eleInputboxBean==null) return; //加载输入联想配置 XmlElementBean eleTypeprompt=eleInputboxBean.getChildElementByName("typeprompt"); if(eleTypeprompt!=null) { owner.getReportBean().addTextBoxWithingTypePrompt(this); typePromptBean=new TypePromptBean(); String width=eleTypeprompt.attributeValue("width"); if(width!=null&&!width.trim().equals("")) { typePromptBean.setResultspanwidth(Tools.getWidthHeightIntValue(width)); } String maxheight=eleTypeprompt.attributeValue("maxheight"); if(maxheight!=null&&!maxheight.trim().equals("")) { typePromptBean.setResultspanMaxheight(Tools.getWidthHeightIntValue(maxheight)); } String count=eleTypeprompt.attributeValue("count"); if(count!=null&&!count.trim().equals("")) { typePromptBean.setResultcount(Integer.parseInt(count.trim())); } String timeout=eleTypeprompt.attributeValue("timeout"); if(timeout!=null&&!timeout.trim().equals("")) { typePromptBean.setTimeout(Integer.parseInt(timeout.trim())); } String casesensitive=eleTypeprompt.attributeValue("casesensitive"); casesensitive=casesensitive==null?"true":casesensitive.toLowerCase().trim(); typePromptBean.setCasesensitive(!casesensitive.toLowerCase().trim().equals("false")); String callbackmethod=eleTypeprompt.attributeValue("callbackmethod"); if(callbackmethod!=null&&!callbackmethod.trim().equals("")) { typePromptBean.setCallbackmethod(callbackmethod.trim()); } String servermatcher=eleTypeprompt.attributeValue("servermatcher"); if(servermatcher!=null&&!servermatcher.trim().equals("")) { Object obj=null; try { obj=ConfigLoadManager.currentDynClassLoader.loadClassByCurrentLoader(servermatcher).newInstance(); }catch(Exception e) { throw new WabacusConfigLoadingException("为报表"+owner.getReportBean().getPath()+"的<typeprompt/>配置的servermatcher属性:" +servermatcher+"无法实例化",e); } if(!(obj instanceof ITypePromptOptionMatcher)) { throw new WabacusConfigLoadingException("为报表"+owner.getReportBean().getPath()+"的<typeprompt/>配置的servermatcher属性:" +servermatcher+"没有实现接口"+ITypePromptOptionMatcher.class.getName()); } typePromptBean.setTypePromptMatcherObj((ITypePromptOptionMatcher)obj); } String clientmatcher=eleTypeprompt.attributeValue("clientmatcher"); if(clientmatcher!=null&&!clientmatcher.trim().equals("")) { typePromptBean.setClientMatcherMethodName(clientmatcher.trim()); } List<XmlElementBean> lstPromptcols=eleTypeprompt.getLstChildElementsByName("promptcol"); loadPromptcolsConfig(lstPromptcols); XmlElementBean eleDataSources=eleTypeprompt.getChildElementByName("datasource"); if(eleDataSources==null) { throw new WabacusConfigLoadingException("没有为报表"+owner.getReportBean().getPath()+"的<typeprompt/>配置子标签<datasource/>"); } List<XmlElementBean> lstOptionElements=eleDataSources.getLstChildElementsByName("option"); if(lstOptionElements==null||lstOptionElements.size()==0) { throw new WabacusConfigLoadingException("没有为报表"+owner.getReportBean().getPath()+"的<typeprompt/>配置的子标签<datasource/>配置<option/>选项标签"); } List<TypepromptOptionBean> lstObs=new ArrayList<TypepromptOptionBean>(); loadTypePromptOptionsConfig(owner,lstOptionElements,lstObs); this.typePromptBean.setLstOptionBeans(lstObs); } } private void loadPromptcolsConfig(List<XmlElementBean> lstPromptcols) { if(lstPromptcols==null&&lstPromptcols.size()==0) { throw new WabacusConfigLoadingException("没有为报表"+owner.getReportBean().getPath()+"<typeprompt/>的配置子标签<promptcol/>"); } List<TypePromptColBean> lstPColBeans=new ArrayList<TypePromptColBean>(); boolean isShowTitle=false; boolean isHasMatchCol=false; ReportBean rbean=owner.getReportBean(); TypePromptColBean tpColbeanTmp; for(XmlElementBean elePromptColBeanTmp:lstPromptcols) { if(elePromptColBeanTmp==null) continue; String label=elePromptColBeanTmp.attributeValue("label"); String value=elePromptColBeanTmp.attributeValue("value"); String title=elePromptColBeanTmp.attributeValue("title"); String matchmode=elePromptColBeanTmp.attributeValue("matchmode"); String hidden=elePromptColBeanTmp.attributeValue("hidden"); String matchexpression=elePromptColBeanTmp.attributeValue("matchexpression"); if(label==null||label.trim().equals("")) { throw new WabacusConfigLoadingException("报表"+rbean.getPath()+"<typeprompt/>的子标签<promptcol/>的label属性不能为空"); } tpColbeanTmp=new TypePromptColBean(); tpColbeanTmp.setLabel(Config.getInstance().getResourceString(null,rbean.getPageBean(),label.trim(),true)); if(title!=null&&!title.trim().equals("")) { tpColbeanTmp.setTitle(Config.getInstance().getResourceString(null,rbean.getPageBean(),title.trim(),true)); isShowTitle=true;//此输入联想需要显示标题行 } if(hidden!=null) tpColbeanTmp.setHidden(hidden.toLowerCase().equals("true")); if(tpColbeanTmp.isHidden()) { tpColbeanTmp.setMatchmode(0); }else { matchmode=matchmode==null?"":matchmode.toLowerCase().trim(); if("anywhere".equals(matchmode)) { tpColbeanTmp.setMatchmode(2); }else if("start".equals(matchmode)) { tpColbeanTmp.setMatchmode(1); }else { tpColbeanTmp.setMatchmode(0); } if(tpColbeanTmp.getMatchmode()>0) { isHasMatchCol=true; if(value==null||value.trim().equals("")) value=label; tpColbeanTmp.setValue(value.trim()); if(matchexpression!=null&&!matchexpression.trim().equals("")) { if(matchexpression.indexOf("#data#")<0) { throw new WabacusConfigLoadingException("报表"+owner.getReportBean().getPath() +"<typeprompt/>的子标签<promptcol/>的matchexpression属性:"+matchexpression+"失败,没有在这里指定输入值的占位符#data#"); } tpColbeanTmp.setMatchexpression(matchexpression.trim()); } } } lstPColBeans.add(tpColbeanTmp); } if(!isHasMatchCol) { throw new WabacusConfigLoadingException("报表"+owner.getReportBean().getPath() +"<typeprompt/>的子标签<promptcol/>的matchmode属性不能均配置为none,必须指定一个或以上用于匹配的列"); } typePromptBean.setShowtitle(isShowTitle); typePromptBean.setLstPColBeans(lstPColBeans); } private void loadTypePromptOptionsConfig(IInputBoxOwnerBean ownerbean,List<XmlElementBean> lstOptionElements,List<TypepromptOptionBean> lstObs) { ReportBean rbean=ownerbean.getReportBean(); for(XmlElementBean eleOptionTmp:lstOptionElements) { if(eleOptionTmp==null) continue; TypepromptOptionBean ob=new TypepromptOptionBean(this); String dataset=eleOptionTmp.attributeValue("dataset"); dataset=dataset==null?"":dataset.trim(); if(dataset.equals("")) { Map<String,String> mOption=new HashMap<String,String>(); String nameTmp,valueTmp; for(TypePromptColBean tcolbeanTmp:typePromptBean.getLstPColBeans()) {//需要在常量<option/>中配置所有匹配列/显示列所需的数据 nameTmp=tcolbeanTmp.getLabel(); if(nameTmp==null||nameTmp.trim().equals("")) { throw new WabacusConfigLoadingException("报表"+rbean.getPath()+"配置的输入联想选项失败,没有在常量选项<option/>标签中配置label属性,指定显示label的数据"); } valueTmp=eleOptionTmp.attributeValue(nameTmp); valueTmp=valueTmp==null?"":valueTmp.trim(); mOption.put(nameTmp,valueTmp);//将此联想列的名和配置的常量值存入Map中 nameTmp=tcolbeanTmp.getValue(); if(nameTmp==null||nameTmp.trim().equals("")||nameTmp.equals(tcolbeanTmp.getLabel())) continue; valueTmp=eleOptionTmp.attributeValue(nameTmp); valueTmp=valueTmp==null?"":valueTmp.trim(); mOption.put(nameTmp,valueTmp); } ob.setMPromptcolValues(mOption); }else if(Tools.isDefineKey("$",dataset)) { loadTypePromptOptionsConfig(ownerbean,(List<XmlElementBean>)Config.getInstance().getResourceObject(null,rbean.getPageBean(),dataset, true),lstObs); continue; }else { AbsCommonDataSetValueProvider dsProvider=AbsCommonDataSetValueProvider.createCommonDataSetValueProviderObj(rbean,dataset); if(dsProvider==null) { throw new WabacusConfigLoadingException("报表"+rbean.getPath()+"配置的输入联想选项的dataset:"+eleOptionTmp.attributeValue("dataset")+"不合法"); } ob.setDatasetProvider(dsProvider); dsProvider.setOwnerOptionBean(ob); dsProvider.loadConfig(eleOptionTmp); } lstObs.add(ob); } } protected String getDefaultStylePropertyForDisplayMode2() { String style="onfocus='this.select();' onkeypress='return onKeyEvent(event);'"; if(this.hasDescription()) { style+=" class='cls-inputbox2"; }else { style+=" class='cls-inputbox2-full"; } style+="'"; return style; } public void doPostLoad() { super.doPostLoad(); if(this.typePromptBean!=null) { for(TypepromptOptionBean optionBeanTmp:this.typePromptBean.getLstOptionBeans()) { optionBeanTmp.doPostLoad(); } String typepromptjs="/webresources/script/wabacus_typeprompt.js"; // typepromptjs="/webresources/script/wabacus_typeprompt.js"; // String encode=Config.encode; // typepromptjs="/webresources/script/"+encode.toLowerCase()+"/wabacus_typeprompt.js"; // } typepromptjs=Tools.replaceAll(Config.webroot+"/"+typepromptjs,"//","/"); owner.getReportBean().getPageBean().addMyJavascriptFile(typepromptjs,0); } } protected void processStylePropertyAfterMerged() { super.processStylePropertyAfterMerged(); if(this.typePromptBean!=null) { this.styleproperty=Tools.removePropertyValueByName("onkeypress",this.styleproperty); this.styleproperty=Tools.mergeHtmlTagPropertyString(this.styleproperty,"autocomplete=\"off\"",1); } } public Object clone(IInputBoxOwnerBean owner) { TextBox tbNew=(TextBox)super.clone(owner); if(typePromptBean!=null) { tbNew.setTypePromptBean((TypePromptBean)typePromptBean.clone(tbNew)); if(owner!=null&&owner.getReportBean()!=null) { owner.getReportBean().addTextBoxWithingTypePrompt(tbNew); } } return tbNew; } }