/*
* 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 java.util.Map.Entry;
import com.wabacus.config.Config;
import com.wabacus.config.component.application.report.AbsReportDataPojo;
import com.wabacus.config.component.application.report.ColBean;
import com.wabacus.config.component.application.report.ConditionBean;
import com.wabacus.config.component.application.report.DisplayBean;
import com.wabacus.config.xml.XmlElementBean;
import com.wabacus.exception.WabacusConfigLoadingException;
import com.wabacus.system.ReportRequest;
import com.wabacus.system.assistant.EditableReportAssistant;
import com.wabacus.system.assistant.WabacusAssistant;
import com.wabacus.system.component.application.report.EditableListReportType2;
import com.wabacus.system.component.application.report.abstractreport.AbsListReportType;
import com.wabacus.system.component.application.report.abstractreport.AbsReportType;
import com.wabacus.system.component.application.report.abstractreport.IEditableReportType;
import com.wabacus.system.component.application.report.configbean.editablereport.EditableReportColBean;
import com.wabacus.util.Tools;
public abstract class AbsPopUpBox extends AbsInputBox
{
protected String poppageurl;
protected Map<String,String> mDynParamParts;
private List<String> lstParamNamesInUrl;
protected String popupparams;
protected String initsize;//初始大小,可配置值包括min/max/normal,分别表示最大化、最小化、正常窗口大小(即上面pagewidth/pageheight配置的大小)
protected String beforepopup;
public AbsPopUpBox(String typename)
{
super(typename);
}
public List<String> getLstParamNamesInUrl()
{
return lstParamNamesInUrl;
}
public String getPopupparams()
{
return popupparams;
}
public void setPopupparams(String popupparams)
{
this.popupparams=popupparams;
}
protected String getDefaultStylePropertyForDisplayMode2()
{
String resultStr="onfocus='this.select();' onkeypress='return onKeyEvent(event);' onmouseover=\"this.style.cursor='pointer';\" readonly";
if(this.hasDescription())
{
resultStr+=" class='cls-inputbox2' ";
}else
{
resultStr+=" class='cls-inputbox2-full' ";
}
return resultStr;
}
protected String initDisplaySpanStart(ReportRequest rrequest)
{
StringBuilder resultBuf=new StringBuilder();
resultBuf.append(super.initDisplaySpanStart(rrequest));
resultBuf.append(" paramsOfGetPageUrl=\"").append(getPopupUrlJsonString(rrequest)).append("\"");
return resultBuf.toString();
}
private String getPopupUrlJsonString(ReportRequest rrequest)
{
StringBuilder resultBuf=new StringBuilder();
resultBuf.append("{pageid:\"").append(owner.getReportBean().getPageBean().getId()).append("\",");
resultBuf.append("reportid:\"").append(owner.getReportBean().getId()).append("\",");
String popupageurlTmp=this.poppageurl;
StringBuilder paramsBuf=new StringBuilder();
boolean isReplaceColValueServerside=isReplaceColValueServerside();
if(this.mDynParamParts!=null&&this.mDynParamParts.size()>0)
{
AbsReportDataPojo dataObj=isReplaceColValueServerside?rrequest.getReportDataObj(owner.getReportBean().getId(),0):null;
String placeholderTmp, valueTmp;
for(Entry<String,String> entryTmp:this.mDynParamParts.entrySet())
{
placeholderTmp=entryTmp.getKey();
valueTmp=entryTmp.getValue();
if(Tools.isDefineKey("@",valueTmp))
{
valueTmp=Tools.getRealKeyByDefine("@",valueTmp);
if(isReplaceColValueServerside)
{
if(dataObj==null)
{//没有数据对象,则所有动态参数都替换成空字符串
valueTmp="";
}else
{
if(valueTmp.endsWith("__old")) valueTmp=valueTmp.substring(0,valueTmp.length()-"__old".length());
valueTmp=dataObj.getColStringValue(valueTmp);
}
}else
{
paramsBuf.append(valueTmp+":\""+placeholderTmp+"\",");
continue;
}
}else if(Tools.isDefineKey("url",valueTmp)||Tools.isDefineKey("request",valueTmp)||Tools.isDefineKey("rrequest",valueTmp)
||Tools.isDefineKey("session",valueTmp))
{
valueTmp=WabacusAssistant.getInstance().getRequestContextStringValue(rrequest,valueTmp,"");
}
if(valueTmp==null) valueTmp="";
popupageurlTmp=Tools.replaceAll(popupageurlTmp,placeholderTmp,valueTmp);
}
}
resultBuf.append("popupPageUrl:\"").append(popupageurlTmp).append("\",");
if(paramsBuf.length()>0&¶msBuf.charAt(paramsBuf.length()-1)==',')
{
paramsBuf.deleteCharAt(paramsBuf.length()-1);
}
if(paramsBuf.length()>0) resultBuf.append(" popupPageUrlParams:{"+paramsBuf.toString()+"},");
resultBuf.append("popupparams:\"").append(this.popupparams).append("\",");
if(!Tools.isEmpty(this.beforepopup)) resultBuf.append("beforePopupMethod:").append(this.beforepopup);
if(resultBuf.length()>0&&resultBuf.charAt(resultBuf.length()-1)==',') resultBuf.deleteCharAt(resultBuf.length()-1);
resultBuf.append("}");
return Tools.jsParamEncode(resultBuf.toString());
}
private boolean isReplaceColValueServerside()
{
AbsReportType reportTypeObj=Config.getInstance().getReportType(this.owner.getReportBean().getType());
if((this.owner instanceof ConditionBean)&&reportTypeObj instanceof AbsListReportType)
{
return true;
}
if(reportTypeObj instanceof IEditableReportType) return false;
return true;
}
public void loadInputBoxConfig(XmlElementBean eleInputboxBean)
{
super.loadInputBoxConfig(eleInputboxBean);
String popupparams=eleInputboxBean.attributeValue("popupparams");
if(popupparams!=null) this.popupparams=popupparams.trim();
String initsize=eleInputboxBean.attributeValue("initsize");
if(initsize!=null) this.initsize=initsize.trim().toLowerCase();
String beforepopup=eleInputboxBean.attributeValue("beforepopup");
if(beforepopup!=null) this.beforepopup=beforepopup.trim();
}
public void doPostLoad()
{
super.doPostLoad();
parsePopupPageUrl();
popupparams=WabacusAssistant.getInstance().addDefaultPopupParams(popupparams,this.initsize,getDefaultWidth(),getDefaultHeight(),
"closePopUpPageEvent");
}
protected abstract void parsePopupPageUrl();
protected String parseDynParamsInUrl(String urlparams)
{
if(Tools.isEmpty(urlparams)) return null;
this.mDynParamParts=new HashMap<String,String>();
this.lstParamNamesInUrl=new ArrayList<String>();
List<String> lstParams=Tools.parseStringToList(urlparams,"&",false);
DisplayBean dbean=this.owner.getReportBean().getDbean();
StringBuilder paramsBuf=new StringBuilder();
String paramNameTmp, paramValueTmp,placeholderTmp;
int idxTmp;
ColBean cbTmp;
String placeholderPrex="[PLACE_HOLDER_";
int index=0;
for(String paramTmp:lstParams)
{
if(Tools.isEmpty(paramTmp)) continue;
idxTmp=paramTmp.indexOf("=");
if(idxTmp<=0) continue;
paramNameTmp=paramTmp.substring(0,idxTmp).trim();
paramValueTmp=paramTmp.substring(idxTmp+1).trim();
if(!this.lstParamNamesInUrl.contains(paramNameTmp)) this.lstParamNamesInUrl.add(paramNameTmp);
paramsBuf.append(paramNameTmp+"=");
if(Tools.isDefineKey("@",paramValueTmp)||Tools.isDefineKey("url",paramValueTmp)||Tools.isDefineKey("request",paramValueTmp)
||Tools.isDefineKey("rrequest",paramValueTmp)||Tools.isDefineKey("session",paramValueTmp))
{
placeholderTmp=placeholderPrex+index+"]";
this.mDynParamParts.put(placeholderTmp,paramValueTmp);
paramsBuf.append(placeholderTmp);
if(Tools.isDefineKey("@",paramValueTmp))
{
paramValueTmp=Tools.getRealKeyByDefine("@",paramValueTmp);
if(paramValueTmp.endsWith("__old")) paramValueTmp=paramValueTmp.substring(0,paramValueTmp.length()-"__old".length());
cbTmp=dbean.getColBeanByColProperty(paramValueTmp);
if(cbTmp==null||cbTmp.isControlCol()||cbTmp.isSequenceCol()||cbTmp.isNonValueCol())
{
throw new WabacusConfigLoadingException("加载报表"+this.owner.getReportBean().getPath()+"的输入框"+this.owner.getInputBoxId()
+"失败,在弹出窗口URL的参数中指定的column为"+paramValueTmp+"的列不存在或不是有效数据列");
}
cbTmp.setDisplayNameValueProperty(true);
}else if(Tools.isDefineKey("url",paramValueTmp))
{//从查询条件中取数据的动态参数
this.owner.getReportBean().addParamNameFromURL(Tools.getRealKeyByDefine("url",paramValueTmp));
}
index++;
}else
{
paramsBuf.append(paramValueTmp);
}
paramsBuf.append("&");
}
if(paramsBuf.length()>0&¶msBuf.charAt(paramsBuf.length()-1)=='&') paramsBuf.deleteCharAt(paramsBuf.length()-1);
return paramsBuf.toString();
}
protected void initDisplayMode()
{
this.displayOnClick=false;
}
protected void processStylePropertyAfterMerged()
{
super.processStylePropertyAfterMerged();
if(this.styleproperty.toLowerCase().indexOf("readonly")<0) this.styleproperty=this.styleproperty+" readonly ";
}
public String createSelectOkFunction(String realinputboxid,boolean isAutoincludejs)
{
boolean isConditionBox=false;
String paramname=null;
if(this.getOwner() instanceof ConditionBean)
{
isConditionBox=true;
paramname=((ConditionBean)this.getOwner()).getName();
}else
{
isConditionBox=false;
paramname=EditableReportAssistant.getInstance().getColParamName((ColBean)((EditableReportColBean)this.getOwner()).getOwner());
}
StringBuilder resultBuf=new StringBuilder();
String parentWindowName, closeMeCodeString;
if(Config.getInstance().getSystemConfigValue("prompt-dialog-type","artdialog").equals("artdialog"))
{
if(isAutoincludejs)
{
resultBuf.append("<script type=\"text/javascript\" src=\""+Config.webroot
+"webresources/component/artDialog/artDialog.js\"></script>");
resultBuf.append("<script type=\"text/javascript\" src=\""+Config.webroot
+"webresources/component/artDialog/plugins/iframeTools.js\"></script>");
}
parentWindowName="artDialog.open.origin";
closeMeCodeString="art.dialog.close();";
}else
{
parentWindowName="parent";
closeMeCodeString="parent.closePopupWin();";
}
resultBuf.append("<script language=\"javascript\">");
resultBuf.append("function selectOK(value,name,label,closeme){");
resultBuf.append("if(name==null||name==''||name=='"+paramname+"'){");
resultBuf.append(parentWindowName+".setPopUpBoxValueToParent(value,'").append(realinputboxid).append("');");
resultBuf.append("}else{");//指定了要设置的参数名
String pageid=this.owner.getReportBean().getPageBean().getId();
String reportid=this.owner.getReportBean().getId();
if(isConditionBox)
{
resultBuf.append(parentWindowName+".setInputboxValueForCondition('"+pageid+"','"+reportid+"',name,value));");
}else
{
resultBuf.append("var newvalues=\"{\"+name+\":\\\"\"+value+\"\\\"\";");
resultBuf.append("if(label!=null){newvalues+=\",\"+name+\"$label:\\\"\"+label+\"\\\"\";}");
resultBuf.append("newvalues=newvalues+\"}\";");
AbsReportType reportTypeObj=Config.getInstance().getReportType(this.owner.getReportBean().getType());
if(reportTypeObj instanceof EditableListReportType2)
{
resultBuf.append("var srcboxObj="+parentWindowName+".document.getElementById('"+realinputboxid+"');");//取到弹出窗口对应的源输入框对象,以便下面设置其它列的值时,可以取到其<tr/>对象
resultBuf.append(parentWindowName+".setEditableListReportColValueInRow(\""+pageid+"\",\""+reportid+"\","+parentWindowName
+".getParentElementObj(srcboxObj,'TR'),"+parentWindowName+".getObjectByJsonString(newvalues));");
}else
{
resultBuf.append(parentWindowName+".setEditableReportColValue(\""+pageid+"\",\""+reportid+"\","+parentWindowName
+".getObjectByJsonString(newvalues),null);");
}
}
resultBuf.append("}");
resultBuf.append("if(closeme!==false) "+closeMeCodeString+"}");
resultBuf.append("</script>");
return resultBuf.toString();
}
protected abstract String getDefaultWidth();
protected abstract String getDefaultHeight();
public String getIndependentDisplayString(ReportRequest rrequest,String value,String dynstyleproperty,Object specificDataObj,boolean isReadonly)
{
return null;
}
}