/************************************************************************************************* * 프로그램명 : InsertMTable.java 프로그램설명 : 집계 문서의 입력 양식을 작성해줌 작성자 : 강원중 작성일 : 2003.12.03 변경일 : 2004.09.16 **************************************************************************************************/ package kr.co.kihyun.moumi.doc.table; import java.util.StringTokenizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import kr.co.kihyun.beans.totsys.doc.table.item.ItemList; import kr.co.kihyun.moumi.MoumiConfig; import kr.co.kihyun.lang.MString; import kr.co.kihyun.moumi.doc.table.item.MItem; import kr.co.kihyun.moumi.report.MReport; public class InsertMTable { private static final Logger LOG = LoggerFactory.getLogger(InsertMTable.class); private String form = ""; private String inputForm = ""; private StringBuilder putValStrBuf = new StringBuilder(); private StringBuilder changeAllStrBuf = new StringBuilder(); public void convert(String form, ItemList itemList, int defItemSize) { convert(form, itemList.getNumList(), itemList.getNameList(), itemList.getSizeList(), itemList.getExprList(), itemList.getTypeList(), itemList.getDescList(), defItemSize); } @Deprecated public void convert(String form, int[] itemNumList, String[] itemNameList, int[] itemSizeList, String[] itemExprList, int[] itemTypeList, String[] itemDescList, String defItemSize) { convert(form, itemNumList, itemNameList, itemSizeList, itemExprList, itemTypeList, itemDescList, Integer.parseInt(defItemSize)); } public void convert(String form, int[] itemNumList, String[] itemNameList, int[] itemSizeList, String[] itemExprList, int[] itemTypeList, String[] itemDescList, int defItemSize) { this.form = form; int itemCount = itemNumList.length; String[] itemInputList = new String[itemCount]; String[] itemOnChangeList = new String[itemCount]; String[] itemOnFocusList = new String[itemCount]; String[] itemErrorList = new String[itemCount]; String itemName = ""; String itemExpr = ""; int itemType = 0; int itemSize = 0; String tmpItemDesc = ""; StringTokenizer tkItemExpr = null; StringBuilder selectBuf = null; String value = null; StringTokenizer is = null; for (int i = 0; i < itemCount; i++) { itemName = itemNameList[i].trim(); itemExpr = itemExprList[i].trim(); itemType = itemTypeList[i]; itemSize = itemSizeList[i]; tmpItemDesc = itemDescList[i].trim(); LOG.debug("itemName: {}, itemExpr: {}, itemType: {}, itemSize: {}, tmpItemDesc: {}", new Object[] {itemName, itemExpr, itemType, itemSize, tmpItemDesc}); try { tmpItemDesc = tmpItemDesc.substring(tmpItemDesc.indexOf(":") + 1, tmpItemDesc.length()); } catch (Exception e) { //18.시스템 데이터 정보노출 : Update by YOUNGJUN,CHO //System.err.println(e); e.printStackTrace(); //================================================ } // select 문으로 바뀌는 경우 if (itemExpr != null && itemExpr.indexOf("^") >= 0) { tkItemExpr = new StringTokenizer(itemExpr, "^"); selectBuf = new StringBuilder(); selectBuf.append("
"); itemInputList[i] = selectBuf.toString(); } else if (itemExpr != null && itemExpr.indexOf("~") > 0) { // textarea로 바뀌는 경우 is = new StringTokenizer(itemExpr, "~"); if (is.countTokens() != 2) { itemErrorList[i] += ":" + itemSize + MoumiConfig.getMessageBundle().getString("moumi.message.tot_doc.sizeError"); } else { // 계산버튼(관련) itemInputList[i] = ""; } } else {// 일반적인 경우 //ie10,11 호환성 수정 - 텍스트박스 배경색 적용되게 if (itemSize == 0) itemSize = defItemSize; if (itemType == MItem.CHAR) {// 문자 itemInputList[i] = ""; } else if (itemType == MItem.INT) {// 숫자 itemInputList[i] = ""; } else if (itemType == MItem.DATE) {// 날짜 itemInputList[i] = ""; } if ("empty".equals(tmpItemDesc)) { if (itemType == MItem.CHAR) {// 문자 itemInputList[i] = ""; } else if (itemType == MItem.INT) {// 숫자 itemInputList[i] = ""; } else if (itemType == MItem.DATE) {// 날짜 itemInputList[i] = ""; } } else { itemInputList[i] = ""; } } }// ///for end buildExprHandlerScript(itemNameList, itemExprList, itemCount, itemOnChangeList, itemOnFocusList); // onchange, onfocus event 처리 부분 for (int i = 0; i < itemCount; i++) { if (MString.checkNull(itemOnFocusList[i]).length() > 0) { itemInputList[i] = MString.replaceAll(itemInputList[i], "$ON_FOCUS", itemOnFocusList[i]); } else { itemInputList[i] = MString.replaceAll(itemInputList[i], "$ON_FOCUS", ""); } if (MString.checkNull(itemOnChangeList[i]).length() > 0) { itemInputList[i] = MString.replaceAll(itemInputList[i], "$ON_CHANGE", "onchange='" + itemOnChangeList[i] + "'"); } else { itemInputList[i] = MString.replaceAll(itemInputList[i], "$ON_CHANGE", ""); } } // ban lower case this.form = form.toLowerCase().replaceAll("width","hh"); this.form = form.replaceAll("width", "hh"); this.inputForm = getInputForm(form, itemInputList, itemNumList); } private void buildExprHandlerScript(String[] itemNameList, String[] itemExprList, int itemCount, String[] itemOnChangeList, String[] itemOnFocusList) { String itemName; String itemExpr; // 수식처리 부분 String itmExpr = ""; String sumSpc = "";// // 최종 결과물 StringTokenizer tmp10 = null; String tmpStart = ""; String tmpEnd = ""; String startTail = ""; int startTailInt = 0; char startCh = 0; String startCharacter = ""; char endCh = 0; String sumType = ""; int startTailResult = 0; String pEnd = ""; String exprToken = ""; StringTokenizer stk99 = null; StringTokenizer stkExpr = null; for(int ii=0;ii 0) {// // SUM(A1:F1) 일경우 itemExpr = MString.replaceAll(itemExpr, "+", " "); itemExpr = MString.replaceAll(itemExpr, "-", " "); itemExpr = MString.replaceAll(itemExpr, "*", " "); itemExpr = MString.replaceAll(itemExpr, "/", " "); itemExpr = MString.replaceAll(itemExpr, "%", " "); itemExpr = MString.replaceAll(itemExpr, "(", " "); itemExpr = MString.replaceAll(itemExpr, ")", " "); itemExpr = MString.replaceAll(itemExpr, "SUM", " "); tmp10 = new StringTokenizer(itemExpr, ":"); tmpStart = MString.replaceAll(tmp10.nextToken(), " ", ""); tmpEnd = MString.replaceAll(tmp10.nextToken(), " ", ""); //SUM(B2:BH2) startTail = ""; startTailInt = 0; startCh = 0; startCharacter = ""; endCh = 0; try { startTail = tmpStart.substring(1, tmpStart.length()); startTailInt = Integer.parseInt(startTail); startCh = tmpStart.charAt(0); startCharacter = tmpStart.substring(0, 1); } catch (Exception e) { startTail = tmpStart.substring(2, tmpStart.length()); startTailInt = Integer.parseInt(startTail); startCh = tmpStart.charAt(1); startCharacter = tmpStart.substring(0, 2); } char tmpch=tmpEnd.charAt(1); if(tmpch>='A' && tmpch<='Z') endCh = tmpEnd.charAt(1); else endCh = tmpEnd.charAt(0); sumType = ""; if (startCh == endCh) { sumType = "v";// // 세로 SUM } else { sumType = "h";// // 가로 SUM } //System.out.println("startCh================================================================================================>"+startCh); ///System.out.println("endCh================================================================================================>"+endCh); //System.out.println("sumType================================================================================================>"+sumType); if (sumType.equals("v")) {// // SUM(A1:A7) 세로 SUM boolean loop = true; int startTailIntVal = startTailInt; int increment = 0; do { if(increment>999) break; startTailResult = startTailIntVal + increment;// // 셀 뒷 숫자 증가 pEnd = startCharacter + "" + startTailResult; if(tmpEnd.equals(pEnd)) loop=false; if(MReport.findName(pEnd, itemNameList) != -1) { sumSpc += pEnd + " "; itemExpr = MString.replaceAll(itemExpr, ":", "+");// // 문자열을 치환하여 매끄럽게 itmExpr = MString.replaceAll(sumSpc.trim(), " ", "+"); } increment++; } while (loop); } else {// // SUM(A1:F1) 형식일 경우 가로 SUM boolean loop = true; startCh--; do { //String startTail= tmpStart.substring(1, tmpStart.length());//// 셀 뒤숫자 startCh += 1;// // 문자 증가 if(startCh>999) break; if ((startCh % 91) == 0) startCh = (char) (startCh + 'A'); pEnd = MReport.getCharacterMake(startCharacter, startCh) + "" + startTailInt; if(tmpEnd.equals(pEnd)) loop=false; if(MReport.findName(pEnd, itemNameList) != -1) { sumSpc += pEnd + " "; itemExpr = MString.replaceAll(itemExpr, ":", "+");// // 문자열을 치환하여 매끄럽게 itmExpr = MString.replaceAll(sumSpc.trim(), " ", "+"); } } while (loop); } itemExpr = sumSpc; } else if (itemExpr.indexOf(",") > 0) {// // SUM(A1,F1) 형식 일 경우 itemExpr = MString.replaceAll(itemExpr, "(", " "); itemExpr = MString.replaceAll(itemExpr, ")", " "); itemExpr = MString.replaceAll(itemExpr, "SUM", " "); stk99 = new StringTokenizer(itemExpr, ","); while (stk99.hasMoreTokens()) { sumSpc += stk99.nextToken() + " "; } itmExpr = MString.replaceAll(sumSpc.trim(), " ", "+"); itemExpr = sumSpc; itemExpr = MString.replaceAll(itemExpr, "-", ""); itemExpr = MString.replaceAll(itemExpr, "+", ""); itemExpr = MString.replaceAll(itemExpr, "*", ""); itemExpr = MString.replaceAll(itemExpr, "/", ""); itemExpr = MString.replaceAll(itemExpr, "%", ""); } else {// // A1+F7 형식일 경우 itemExpr = MString.replaceAll(itemExpr, "+", " "); itemExpr = MString.replaceAll(itemExpr, "-", " "); itemExpr = MString.replaceAll(itemExpr, "*", " "); itemExpr = MString.replaceAll(itemExpr, "/", " "); itemExpr = MString.replaceAll(itemExpr, "%", " "); itemExpr = MString.replaceAll(itemExpr, "(", " "); itemExpr = MString.replaceAll(itemExpr, ")", " "); itemExpr = MString.replaceAll(itemExpr, "SUM", " "); } //System.out.println("********************************************************************** "+itemExpr); //System.out.println("********************************************************************** "+itemName); //System.out.println("********************************************************************** "+itmExpr); stkExpr = new StringTokenizer(itemExpr); int vCount = 0; int errorCount = 0; /* * */ int jj=0,order=0; String[] tmpp=new String[stkExpr.countTokens()]; for(int ii=0;ii 0) { changeAllStrBuf.append("dform."); changeAllStrBuf.append(itemNameList[i]); changeAllStrBuf.append(".value='"); changeAllStrBuf.append(MString.replaceAll(itemExprList[i], "'", "\\\'")); changeAllStrBuf.append("';\n"); } else { changeAllStrBuf.append(" dform."); changeAllStrBuf.append(itemName); changeAllStrBuf.append(".value ="); changeAllStrBuf.append("(Math$round((").append(itmExpr).append(")*100))/100"); changeAllStrBuf.append("; \n"); changeAllStrBuf.append(" if(isNaN(dform."); changeAllStrBuf.append(itemName); changeAllStrBuf.append(".value)) dform."); changeAllStrBuf.append(itemName); changeAllStrBuf.append(".value = '0'; \n"); changeAllStrBuf.append(" if(dform."); changeAllStrBuf.append(itemName); changeAllStrBuf.append(".value=='Infinity' || dform."); changeAllStrBuf.append(itemName); changeAllStrBuf.append(".value=='-Infinity') dform."); changeAllStrBuf.append(itemName); changeAllStrBuf.append(".value = '0'; \n"); } //System.out.println("**********************************************************changeAllStrBuf="+changeAllStrBuf); } } } public String findString(int order,String src,String findStr) { int inx1=0,inx2=0; String ret=""; for(int ii=0;ii-1) inx1+=findStr.length(); else return ""; } return src.substring(0,inx1-findStr.length()); } public String getForm() { return form; } public String getInputForm() { return inputForm; } public String getInputForm(String form, String[] itemInputList, int[] itemNumList) { if (form == null) return null; StringBuilder insertBuf = new StringBuilder(); int tdCount = 0; int stTDIndex; int edTDIndex; int index = 0; while (true) { if (index > itemNumList.length - 1) break; stTDIndex = form.indexOf("", stTDIndex + 1); if (edTDIndex == -1) break; if (tdCount == itemNumList[index] && !MString.isNull(itemInputList[index])) { // 입력 셀 insertBuf.append(form.substring(0, edTDIndex + 1)); insertBuf.append(itemInputList[index]); form = form.substring(edTDIndex + 1, form.length()); index++; } else if (tdCount == itemNumList[index] && MString.isNull(itemInputList[index])) { // 타이틀 셀 insertBuf.append(form.substring(0, edTDIndex)); insertBuf.append(">"); form = form.substring(edTDIndex + 1, form.length()); index++; } else { insertBuf.append(form.substring(0, edTDIndex + 1)); form = form.substring(edTDIndex + 1, form.length()); } tdCount++; } insertBuf.append(form); return insertBuf.toString(); } public String getInputTitleForm(String form) { boolean isDynaTable = false; return getInputTitleForm(form, isDynaTable); } public String getInputTitleForm(String form, boolean isDynaTable) { if (form == null) return null; int stTR = 0; int edTR = 0; int edTREnd = 0; int inIndex = 0; int startIndex = 0; int endIndex = 0; int[] ind=new int[3]; /******************************************************************** inIndex = form.indexOf("-1) min=(min>ind[ii])?ind[ii]:min; } inIndex=min; String inputTitleForm = null; startIndex = form.indexOf("", edTR + 2); if (edTREnd == -1) break; if (stTR < inIndex && inIndex < edTR) { endIndex = stTR; if (isDynaTable) inputTitleForm = form.substring(startIndex, endIndex); else inputTitleForm = form.substring(0, endIndex); break; } } return inputTitleForm; } public String getInputBodyForm(String form) { if (form == null) return ""; // throw new NullPointerException("Given form is null."); int stTR = 0; int edTR = 0; int edTREnd = 0; int firstTR = 0; int lastTR = 0; /****************** 가장 첫 입력란 위치 찾기 ******************/ int inIndex = 0; int lastInIndex = 0; int iptIndex = form.indexOf("= txtIndex) { if (iptIndex >= selIndex) { lastInIndex = iptIndex; } else { lastInIndex = selIndex; } } else { if (iptIndex >= txtIndex) { lastInIndex = iptIndex; } else { lastInIndex = txtIndex; } } String inputBodyForm = null; /************ * 가장 첫 입력란이 들어가 있는 * * 태그 위치 찾기 ***********/ for (int i = 0; true; i++) { stTR = form.indexOf("이 없을때.. 임시 방편 // 원칙은 이 꼭 있어야 한다. if (edTR == -1) { edTR = form.indexOf("", edTR + 2); if (edTREnd == -1) return form; // throw new NullPointerException("End of TR could not be found. form: " + MString.getEllipsis(form, 500)); if (stTR < inIndex && inIndex < edTR) { firstTR = stTR; break; } } if (stTR == -1 || edTR == -1 || edTREnd == -1) return form; // throw new NullPointerException("start TR is null or end TR is null. form: " + MString.getEllipsis(form, 500)); stTR = form.length(); for (int i = 0; true; i++) { stTR = form.lastIndexOf("이 없을때.. 임시 방편 // 원칙은 이 꼭 있어야 한다. if (edTR == -1) { edTR = form.indexOf("", edTR + 2); if (edTREnd == -1) break; if (stTR < lastInIndex && lastInIndex < edTR) { // inputBodyForm = form.substring(stTR, edTREnd+1); lastTR = edTREnd + 1; break; } else if (lastInIndex > edTR) { return form; // throw new NullPointerException("Last Input Index exceeds end TR tag."); } } if (stTR == -1 || edTR == -1 || edTREnd == -1) return form; // throw new NullPointerException("start TR is null or end TR is null."); /************ 가장 마지막 입력란이 들어가 있는 태그 위치 찾기 ***********/ inputBodyForm = form.substring(firstTR, lastTR); // return null; return inputBodyForm; } public String getPutValScript() { return putValStrBuf.toString(); } public String getChangeAllScript() { return changeAllStrBuf.toString(); } public String getChangeAllScript(String baseScript, int endNumber, int rowCount) { if (baseScript.trim().length() == 0) return ""; StringBuilder strbuf = new StringBuilder(); String newScript = ""; int startIndex = 0; int dot = 0; String firstItemName = ""; String formName = "dform."; for (int i = 0; i < rowCount; i++) { newScript = baseScript; while (true) { startIndex = newScript.indexOf(formName); if (startIndex == -1) break; dot = newScript.indexOf(".", startIndex + formName.length()); if (dot == -1) break; firstItemName = newScript.substring(startIndex + formName.length(), dot).replaceAll("[0-9]", "");// [A-Z][a-z] strbuf.append(newScript.substring(0, startIndex + formName.length())); strbuf.append(firstItemName); strbuf.append(endNumber); newScript = newScript.substring(dot, newScript.length()); } endNumber = endNumber + 1; strbuf.append(newScript); } return strbuf.toString(); } public String getChangeAllScript(String baseScript, String[] stItemNameList, String[] stItemNumList, int[] tableColNumList, String[] tableRowList) { //System.out.println("*************************************************************************** base="+baseScript); if (baseScript.trim().length() == 0) return ""; String newScript = ""; String[] baseList = baseScript.split("[.]"); // 기본 스크립트를 .(dot)를 기준으로 각 배열로 나눈다. String cellname = ""; String cellnum = ""; String position = ""; /****************************************************************************** * for문을 사용하여 기본 스크립트를 아래처럼 만든다 cellname = "F,G,H,F,F ...."; cellnum = "5,5,5,6,6 ..."; position = * "1,3,5,7,9 ..."; <- 기본 스크립트 배열에서 각 셀네임이 있던 인덱스 위치 ******************************************************************************/ for (int baseIdx = 0; baseIdx < baseList.length; baseIdx++) { for (int y = 0; y < stItemNameList.length; y++) { if (baseList[baseIdx].equals(stItemNameList[y] + stItemNumList[y])) { if (cellname.length() == 0) { cellname = stItemNameList[y]; cellnum = stItemNumList[y]; position = Integer.toString(baseIdx); } else { cellname = cellname + "," + stItemNameList[y]; cellnum = cellnum + "," + stItemNumList[y]; position = position + "," + Integer.toString(baseIdx); } } } } String[] cellnameList = cellname.split(","); String[] cellnumList = cellnum.split(","); String[] positionList = position.split(","); String newCellname = ""; String newCellnum = ""; String newPosition = ""; int here = 0; /****************************************************************************** * 늘어난 각 테이블의 행 숫자 만큼 그 테이블에 해당하는 cellname과 각 해당하는 cellnum를 만들어서 newCell...으로 만들어 준다. ******************************************************************************/ for (int i = 0; i < tableRowList.length; i++) { for (int stp = 0; stp < Integer.parseInt(tableRowList[i]); stp++) { int gap = 0; int min = minNum(stItemNumList, here, here + tableColNumList[i]); int max = maxNum(stItemNumList, here, here + tableColNumList[i]); if (stp != 0) { gap = getGap(stItemNumList, here, here + tableColNumList[i]); for (int nn = here; nn < stItemNumList.length; nn++) { stItemNumList[nn] = Integer.toString(Integer.parseInt(stItemNumList[nn]) + gap); } for (int b = 0; b < cellnumList.length; b++) { if (min <= Integer.parseInt(cellnumList[b])) cellnumList[b] = Integer.toString(Integer.parseInt(cellnumList[b]) + gap); } } min = minNum(stItemNumList, here, here + tableColNumList[i]); max = maxNum(stItemNumList, here, here + tableColNumList[i]); int startf = 100000; int endf = 0; int readyEnd = 0; for (int a = 0; a < cellnumList.length; a++) { if (min <= Integer.parseInt(cellnumList[a]) && max >= Integer.parseInt(cellnumList[a])) { if (baseList[Integer.parseInt(positionList[a]) + 1].indexOf("=") != -1) { if (startf > a) startf = a; readyEnd = a; } } if (max < Integer.parseInt(cellnumList[a])) { if ((baseList[Integer.parseInt(positionList[a]) + 1]).indexOf("=") != -1) { if (readyEnd > endf) endf = a - 1; } } } if (readyEnd > endf) endf = cellnumList.length - 1; for (int incell = startf; incell <= endf; incell++) { if (newCellname.length() == 0) { newCellname = cellnameList[incell]; newCellnum = cellnumList[incell]; newPosition = positionList[incell]; } else { newCellname = newCellname + "," + cellnameList[incell]; newCellnum = newCellnum + "," + cellnumList[incell]; newPosition = newPosition + "," + positionList[incell]; } } } here = here + tableColNumList[i]; } /*** script로 다시 만들기 ***/ String[] newCellnameList = newCellname.split(","); String[] newCellnumList = newCellnum.split(","); String[] newPositionList = newPosition.split(","); int cellhere = 0; for (int m = 0; m < baseList.length; m++) { if (cellhere < newCellnameList.length && m == Integer.parseInt(newPositionList[cellhere])) { if (baseList[m - 1].indexOf(";") > 0) { String[] tmpS = baseList[m - 1].split(";"); if (baseList[m + 1].indexOf(";") > 0) { String[] tmpE = baseList[m + 1].split(";"); newScript = newScript + tmpS[1] + "." + newCellnameList[cellhere] + newCellnumList[cellhere] + "." + tmpE[0] + ";"; } else { newScript = newScript + tmpS[1] + "." + newCellnameList[cellhere] + newCellnumList[cellhere] + "."; } } else { if (baseList[m + 1].indexOf(";") > 0) { String[] tmpE = baseList[m + 1].split(";"); newScript = newScript + baseList[m - 1] + "." + newCellnameList[cellhere] + newCellnumList[cellhere] + "." + tmpE[0] + ";"; } else { newScript = newScript + baseList[m - 1] + "." + newCellnameList[cellhere] + newCellnumList[cellhere] + "."; } } cellhere++; } if (cellhere < newCellnameList.length && (m + 1) >= baseList.length) m = -1; } newScript.replaceAll("[..]", "[.]"); return newScript; } public int getGap(String[] startNum, int start, int end) { int top = -1; int bottom = 100000; for (int i = start; i < end; i++) { if (bottom > Integer.parseInt(startNum[i])) bottom = Integer.parseInt(startNum[i]); if (top < Integer.parseInt(startNum[i])) top = Integer.parseInt(startNum[i]); } if (top - bottom < 0) return 0; return (top - bottom + 1); } public int minNum(String[] startNum, int start, int end) { int bottom = 100000; for (int i = start; i < end; i++) { if (bottom > Integer.parseInt(startNum[i])) bottom = Integer.parseInt(startNum[i]); } return bottom; } public int maxNum(String[] startNum, int start, int end) { int top = -1; for (int i = start; i < end; i++) { if (top < Integer.parseInt(startNum[i])) top = Integer.parseInt(startNum[i]); } return top; } }