9 changed files with 4 additions and 2924 deletions
@ -1,170 +0,0 @@
|
||||
package com.fr.design.write.submit.batch; |
||||
|
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.xml.GeneralXMLTools; |
||||
import com.fr.js.AbstractJavaScript; |
||||
import com.fr.js.Callback; |
||||
import com.fr.js.JavaScript; |
||||
import com.fr.js.JavaScriptXMLUtils; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.stable.ParameterProvider; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.web.Repository; |
||||
import com.fr.stable.xml.XMLPrintWriter; |
||||
import com.fr.stable.xml.XMLableReader; |
||||
import com.fr.write.batch.SubmitMain; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* Created by loy on 16/8/22. |
||||
*/ |
||||
public class BatchCommit2DBJavaScript extends AbstractJavaScript implements Callback { |
||||
|
||||
public static String RECALCULATE_TAG = "shouldRecalculate"; |
||||
|
||||
/** |
||||
* 回调函数标识 |
||||
*/ |
||||
public static final String CALLBACK = "callback"; |
||||
|
||||
/** |
||||
* 回调参数标识 |
||||
*/ |
||||
public static final String FEEDBACKMAP = "feedbackMap"; |
||||
|
||||
/** |
||||
* javascript所使用的参数 |
||||
*/ |
||||
protected ParameterProvider[] parameters; |
||||
//这个MAP里放的是提交过程生成的参数,比如提交入库,在所有回调事件里,都会将其传递进去,以供解析。
|
||||
protected Map<Object, Object> paraMap = new HashMap<Object, Object>(); |
||||
|
||||
private boolean recalculate; |
||||
|
||||
private List dbManipulationList = new ArrayList(); |
||||
//回调函数
|
||||
private JavaScript callBack; |
||||
|
||||
/** |
||||
* 获取数据入库配置信息 |
||||
*/ |
||||
public List getDBManipulation() { |
||||
return dbManipulationList; |
||||
} |
||||
|
||||
/** |
||||
* 设置数据入库配置信息 |
||||
* |
||||
* @param dbManipulationList 数据库配置信息 |
||||
*/ |
||||
public void setDBManipulation(List dbManipulationList) { |
||||
this.dbManipulationList = dbManipulationList; |
||||
} |
||||
|
||||
/** |
||||
* 回调函数,该函数将在主函数执行完毕以后开始执行 |
||||
*/ |
||||
public JavaScript getCallBack() { |
||||
return callBack; |
||||
} |
||||
|
||||
/** |
||||
* 设置回调函数 |
||||
* |
||||
* @param callback 回调函数 |
||||
*/ |
||||
public void setCallBack(JavaScript callback) { |
||||
this.callBack = callback; |
||||
} |
||||
|
||||
/** |
||||
* JS响应 |
||||
* |
||||
* @param repo 环境 |
||||
* @return 返回生成的JS字符串 |
||||
*/ |
||||
public String actionJS(Repository repo) { |
||||
String dmlconf = GeneralXMLTools.writeXMLableAsString(this); |
||||
if (!this.paraMap.isEmpty() && callBack != null) { |
||||
callBack.addParameterMap(paraMap); |
||||
} |
||||
String js = "var fm = this.options.form;if(fm == null) {fm = new FR.BatchForm()};fm.batchCommit({" + |
||||
"xmlconf" + ":" + JSONObject.quote(dmlconf) + |
||||
(callBack != null ? "," + CALLBACK + ":" + JSONObject.quote(GeneralXMLTools.writeXMLableAsString(callBack)) : "") + |
||||
(this.paraMap.isEmpty() ? "" : "," + FEEDBACKMAP + ":" + new JSONObject(paraMap).toString()) + |
||||
"},this)"; |
||||
return js; |
||||
} |
||||
|
||||
/** |
||||
* 转化为字符串 |
||||
* |
||||
* @return 返回字符串形式 |
||||
*/ |
||||
public String toString() { |
||||
return (dbManipulationList == null) ? StringUtils.EMPTY : dbManipulationList.toString(); |
||||
} |
||||
|
||||
public void writeXML(XMLPrintWriter writer) { |
||||
super.writeXML(writer); |
||||
|
||||
if (this.dbManipulationList != null) { |
||||
for (int i = 0; i < dbManipulationList.size(); i++) { |
||||
((SubmitMain) this.dbManipulationList.get(i)).writeXML(writer); |
||||
} |
||||
|
||||
} |
||||
|
||||
if (this.callBack != null) { |
||||
GeneralXMLTools.writeXMLable(writer, this.callBack, JavaScript.XML_TAG); |
||||
} |
||||
} |
||||
|
||||
public void readXML(XMLableReader reader) { |
||||
super.readXML(reader); |
||||
|
||||
if (reader.isAttr()) { |
||||
dbManipulationList = new ArrayList(); |
||||
} else if (reader.isChildNode()) { |
||||
String tagName = reader.getTagName(); |
||||
if (JavaScript.XML_TAG.equals(tagName)) { |
||||
this.callBack = JavaScriptXMLUtils.readJavaScript(reader); |
||||
} else { |
||||
if ("Attributes".equals(tagName)) { |
||||
dbManipulationList.add(new SubmitMain()); |
||||
} |
||||
if (dbManipulationList.size() > 0) { |
||||
((SubmitMain) dbManipulationList.get(dbManipulationList.size() - 1)).readXML(reader); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
public boolean equals(Object obj) { |
||||
return obj instanceof BatchCommit2DBJavaScript |
||||
&& super.equals(obj) |
||||
&& ComparatorUtils.equals(((BatchCommit2DBJavaScript) obj).callBack, this.callBack) |
||||
&& ComparatorUtils.equals(((BatchCommit2DBJavaScript) obj).dbManipulationList, this.dbManipulationList); |
||||
} |
||||
|
||||
public Object clone() throws CloneNotSupportedException { |
||||
BatchCommit2DBJavaScript cloned = (BatchCommit2DBJavaScript) super.clone(); |
||||
if (this.dbManipulationList != null) { |
||||
cloned.dbManipulationList = new ArrayList(); |
||||
for (int i = 0; i < this.dbManipulationList.size(); i++) { |
||||
cloned.dbManipulationList.add(((SubmitMain) this.dbManipulationList.get(i)).clone()); |
||||
} |
||||
} |
||||
|
||||
if (this.callBack != null) { |
||||
cloned.callBack = (JavaScript) this.callBack.clone(); |
||||
} |
||||
|
||||
return cloned; |
||||
} |
||||
} |
@ -1,186 +0,0 @@
|
||||
package com.fr.design.write.submit.batch; |
||||
|
||||
import com.fr.design.beans.FurtherBasicBeanPane; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.javascript.JavaScriptActionPane; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.general.Inter; |
||||
import com.fr.write.batch.SubmitMain; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by loy on 16/8/22. |
||||
*/ |
||||
public class BatchCommit2DBJavaScriptPane extends FurtherBasicBeanPane<BatchCommit2DBJavaScript> { |
||||
private List dbmPaneList = new ArrayList(); |
||||
private BatchCommitTabbedPane commitTabbedPane; |
||||
private JavaScriptActionPane javaScriptActionPane; |
||||
private UIButton addCallbackButton; |
||||
|
||||
private JPanel cardPane; |
||||
private String[] cardNames; |
||||
|
||||
/** |
||||
* 构造函数,控件事件的提交入库面板 |
||||
*/ |
||||
public BatchCommit2DBJavaScriptPane() { |
||||
init(null); |
||||
} |
||||
|
||||
// public BatchCommit2DBJavaScriptPane(final JavaScriptActionPane javaScriptActionPane, List dbManipulationPaneList) {
|
||||
public BatchCommit2DBJavaScriptPane(final JavaScriptActionPane javaScriptActionPane) { |
||||
// this.dbmPaneList=dbManipulationPaneList;
|
||||
init(javaScriptActionPane); |
||||
} |
||||
|
||||
private void init(final JavaScriptActionPane javaScriptActionPane) { |
||||
this.dbmPaneList.add(new BatchSubmitPane()); |
||||
this.javaScriptActionPane = javaScriptActionPane; |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
commitTabbedPane = new BatchCommitTabbedPane(this, dbmPaneList); |
||||
commitTabbedPane.setPreferredSize(new Dimension(commitTabbedPane.getWidth(), 20)); |
||||
this.add(commitTabbedPane, BorderLayout.NORTH); |
||||
|
||||
cardPane = new JPanel(new CardLayout()); |
||||
cardNames = new String[dbmPaneList.size()]; |
||||
for (int i = 0; i < this.dbmPaneList.size(); i++) { |
||||
if (((BatchSubmitPane) this.dbmPaneList.get(i)).getSubMitName() == null) { |
||||
cardNames[i] = ""; |
||||
} else { |
||||
cardNames[i] = ((BatchSubmitPane) this.dbmPaneList.get(i)).getSubMitName(); |
||||
} |
||||
cardPane.add((BatchSubmitPane) this.dbmPaneList.get(i), cardNames[i]); |
||||
} |
||||
this.add(cardPane, BorderLayout.CENTER); |
||||
|
||||
JPanel btPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); |
||||
this.add(btPane, BorderLayout.SOUTH); |
||||
|
||||
if (javaScriptActionPane != null) { |
||||
addCallbackButton = javaScriptActionPane.createCallButton(); |
||||
btPane.add(addCallbackButton); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 更新DBManipulationPane |
||||
*/ |
||||
public void updateCardPane() { |
||||
cardNames = new String[dbmPaneList.size()]; |
||||
for (int i = 0; i < this.dbmPaneList.size(); i++) { |
||||
if (((BatchSubmitPane) this.dbmPaneList.get(i)).getSubMitName() == null) { |
||||
cardNames[i] = ""; |
||||
} else { |
||||
cardNames[i] = ((BatchSubmitPane) this.dbmPaneList.get(i)).getSubMitName(); |
||||
} |
||||
cardPane.add((BatchSubmitPane) this.dbmPaneList.get(i), cardNames[i]); |
||||
} |
||||
CardLayout cardLayout = (CardLayout) cardPane.getLayout(); |
||||
cardLayout.show(cardPane, cardNames[commitTabbedPane.getSelectedIndex()]); |
||||
} |
||||
|
||||
public void setList(List list) { |
||||
this.dbmPaneList = list; |
||||
} |
||||
|
||||
/** |
||||
* 新建DBManipulationPane |
||||
* |
||||
* @return 新建的DBManipulationPane |
||||
*/ |
||||
public BatchSubmitPane createDBManipulationPane() { |
||||
BatchSubmitPane db = new BatchSubmitPane(); |
||||
// BatchSubmitPane db = javaScriptActionPane.createDBManipulationPane();
|
||||
db.populateBean(null); |
||||
dbmPaneList.add(db); |
||||
return db; |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 窗口名称 |
||||
* |
||||
* @return 返回窗口名称 |
||||
*/ |
||||
public String title4PopupWindow() { |
||||
return Inter.getLocText("Performance-plugin_submitbatch_name"); |
||||
} |
||||
|
||||
/** |
||||
* 界面重置 |
||||
*/ |
||||
public void reset() { |
||||
if (javaScriptActionPane != null) { |
||||
this.javaScriptActionPane.setCall(null); |
||||
} |
||||
//重置后只保留,只留第一个tab
|
||||
while (dbmPaneList.size() > 1) { |
||||
dbmPaneList.remove(1); |
||||
} |
||||
((BatchSubmitPane) dbmPaneList.get(0)).populateBean(null); |
||||
} |
||||
|
||||
@Override |
||||
/** |
||||
* 将JavaBean内的数据输出至界面上 |
||||
*/ |
||||
public void populateBean(BatchCommit2DBJavaScript commit2db) { |
||||
if (commit2db == null) { |
||||
reset(); |
||||
return; |
||||
} |
||||
//先把原来的list清除,然后再根据传入参数重新add
|
||||
dbmPaneList.clear(); |
||||
if (javaScriptActionPane != null) { |
||||
this.javaScriptActionPane.setCall(commit2db.getCallBack()); |
||||
} |
||||
for (int i = 0; i < commit2db.getDBManipulation().size(); i++) { |
||||
BatchSubmitPane dbmp = new BatchSubmitPane(); |
||||
// BatchSubmitPane dbmp = javaScriptActionPane.createDBManipulationPane();
|
||||
dbmp.populateBean((SubmitMain) commit2db.getDBManipulation().get(i)); |
||||
dbmPaneList.add(dbmp); |
||||
} |
||||
commitTabbedPane.refreshTab(); |
||||
} |
||||
|
||||
/** |
||||
* 更新数据层JavaBean |
||||
* |
||||
* @return 返回JavaBean |
||||
*/ |
||||
public BatchCommit2DBJavaScript updateBean() { |
||||
BatchCommit2DBJavaScript commit2dbJavaScript = new BatchCommit2DBJavaScript(); |
||||
|
||||
List dbmaniList = new ArrayList(); |
||||
for (int i = 0; i < this.dbmPaneList.size(); i++) { |
||||
BatchSubmitPane dbmpane = (BatchSubmitPane) this.dbmPaneList.get(i); |
||||
if (i > dbmPaneList.size() - 1) { |
||||
dbmPaneList.add(dbmpane); |
||||
} |
||||
SubmitMain dbManipulation = dbmpane.updateBean(); |
||||
dbmaniList.add(dbManipulation); |
||||
} |
||||
commit2dbJavaScript.setDBManipulation(dbmaniList); |
||||
|
||||
if (javaScriptActionPane != null) { |
||||
commit2dbJavaScript.setCallBack(this.javaScriptActionPane.getCall()); |
||||
} |
||||
|
||||
return commit2dbJavaScript; |
||||
} |
||||
|
||||
/** |
||||
* 判断是否是能接受的数据类型 |
||||
* |
||||
* @param ob 对象 |
||||
* @return 返回是否是能接受的数据类型 |
||||
*/ |
||||
public boolean accept(Object ob) { |
||||
return ob instanceof BatchCommit2DBJavaScript; |
||||
} |
||||
} |
@ -1,529 +0,0 @@
|
||||
package com.fr.design.write.submit.batch; |
||||
|
||||
import com.fr.base.BaseUtils; |
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.Inter; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.awt.event.*; |
||||
import java.awt.geom.*; |
||||
|
||||
/** |
||||
* Created by loy on 16/8/22. |
||||
*/ |
||||
public class BatchCommitTabbedPane extends JComponent implements MouseListener, MouseMotionListener { |
||||
private Icon closeIcon = BaseUtils.readIcon("com/fr/design/images/gui/tab_delete.png"); |
||||
private static final Icon ADD_NORMAL = BaseUtils.readIcon("com/fr/design/images/gui/tab_add_normal.png"); |
||||
private static final Icon ADD_OVER = BaseUtils.readIcon("com/fr/design/images/gui/tab_add_hover.png"); |
||||
private static final Icon ADD_CLICK = BaseUtils.readIcon("com/fr/design/images/gui/tab_add_click.png"); |
||||
private static final Image DESIGN_IMAGE = BaseUtils.readImage("com/fr/design/images/sheet/left_right_btn.png"); |
||||
private static final Icon LEFT_ICON = BaseUtils.createIcon(DESIGN_IMAGE, 0, 0, 14, 14); |
||||
private static final Icon RIGHT_ICON = BaseUtils.createIcon(DESIGN_IMAGE, 14, 0, 14, 14); |
||||
private static final Icon DISABLED_LEFT_ICON = BaseUtils.createIcon(DESIGN_IMAGE, 0, 14, 14, 14); |
||||
private static final Icon DISABLED_RIGHT_ICON = BaseUtils.createIcon(DESIGN_IMAGE, 14, 14, 14, 14); |
||||
private Icon addIcon = ADD_NORMAL; |
||||
|
||||
private static final int TOOLBAR_HEIGHT = 16; // 按钮高度
|
||||
private static final int GAP = 5; //间隔
|
||||
private static final int SMALLGAP = 3; |
||||
|
||||
private static final int FIRST_TAB_POSITION = 20; |
||||
|
||||
|
||||
// 左移和右移按钮
|
||||
private UIButton leftButton; |
||||
private UIButton rightButton; |
||||
|
||||
private JPanel buttonPane; |
||||
|
||||
private java.util.List dbManipulationPaneList ; |
||||
|
||||
private BatchCommit2DBJavaScriptPane commit2DBJavaScriptPane; |
||||
|
||||
// 能显示的tab个数
|
||||
private int showCount = 0; |
||||
|
||||
//选了30度和60度的特殊角度的x,y作为经过的两个点的坐标
|
||||
private double specialLocation1 = 2.5; |
||||
private double specialLocation2 = 4.330127; |
||||
|
||||
private int mouseOveredIndex = -1; |
||||
|
||||
private int selectedIndex = -1; |
||||
|
||||
private static final double CORNOR_RADIUS = 5.0; |
||||
|
||||
|
||||
//tab栏可以放下的每个tab的实际宽度
|
||||
private int tabWidth = 70; |
||||
|
||||
|
||||
//当前标签页栏存放的所有标签页的index
|
||||
private int scrollIndex = 0; |
||||
private int lastOneIndex = 0; |
||||
|
||||
//添加标签位置
|
||||
private int addX = -1; |
||||
private int addY = -1; |
||||
|
||||
|
||||
//各删除标签位置
|
||||
private int[] closeIconStartX; |
||||
|
||||
|
||||
public BatchCommitTabbedPane(BatchCommit2DBJavaScriptPane commit2DBJavaScriptPane, java.util.List dbManipulationPaneList ){ |
||||
this.commit2DBJavaScriptPane = commit2DBJavaScriptPane; |
||||
this.dbManipulationPaneList = dbManipulationPaneList; |
||||
this.setLayout(new BorderLayout(0, 0)); |
||||
this.addMouseListener(this); |
||||
this.addMouseMotionListener(this); |
||||
this.setBorder(null); |
||||
this.setForeground(new Color(99, 99, 99)); |
||||
leftButton = new UIButton(LEFT_ICON) { |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); |
||||
} |
||||
}; |
||||
leftButton.set4ToolbarButton(); |
||||
leftButton.setDisabledIcon(DISABLED_LEFT_ICON); |
||||
rightButton = new UIButton(RIGHT_ICON) { |
||||
public Dimension getPreferredSize() { |
||||
return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); |
||||
} |
||||
}; |
||||
rightButton.set4ToolbarButton(); |
||||
rightButton.setDisabledIcon(DISABLED_RIGHT_ICON); |
||||
buttonPane = new JPanel(new BorderLayout(3, 0)); |
||||
buttonPane.add(rightButton, BorderLayout.EAST); |
||||
buttonPane.add(leftButton, BorderLayout.CENTER); |
||||
this.add(buttonPane, BorderLayout.EAST); |
||||
leftButton.addActionListener(createLeftButtonActionListener()); |
||||
rightButton.addActionListener(createRightButtonActionListener()); |
||||
|
||||
} |
||||
|
||||
private ActionListener createRightButtonActionListener(){ |
||||
return new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
int tabCount = getTabCount(); |
||||
if (lastOneIndex < tabCount && lastOneIndex + showCount <= tabCount) { |
||||
scrollIndex += showCount; |
||||
lastOneIndex += showCount; |
||||
selectedIndex = lastOneIndex; |
||||
} else if(lastOneIndex < tabCount && lastOneIndex + showCount > tabCount){ |
||||
lastOneIndex = tabCount -1; |
||||
scrollIndex = lastOneIndex - showCount; |
||||
selectedIndex = lastOneIndex; |
||||
} |
||||
repaint(); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
private ActionListener createLeftButtonActionListener() { |
||||
return new ActionListener() { |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
if(scrollIndex >= showCount) { |
||||
scrollIndex -= showCount; |
||||
selectedIndex = scrollIndex; |
||||
lastOneIndex -= showCount; |
||||
} else if (scrollIndex > 0 && scrollIndex< showCount){ |
||||
scrollIndex =0; |
||||
selectedIndex = 0; |
||||
lastOneIndex = showCount; |
||||
|
||||
} |
||||
repaint(); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
private void checkButton(boolean buttonEnabled) { |
||||
leftButton.setEnabled(buttonEnabled); |
||||
rightButton.setEnabled(buttonEnabled); |
||||
} |
||||
|
||||
public int getSelectedIndex(){ |
||||
return selectedIndex; |
||||
} |
||||
|
||||
public void paintComponent(Graphics g){ |
||||
super.paintComponent(g); |
||||
double maxWidth = getWidth() - buttonPane.getWidth(); |
||||
Graphics2D g2d = (Graphics2D) g; |
||||
paintBackgroundAndLine(g2d, maxWidth); |
||||
|
||||
} |
||||
|
||||
private void paintBackgroundAndLine(Graphics2D g2d, double maxWidth) { |
||||
//能画的个数
|
||||
showCount = (int) (maxWidth) / tabWidth; |
||||
//计算开始画的最小模板index和最大模板index
|
||||
if (selectedIndex >= dbManipulationPaneList.size()) { |
||||
selectedIndex = dbManipulationPaneList.size() - 1; |
||||
} |
||||
if (selectedIndex < 0) { |
||||
selectedIndex = 0; |
||||
} |
||||
calMinAndMaxIndex(); |
||||
closeIconStartX = new int[lastOneIndex - scrollIndex + 1]; |
||||
|
||||
int startX = 0; |
||||
//从可以开始展示在tab面板上的tab开始画
|
||||
for (int i = scrollIndex; i <= lastOneIndex; i++) { |
||||
BatchSubmitPane dbManipulationPane = (BatchSubmitPane)dbManipulationPaneList.get(i); |
||||
String name ; |
||||
if (dbManipulationPane.getSubMitName() != null){ |
||||
name = dbManipulationPane.getSubMitName(); |
||||
} else { |
||||
name = createName(); |
||||
dbManipulationPane.setSubMitName(name); |
||||
} |
||||
if (i == selectedIndex) { |
||||
closeIconStartX[i - scrollIndex] = paintSelectedTab(g2d, startX,name, i); |
||||
} else { |
||||
closeIconStartX[i - scrollIndex] = paintUnSelectedTab(g2d,startX,name,i); |
||||
} |
||||
startX += tabWidth; |
||||
} |
||||
paintUnderLine(startX, maxWidth, g2d); |
||||
addX = startX + GAP; |
||||
addIcon.paintIcon(this,g2d,addX,0); |
||||
checkButton(getTabCount() > showCount); |
||||
} |
||||
|
||||
public int getTabCount(){ |
||||
return dbManipulationPaneList.size(); |
||||
} |
||||
|
||||
private String createName(){ |
||||
String prefix = Inter.getLocText("FR-Designer-CommitTab_Submit"); |
||||
int count = getTabCount(); |
||||
while (true) { |
||||
//从提交1开始
|
||||
count = count == 0 ? 1 : count; |
||||
String newName = prefix + count; |
||||
boolean repeated = false; |
||||
for (int i= 0;i < getTabCount();i++) { |
||||
if (ComparatorUtils.equals( ((BatchSubmitPane)dbManipulationPaneList.get(i)).getSubMitName(), newName)) { |
||||
repeated = true; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
if (!repeated) { |
||||
return newName; |
||||
} |
||||
|
||||
count++; |
||||
} |
||||
} |
||||
|
||||
|
||||
|
||||
private void paintUnderLine(double startX, double maxWidth, Graphics2D g2d) { |
||||
//画下面的那条线
|
||||
if (startX < maxWidth) { |
||||
GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, 2); |
||||
generalPath.moveTo((float) startX, (float) (getHeight() - 1)); |
||||
generalPath.lineTo((float) maxWidth, (float) (getHeight() - 1)); |
||||
g2d.fill(generalPath); |
||||
g2d.setPaint(UIConstants.LINE_COLOR); |
||||
g2d.draw(new Line2D.Double((float) startX, (float) (getHeight() - 1), (float) maxWidth , (float) (getHeight() - 1))); |
||||
} |
||||
} |
||||
|
||||
|
||||
private void calMinAndMaxIndex() { //如果个数大于最多能容纳的个数,则多余的进行处理
|
||||
|
||||
if (dbManipulationPaneList.size() > showCount) { |
||||
|
||||
if (selectedIndex >= lastOneIndex) { //所点击列表中的标签页处在标签页栏最后一个标签页之后,则标签页栏左移至所点击标签页出现
|
||||
scrollIndex = selectedIndex - showCount + 1; |
||||
lastOneIndex = selectedIndex; |
||||
if (scrollIndex <= 0) { |
||||
scrollIndex = 0; |
||||
lastOneIndex = showCount - 1; |
||||
} |
||||
} else if (selectedIndex <= scrollIndex) { //所点击列表中的标签页处在标签页栏第一个标签页之前,则标签页栏右移至所点击标签页出现
|
||||
|
||||
scrollIndex = selectedIndex; |
||||
lastOneIndex = scrollIndex + showCount - 1; |
||||
if (lastOneIndex > dbManipulationPaneList.size() - 1) { |
||||
lastOneIndex = dbManipulationPaneList.size() - 1; |
||||
} |
||||
} else { |
||||
if (selectedIndex >= dbManipulationPaneList.size() - 1) { |
||||
selectedIndex = dbManipulationPaneList.size() - 1; |
||||
lastOneIndex = selectedIndex; |
||||
scrollIndex = selectedIndex - showCount + 1; |
||||
} else { |
||||
lastOneIndex = scrollIndex + showCount - 1; |
||||
if (lastOneIndex > dbManipulationPaneList.size() - 1) { |
||||
lastOneIndex = dbManipulationPaneList.size() - 1; |
||||
} |
||||
} |
||||
} |
||||
} else { |
||||
scrollIndex = 0; |
||||
lastOneIndex = dbManipulationPaneList.size() - 1; |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 画选中的tab |
||||
* |
||||
* @param g2d |
||||
* @param sheetName |
||||
* @return |
||||
*/ |
||||
private int paintSelectedTab(Graphics2D g2d,int startX, String sheetName, int selfIndex) { |
||||
double[] x = {startX, startX, startX + tabWidth, startX + tabWidth, startX}; |
||||
double[] y = {-1, getHeight(), getHeight(), -1, -1}; |
||||
RoundRectangle2D.Double rect1 = new RoundRectangle2D.Double(startX, 1, this.getWidth(), this.getHeight(), 7, 7); |
||||
g2d.setPaint(new GradientPaint(1, 1, new Color(255, 255, 255), 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); |
||||
|
||||
GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); |
||||
generalPath.moveTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); |
||||
generalPath.curveTo(((float) x[0] + CORNOR_RADIUS - specialLocation1), (y[0] + CORNOR_RADIUS - specialLocation2), ((float) x[0] + CORNOR_RADIUS - specialLocation2), (y[0] + CORNOR_RADIUS - specialLocation1), (double) x[0], y[0] + CORNOR_RADIUS); |
||||
|
||||
for (int index = 1; index <= 2; index++) { |
||||
generalPath.lineTo((float) x[index], (float) y[index]); |
||||
} |
||||
|
||||
generalPath.lineTo((float) x[3], (float) y[3] + CORNOR_RADIUS); |
||||
generalPath.curveTo(((float) x[3] - CORNOR_RADIUS + specialLocation1), ((float) y[3] + CORNOR_RADIUS - specialLocation2), ((float) x[3] - CORNOR_RADIUS + specialLocation2), ((float) y[3] + CORNOR_RADIUS - specialLocation1), (float) x[3] - CORNOR_RADIUS, (float) y[3]); |
||||
generalPath.lineTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); |
||||
|
||||
generalPath.closePath(); |
||||
g2d.fill(generalPath); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g2d.setPaint(UIConstants.LINE_COLOR); |
||||
g2d.draw(new Arc2D.Double(x[0], y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); |
||||
g2d.draw(new Line2D.Double(x[0], y[0] + CORNOR_RADIUS, x[1], y[1])); |
||||
g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); |
||||
g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3] + CORNOR_RADIUS)); |
||||
g2d.draw(new Line2D.Double(x[0] + 3 ,0,x[2] - 3,0)); |
||||
g2d.draw(new Arc2D.Double(x[3] - CORNOR_RADIUS * 2, y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); |
||||
// 画字符
|
||||
g2d.setPaint(getForeground()); |
||||
g2d.drawString(sheetName, startX + 2 * GAP, getHeight()-GAP); |
||||
int closePosition = startX + tabWidth - closeIcon.getIconWidth() - SMALLGAP; |
||||
int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; |
||||
if (canClose() && mouseOveredIndex == selfIndex){ |
||||
closeIcon.paintIcon(this, g2d, closePosition, closeY); |
||||
} |
||||
return closePosition; |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 画没有选中的tab |
||||
* |
||||
* @param g2d |
||||
* @param startX |
||||
* @param sheetName |
||||
* @return |
||||
*/ |
||||
private int paintUnSelectedTab(Graphics2D g2d, int startX, String sheetName, int selfIndex) { |
||||
double[] x = {startX, startX, startX + tabWidth, startX + tabWidth, startX}; |
||||
double[] y = {-1, getHeight() - 1, getHeight() - 1, -1, -1}; |
||||
if (selfIndex == mouseOveredIndex) { |
||||
g2d.setPaint(new GradientPaint(1, 1, new Color(255, 255, 255), 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); |
||||
} else { |
||||
g2d.setPaint(new GradientPaint(1, 1, UIConstants.NORMAL_BACKGROUND, 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); |
||||
} |
||||
|
||||
|
||||
GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); |
||||
generalPath.moveTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); |
||||
generalPath.curveTo(((float) x[0] + CORNOR_RADIUS - specialLocation1), (y[0] + CORNOR_RADIUS - specialLocation2), ((float) x[0] + CORNOR_RADIUS - specialLocation2), (y[0] + CORNOR_RADIUS - specialLocation1), (double) x[0], y[0] + CORNOR_RADIUS); |
||||
|
||||
for (int index = 1; index <= 2; index++) { |
||||
generalPath.lineTo((float) x[index], (float) y[index]); |
||||
} |
||||
|
||||
generalPath.lineTo((float) x[3], (float) y[3] + CORNOR_RADIUS); |
||||
generalPath.curveTo(((float) x[3] - CORNOR_RADIUS + specialLocation1), ((float) y[3] + CORNOR_RADIUS - specialLocation2), ((float) x[3] - CORNOR_RADIUS + specialLocation2), ((float) y[3] + CORNOR_RADIUS - specialLocation1), (float) x[3] - CORNOR_RADIUS, (float) y[3]); |
||||
generalPath.lineTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); |
||||
|
||||
generalPath.closePath(); |
||||
|
||||
g2d.fill(generalPath); |
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g2d.setPaint(UIConstants.LINE_COLOR); |
||||
|
||||
g2d.draw(new Arc2D.Double(x[0], y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); |
||||
g2d.draw(new Line2D.Double(x[0], y[0] + CORNOR_RADIUS, x[1], y[1])); |
||||
g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); |
||||
g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3] + CORNOR_RADIUS)); |
||||
g2d.draw(new Line2D.Double(x[0] + 3 ,0,x[2] - 3,0)); |
||||
g2d.draw(new Arc2D.Double(x[3] - CORNOR_RADIUS * 2, y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); |
||||
|
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); |
||||
// 画字符
|
||||
g2d.setPaint(getForeground()); |
||||
g2d.drawString(sheetName, startX + 2 * GAP, getHeight() - GAP ); |
||||
int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; |
||||
int closePosition = startX + tabWidth - closeIcon.getIconWidth() - SMALLGAP; |
||||
if (canClose() && mouseOveredIndex == selfIndex){ |
||||
closeIcon.paintIcon(this, g2d, closePosition, closeY); |
||||
} |
||||
return closePosition; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 鼠标按下 |
||||
* @param e 事件 |
||||
*/ |
||||
public void mouseClicked(MouseEvent e) { |
||||
} |
||||
|
||||
/** |
||||
* 鼠标按下 |
||||
* @param e 事件 |
||||
*/ |
||||
public void mousePressed(MouseEvent e) { |
||||
int x = e.getX(), y = e.getY(); |
||||
if (addX!= -1 && isOverAddIcon(x, y)){ |
||||
addIcon = ADD_CLICK; |
||||
commit2DBJavaScriptPane.createDBManipulationPane(); |
||||
selectedIndex = dbManipulationPaneList.size()-1; |
||||
commit2DBJavaScriptPane.updateCardPane(); |
||||
} else if (isOverCloseIcon(x)){ |
||||
int re = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(this), Inter.getLocText("FR-Designer-CommitTab_SureToDelete")+ "?", Inter.getLocText("FR-Designer-CommitTab_Remove") |
||||
, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); |
||||
if (re == JOptionPane.OK_OPTION) { |
||||
dbManipulationPaneList.remove(getTabIndex(x)); |
||||
commit2DBJavaScriptPane.setList(dbManipulationPaneList); |
||||
// 删除tab以后,获得第一个tab,再刷新一下,否则画面会停留在已删除的tab上,第一个tab是不可删除的
|
||||
selectedIndex = getTabIndex(FIRST_TAB_POSITION); |
||||
commit2DBJavaScriptPane.updateCardPane(); |
||||
|
||||
} |
||||
} else if (selectedIndex != getTabIndex(x)){ |
||||
selectedIndex = getTabIndex(x); |
||||
commit2DBJavaScriptPane.updateCardPane(); |
||||
} |
||||
repaint(); |
||||
} |
||||
|
||||
/** |
||||
* 鼠标离开 |
||||
* @param e 事件 |
||||
*/ |
||||
public void mouseReleased(MouseEvent e) { |
||||
if(addX != -1 && isOverAddIcon(e.getX(), e.getY())){ |
||||
addIcon = ADD_NORMAL; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 鼠标进入 |
||||
* @param e 事件 |
||||
*/ |
||||
public void mouseEntered(MouseEvent e) { |
||||
} |
||||
|
||||
/** |
||||
* 鼠标离开 |
||||
* @param e 事件 |
||||
*/ |
||||
public void mouseExited(MouseEvent e) { |
||||
mouseOveredIndex = -1; |
||||
repaint(); |
||||
} |
||||
|
||||
/** |
||||
* 鼠标拖动 |
||||
* @param e 事件 |
||||
*/ |
||||
public void mouseDragged(MouseEvent e) { |
||||
} |
||||
|
||||
/** |
||||
* 鼠标移动 |
||||
* @param e 事件 |
||||
*/ |
||||
public void mouseMoved(MouseEvent e) { |
||||
if(addX!= -1 && isOverAddIcon(e.getX(), e.getY())){ |
||||
addIcon = ADD_OVER; |
||||
} else { |
||||
mouseOveredIndex = getTabIndex(e.getX()); |
||||
addIcon = ADD_NORMAL; |
||||
} |
||||
repaint(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 判断鼠标所在Tab |
||||
* @param evtX |
||||
* @return index |
||||
*/ |
||||
private int getTabIndex ( int evtX ){ |
||||
int x = 0; |
||||
for( int i = scrollIndex;i <= lastOneIndex;i++){ |
||||
if(evtX > x && evtX <= x + tabWidth ){ |
||||
return i; |
||||
} |
||||
x = x + tabWidth; |
||||
} |
||||
return -1; |
||||
} |
||||
|
||||
/** |
||||
* 判断鼠标是否在添加按钮上 |
||||
* @param x 鼠标坐标x |
||||
* @param y 鼠标坐标y |
||||
* @return 返回鼠标是否在添加按钮上 |
||||
*/ |
||||
private boolean isOverAddIcon(int x, int y){ |
||||
int addWidth = addIcon.getIconWidth(),addHeight = addIcon.getIconHeight(); |
||||
return x >= addX && x <= addX + addWidth && y > addY && y <= addY + addHeight; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 判断鼠标是否在关闭按钮上 |
||||
* @param evtX x |
||||
* @return 返回鼠标是否在关闭按钮上 |
||||
*/ |
||||
private boolean isOverCloseIcon(int evtX) { |
||||
boolean isOverCloseIcon = false; |
||||
if( canClose()){ |
||||
for (int i = 0; i < closeIconStartX.length; i++) { |
||||
if (evtX >= closeIconStartX[i] && evtX <= closeIconStartX[i] + closeIcon.getIconWidth()) { |
||||
isOverCloseIcon = true; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
return isOverCloseIcon; |
||||
} |
||||
|
||||
/** |
||||
* 如果tab只剩下最后一个,则不画删除按钮 |
||||
* @return 返回当前tab还可否关闭 |
||||
*/ |
||||
private boolean canClose(){ |
||||
return closeIconStartX.length > 1; |
||||
} |
||||
|
||||
/** |
||||
* 刷新tab,停留在第一个tab上面 |
||||
*/ |
||||
public void refreshTab(){ |
||||
selectedIndex = getTabIndex(FIRST_TAB_POSITION); |
||||
commit2DBJavaScriptPane.updateCardPane(); |
||||
} |
||||
} |
@ -1,23 +0,0 @@
|
||||
package com.fr.design.write.submit.batch; |
||||
|
||||
import com.fr.design.beans.FurtherBasicBeanPane; |
||||
import com.fr.design.fun.impl.AbstractJavaScriptActionProvider; |
||||
import com.fr.design.javascript.JavaScriptActionPane; |
||||
import com.fr.js.JavaScript; |
||||
|
||||
/** |
||||
* Created by loy on 16/8/22. |
||||
*/ |
||||
public class BatchJavaScriptActionProvider extends AbstractJavaScriptActionProvider { |
||||
|
||||
@Override |
||||
public FurtherBasicBeanPane<? extends JavaScript> getJavaScriptActionPane() { |
||||
return new BatchCommit2DBJavaScriptPane(); |
||||
} |
||||
|
||||
@Override |
||||
public FurtherBasicBeanPane<? extends JavaScript> getJavaScriptActionPane(JavaScriptActionPane pane) { |
||||
return new BatchCommit2DBJavaScriptPane(pane); |
||||
} |
||||
|
||||
} |
File diff suppressed because it is too large
Load Diff
@ -1,42 +0,0 @@
|
||||
package com.fr.design.write.submit.batch; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.fun.impl.AbstractSubmitProvider; |
||||
import com.fr.general.Inter; |
||||
|
||||
/** |
||||
* Created by loy on 16/8/13. |
||||
*/ |
||||
public class BatchSubmitProvider extends AbstractSubmitProvider { |
||||
private volatile static BatchSubmitProvider instance; |
||||
|
||||
public static BatchSubmitProvider getInstance() { |
||||
if (instance == null) { |
||||
synchronized (BatchSubmitProvider.class) { |
||||
if (instance == null) { |
||||
instance = new BatchSubmitProvider(); |
||||
} |
||||
} |
||||
} |
||||
return instance; |
||||
} |
||||
@Override |
||||
public BasicBeanPane appearanceForSubmit() { |
||||
return new SmartInsertBatchSubmitPane(); |
||||
} |
||||
|
||||
@Override |
||||
public String dataForSubmit() { |
||||
return Inter.getLocText("Performance-plugin_submitbatch_name"); |
||||
} |
||||
|
||||
@Override |
||||
public String keyForSubmit() { |
||||
return "submitbatch"; |
||||
} |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return 1; |
||||
} |
||||
} |
@ -1,591 +0,0 @@
|
||||
package com.fr.design.write.submit.batch; |
||||
|
||||
import com.fr.cache.list.IntList; |
||||
import com.fr.data.ClassSubmitJob; |
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.cell.smartaction.AbstractSmartJTablePaneAction; |
||||
import com.fr.design.cell.smartaction.SmartJTablePane; |
||||
import com.fr.design.cell.smartaction.SmartJTablePaneAction; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.editor.ValueEditorPaneFactory; |
||||
import com.fr.design.gui.controlpane.NameObjectCreator; |
||||
import com.fr.design.gui.controlpane.NameableCreator; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.ispinner.UIBasicSpinner; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.mainframe.ElementCasePane; |
||||
import com.fr.design.mainframe.JTemplate; |
||||
import com.fr.design.mainframe.JWorkBook; |
||||
import com.fr.design.selection.SelectionEvent; |
||||
import com.fr.design.selection.SelectionListener; |
||||
import com.fr.design.write.submit.CustomSubmitJobPane; |
||||
import com.fr.design.write.submit.SmartInsertDMLJobPane; |
||||
import com.fr.design.write.submit.SubmitJobListPane; |
||||
import com.fr.general.Inter; |
||||
import com.fr.grid.selection.CellSelection; |
||||
import com.fr.grid.selection.FloatSelection; |
||||
import com.fr.grid.selection.Selection; |
||||
import com.fr.stable.ColumnRow; |
||||
import com.fr.stable.ColumnRowGroup; |
||||
import com.fr.write.DMLConfigJob; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.table.DefaultTableCellRenderer; |
||||
import javax.swing.table.TableCellRenderer; |
||||
import javax.swing.table.TableColumn; |
||||
import java.awt.*; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* Created by loy on 16/8/16. |
||||
*/ |
||||
public class SmartInsertBatchSubmitPane extends BatchSubmitPane { |
||||
private static final Selection NO_SELECTION = new CellSelection(-1, -1, -1, -1); |
||||
private ElementCasePane ePane; |
||||
private static int CELL_GROUP_LIMIT = 6; |
||||
|
||||
public SmartInsertBatchSubmitPane(ElementCasePane ePane) { |
||||
super(ValueEditorPaneFactory.extendedCellGroupEditors()); |
||||
this.ePane = ePane; |
||||
} |
||||
|
||||
public SmartInsertBatchSubmitPane() { |
||||
super(ValueEditorPaneFactory.extendedCellGroupEditors()); |
||||
JTemplate jTemplate = DesignerContext.getDesignerFrame().getSelectedJTemplate(); |
||||
this.ePane = ((JWorkBook) jTemplate).getEditingElementCasePane(); |
||||
} |
||||
|
||||
@Override |
||||
protected SubmitJobListPane createSubmitJobListPane() { |
||||
return new SmartInsertSubmitJobListPane(); |
||||
} |
||||
|
||||
class SmartInsertSubmitJobListPane extends SubmitJobListPane { |
||||
|
||||
public SmartInsertSubmitJobListPane() { |
||||
super(ePane); |
||||
} |
||||
|
||||
public void hideParentDialog() { |
||||
hideDialog4AddCellAction(); |
||||
} |
||||
|
||||
public void showParentDialog() { |
||||
showDialogAfterAddCellAction(); |
||||
} |
||||
|
||||
@Override |
||||
public NameableCreator[] createNameableCreators() { |
||||
return new NameableCreator[] { |
||||
new NameObjectCreator(Inter.getLocText(new String[]{"Submit", "Event"}), |
||||
"/com/fr/web/images/reportlet.png", |
||||
DMLConfigJob.class, |
||||
SmartInsertDMLJobPane.class), |
||||
new NameObjectCreator(Inter.getLocText(new String[]{"Custom", "Event"}), |
||||
"/com/fr/web/images/reportlet.png", |
||||
ClassSubmitJob.class, |
||||
CustomSubmitJobPane.class) }; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected UpdateAction[] getActions() { |
||||
return new UpdateAction[] { |
||||
new BatchSubmitPane.SmartAddFieldsAction(), |
||||
new BatchSubmitPane.AddFieldAction(), |
||||
new SmartAddCellAction(), |
||||
new SmartAddCellGroupAction(), |
||||
new BatchModCellAction(), |
||||
new BatchSubmitPane.RemoveFieldAction() |
||||
}; |
||||
} |
||||
|
||||
public class BatchModCellAction extends UpdateAction { |
||||
public BatchModCellAction() { |
||||
this.setName(Inter.getLocText("RWA-Batch_Modify_Cells")); |
||||
} |
||||
|
||||
/** |
||||
* 执行事件 |
||||
* @param evt 事件对象 |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
BasicPane bPane = new BasicPane() { |
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return Inter.getLocText("RWA-Batch_Modify_Cells"); |
||||
} |
||||
}; |
||||
bPane.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
bPane.setBorder(BorderFactory.createEmptyBorder(30, 0, 0, 0)); |
||||
final UIBasicSpinner columnSpinner = new UIBasicSpinner(); |
||||
final UIBasicSpinner rowSpinner = new UIBasicSpinner(); |
||||
Component[][] coms = new Component[][] { { new UILabel(Inter.getLocText("RWA-Row_Offset")), rowSpinner },{ new UILabel(Inter.getLocText("RWA-Column_Offset")), columnSpinner } }; |
||||
double p = TableLayout.PREFERRED; |
||||
double f = TableLayout.FILL; |
||||
bPane.add(TableLayoutHelper.createTableLayoutPane(coms, new double[]{p, p}, new double[]{p, f}), BorderLayout.NORTH); |
||||
BasicDialog dlg = bPane.showSmallWindow(SwingUtilities.getWindowAncestor(SmartInsertBatchSubmitPane.this), new DialogActionAdapter() { |
||||
public void doOk() { |
||||
int row_offset = ((Number)rowSpinner.getValue()).intValue(); |
||||
int column_offset = ((Number)columnSpinner.getValue()).intValue(); |
||||
BatchSubmitPane.KeyColumnTableModel model = (BatchSubmitPane.KeyColumnTableModel)keyColumnValuesTable.getModel(); |
||||
int[] selectedRows = keyColumnValuesTable.getSelectedRows(); |
||||
// 如果一行都没选中,取所有的行
|
||||
if (selectedRows.length == 0) { |
||||
selectedRows = IntList.range(model.getRowCount()); |
||||
} |
||||
for (int i = 0; i < selectedRows.length; i++) { |
||||
int row = selectedRows[i]; |
||||
BatchSubmitPane.KeyColumnNameValue kcnv = model.getKeyColumnNameValue(row); |
||||
if (kcnv.cv.obj instanceof ColumnRow) { |
||||
ColumnRow or = (ColumnRow)kcnv.cv.obj; |
||||
int n_column = or.getColumn() + column_offset; |
||||
if (n_column < 0) { |
||||
n_column = 0; |
||||
} |
||||
int n_row = or.getRow() + row_offset; |
||||
if (n_row < 0) { |
||||
n_row = 0; |
||||
} |
||||
kcnv.cv.obj = ColumnRow.valueOf(n_column, n_row); |
||||
} |
||||
} |
||||
model.fireTableDataChanged(); |
||||
keyColumnValuesTable.validate(); |
||||
for (int i = 0; i < selectedRows.length; i++) { |
||||
keyColumnValuesTable.addRowSelectionInterval(selectedRows[i], selectedRows[i]); |
||||
} |
||||
} |
||||
}); |
||||
dlg.setVisible(true); |
||||
} |
||||
} |
||||
|
||||
public class SmartAddCellAction extends UpdateAction { |
||||
public SmartAddCellAction() { |
||||
this.setName(Inter.getLocText("RWA-Smart_Add_Cells")); |
||||
} |
||||
|
||||
/** |
||||
* 执行事件 |
||||
* @param evt 事件s |
||||
*/ |
||||
public void actionPerformed(ActionEvent evt) { |
||||
|
||||
// Grid.GridSelectionListener
|
||||
if (ePane == null) { |
||||
return; |
||||
} |
||||
|
||||
/* |
||||
* 布局 |
||||
*/ |
||||
BasicPane bPane = new SmartJTablePane4DB(keyColumnValuesTable.getTableModel4SmartAddCell(), ePane); |
||||
|
||||
// ReportWriteAttrDialog.this.setVisible(false);
|
||||
hideDialog4AddCellAction(); |
||||
/* |
||||
* 当前的ReportPane不可编辑,不可切换Sheet,加GridSelectionChangeListener |
||||
*/ |
||||
ePane.setSelection(NO_SELECTION); |
||||
ePane.setEditable(false); |
||||
ePane.getGrid().setNotShowingTableSelectPane(false); |
||||
|
||||
BasicDialog dlg = bPane.showWindow(SwingUtilities.getWindowAncestor(SmartInsertBatchSubmitPane.this)); |
||||
|
||||
dlg.setModal(false); |
||||
dlg.setVisible(true); |
||||
} |
||||
} |
||||
|
||||
public class SmartAddCellGroupAction extends UpdateAction { |
||||
public SmartAddCellGroupAction() { |
||||
this.setName(Inter.getLocText("RWA-Smart_Add_Cell_Group")); |
||||
} |
||||
|
||||
/** |
||||
* 智能添加单元格组 |
||||
* @param e 事件s |
||||
*/ |
||||
public void actionPerformed(ActionEvent e) { |
||||
if (ePane == null) { |
||||
return; |
||||
} |
||||
|
||||
BasicPane bPane = new SmartJTablePane4DB(keyColumnValuesTable.getTableModel4SmartAddCell(), ePane, true); |
||||
|
||||
// ReportWriteAttrDialog.this.setVisible(false);
|
||||
hideDialog4AddCellAction(); |
||||
/* |
||||
* 当前的ReportPane不可编辑,不可切换Sheet,加GridSelectionChangeListener |
||||
*/ |
||||
ePane.setSelection(NO_SELECTION); |
||||
ePane.setEditable(false); |
||||
ePane.getGrid().setNotShowingTableSelectPane(false); |
||||
|
||||
BasicDialog dlg = bPane.showWindow(SwingUtilities.getWindowAncestor(SmartInsertBatchSubmitPane.this)); |
||||
|
||||
dlg.setModal(false); |
||||
dlg.setVisible(true); |
||||
} |
||||
} |
||||
|
||||
private void showDialogAfterAddCellAction() { |
||||
Container dialog = this; |
||||
if (parentPane != null && parentPane.getContentDBManiPane() instanceof SmartInsertBatchSubmitPane && parentPane.getContentDBManiPane() != this) { |
||||
((SmartInsertBatchSubmitPane)parentPane.getContentDBManiPane()).showDialogAfterAddCellAction(); |
||||
} |
||||
while (dialog.getParent() != null) { |
||||
dialog = dialog.getParent(); |
||||
if (dialog instanceof SmartInsertSubmitJobListPane) { |
||||
((SmartInsertSubmitJobListPane)dialog).showParentDialog(); |
||||
} else if (dialog instanceof Dialog) { |
||||
dialog.setVisible(true); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void hideDialog4AddCellAction() { |
||||
Container dialog = this; |
||||
if (parentPane != null && parentPane.getContentDBManiPane() instanceof SmartInsertBatchSubmitPane && parentPane.getContentDBManiPane() != this) { |
||||
((SmartInsertBatchSubmitPane)parentPane.getContentDBManiPane()).hideDialog4AddCellAction(); |
||||
} |
||||
while (dialog.getParent() != null) { |
||||
dialog = dialog.getParent(); |
||||
if (dialog instanceof SmartInsertSubmitJobListPane) { |
||||
((SmartInsertSubmitJobListPane)dialog).hideParentDialog(); |
||||
} else if (dialog instanceof Dialog) { |
||||
// 条件属性中添加的控件的话有两层dialog,需要都隐藏
|
||||
dialog.setVisible(false); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 检测是否合法 |
||||
* @throws Exception |
||||
*/ |
||||
public void checkValid() throws Exception { |
||||
BatchSubmitPane.KeyColumnTableModel model = (BatchSubmitPane.KeyColumnTableModel)keyColumnValuesTable.getModel(); |
||||
int cnt = model.getRowCount(); |
||||
int groupLength = -1; |
||||
for (int i=0; i<cnt; i++) { |
||||
BatchSubmitPane.KeyColumnNameValue kcv = model.getKeyColumnNameValue(i); |
||||
Object val = kcv.cv.obj; |
||||
if (val instanceof ColumnRowGroup) { |
||||
int len = ((ColumnRowGroup) val).getSize(); |
||||
if (groupLength < 0) { |
||||
groupLength = len; |
||||
} else if (len != groupLength) { |
||||
throw new Exception(Inter.getLocText("Report-Write_Attributes_Group_Warning")); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
private boolean possibleParentContainer(Container p) { |
||||
return p instanceof Dialog || p instanceof BasicPane || |
||||
p instanceof JPanel || p instanceof JRootPane || p instanceof JLayeredPane; |
||||
} |
||||
|
||||
private class SmartJTablePane4DB extends SmartJTablePane { |
||||
|
||||
// 是否是单元格组
|
||||
private boolean isCellGroup = false; |
||||
|
||||
// 单元格组要记录下之前的选中情况
|
||||
private CellSelection oriCellSelection = null; |
||||
|
||||
public SmartJTablePane4DB(BatchSubmitPane.KeyColumnTableModel model, ElementCasePane actionReportPane) { |
||||
this(model, actionReportPane, false); |
||||
} |
||||
|
||||
public SmartJTablePane4DB(BatchSubmitPane.KeyColumnTableModel model, ElementCasePane actionReportPane, boolean isCellGroup) { |
||||
super(model, actionReportPane); |
||||
this.isCellGroup = isCellGroup; |
||||
this.setCellRenderer(); |
||||
this.changeGridSelectionChangeListener(isCellGroup ? groupListener : listener); |
||||
this.changeSmartJTablePaneAction(a); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
if (isCellGroup) { |
||||
return Inter.getLocText("RWA-Smart_Add_Cell_Group"); |
||||
} else { |
||||
return Inter.getLocText("RWA-Smart_Add_Cells"); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void setCellRenderer() { |
||||
/* |
||||
* set Width |
||||
*/ |
||||
TableColumn column0 = table.getColumnModel().getColumn(0); |
||||
column0.setMaxWidth(40); |
||||
/* |
||||
* 设置Column 1的Renderer |
||||
*/ |
||||
TableColumn column1 = table.getColumnModel().getColumn(1); |
||||
column1.setCellRenderer(new BatchSubmitPane.ColumnNameTableCellRenderer()); |
||||
|
||||
/* |
||||
* 设置Column 2的Renderer |
||||
*/ |
||||
TableColumn column2 = table.getColumnModel().getColumn(2); |
||||
// column2.setCellRenderer(new SelectedColumnValueTableCellRenderer());
|
||||
|
||||
if (isCellGroup) { |
||||
column2.setCellRenderer(new ColumnRowGroupCellRenderer2()); |
||||
column2.setCellEditor(new BatchSubmitPane.ColumnValueEditor(ValueEditorPaneFactory.cellGroupEditor())); |
||||
} else { |
||||
column2.setCellRenderer(new SelectedColumnValueTableCellRenderer()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 检查是否合法 |
||||
* @throws Exception |
||||
*/ |
||||
public void checkValid() throws Exception { |
||||
SmartInsertBatchSubmitPane.this.checkValid(); |
||||
} |
||||
|
||||
private SelectionListener listener = new SelectionListener() { |
||||
|
||||
@Override |
||||
public void selectionChanged(SelectionEvent e) { |
||||
BatchSubmitPane.KeyColumnTableModel model = (BatchSubmitPane.KeyColumnTableModel)table.getModel(); |
||||
if (editingRowIndex < 0 || editingRowIndex >= model.getRowCount()) { |
||||
return; |
||||
} |
||||
BatchSubmitPane.KeyColumnNameValue kcv = model.getKeyColumnNameValue(editingRowIndex); |
||||
ElementCasePane currentReportPane = (ElementCasePane)e.getSource(); |
||||
Selection selection = currentReportPane.getSelection(); |
||||
if (selection == NO_SELECTION || selection instanceof FloatSelection) { |
||||
return; |
||||
} |
||||
CellSelection cellselection = (CellSelection)selection; |
||||
kcv.cv.obj = ColumnRow.valueOf(cellselection.getColumn(), cellselection.getRow()); |
||||
|
||||
if (editingRowIndex >= model.getRowCount() - 1) { |
||||
setEditingRowIndex(0); |
||||
} else { |
||||
setEditingRowIndex(editingRowIndex + 1); |
||||
} |
||||
|
||||
model.fireTableDataChanged(); |
||||
|
||||
} |
||||
|
||||
}; |
||||
|
||||
/** |
||||
* 单元格组的点选格子事件 |
||||
*/ |
||||
private SelectionListener groupListener = new SelectionListener() { |
||||
@Override |
||||
public void selectionChanged(SelectionEvent e) { |
||||
BatchSubmitPane.KeyColumnTableModel model = (BatchSubmitPane.KeyColumnTableModel)table.getModel(); |
||||
if (editingRowIndex < 0 || editingRowIndex >= model.getRowCount()) { |
||||
return; |
||||
} |
||||
BatchSubmitPane.KeyColumnNameValue kcv = model.getKeyColumnNameValue(editingRowIndex); |
||||
ElementCasePane currentReportPane = (ElementCasePane)e.getSource(); |
||||
Selection selection = currentReportPane.getSelection(); |
||||
if (selection == NO_SELECTION || selection instanceof FloatSelection) { |
||||
return; |
||||
} |
||||
CellSelection cellselection = (CellSelection)selection; |
||||
Object oriValue = kcv.cv.obj; |
||||
ColumnRowGroup newValue = getColumnRowGroupValue(oriValue); |
||||
|
||||
// 要考虑多选的情况 要结合之前的看看 可能是增加 也可能需要减少
|
||||
ColumnRowGroup add = new ColumnRowGroup(); |
||||
int removeCount = 0; |
||||
if (oriCellSelection != null && sameStartPoint(cellselection, oriCellSelection)) { |
||||
removeCount = dealDragSelection(add, cellselection); |
||||
} else if (cellselection.getSelectedType() == CellSelection.CHOOSE_ROW || cellselection.getSelectedType() == CellSelection.CHOOSE_COLUMN) { |
||||
dealSelectColRow(add, cellselection); |
||||
} else { |
||||
add.addColumnRow(ColumnRow.valueOf(cellselection.getColumn(), cellselection.getRow())); |
||||
} |
||||
|
||||
if (add.getSize() > 0) { |
||||
newValue.addAll(add); |
||||
} else if (removeCount > 0) { |
||||
newValue.splice(newValue.getSize()-removeCount, removeCount); |
||||
} |
||||
|
||||
kcv.cv.obj = newValue; |
||||
|
||||
model.fireTableDataChanged(); |
||||
|
||||
oriCellSelection = cellselection; |
||||
} |
||||
|
||||
private ColumnRowGroup getColumnRowGroupValue(Object oriValue) { |
||||
ColumnRowGroup newValue = new ColumnRowGroup(); |
||||
if (oriValue instanceof ColumnRowGroup) { |
||||
newValue.addAll((ColumnRowGroup)oriValue); |
||||
} else if (oriValue instanceof ColumnRow) { |
||||
newValue.addColumnRow((ColumnRow) oriValue); |
||||
} |
||||
return newValue; |
||||
} |
||||
|
||||
private boolean sameStartPoint(CellSelection cs1, CellSelection cs2) { |
||||
return cs1.getColumn() == cs2.getColumn() && cs1.getRow() == cs2.getRow(); |
||||
} |
||||
|
||||
private int dealDragSelection(ColumnRowGroup add, CellSelection cellselection) { |
||||
int removeCount = 0; |
||||
if (cellselection.getRowSpan() == oriCellSelection.getRowSpan() + 1) { |
||||
for (int i=0; i<cellselection.getColumnSpan(); i++) { |
||||
add.addColumnRow(ColumnRow.valueOf( |
||||
cellselection.getColumn() + i, cellselection.getRow() + cellselection.getRowSpan() -1)); |
||||
} |
||||
} else if (cellselection.getRowSpan() == oriCellSelection.getRowSpan() - 1) { |
||||
removeCount = cellselection.getColumnSpan(); |
||||
} else if (cellselection.getColumnSpan() == oriCellSelection.getColumnSpan() + 1) { |
||||
for (int i=0; i<cellselection.getRowSpan(); i++) { |
||||
add.addColumnRow(ColumnRow.valueOf( |
||||
cellselection.getColumn() + cellselection.getColumnSpan() - 1, cellselection.getRow() + i)); |
||||
} |
||||
} else if (cellselection.getColumnSpan() == oriCellSelection.getColumnSpan() - 1) { |
||||
removeCount = cellselection.getRowSpan(); |
||||
} |
||||
return removeCount; |
||||
} |
||||
|
||||
private void dealSelectColRow(ColumnRowGroup add, CellSelection se) { |
||||
int c = se.getColumn(), cs = se.getColumnSpan(), |
||||
r = se.getRow(), rs = se.getRowSpan(); |
||||
for (int i=0; i<cs; i++) { |
||||
for (int j=0; j<rs; j++) { |
||||
add.addColumnRow(ColumnRow.valueOf(c+i, r+j)); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
|
||||
private SmartJTablePaneAction a = new AbstractSmartJTablePaneAction(this, SmartInsertBatchSubmitPane.this) { |
||||
@Override |
||||
public void doOk() { |
||||
} |
||||
|
||||
@Override |
||||
public void showDialog() { |
||||
Container container = SmartJTablePane4DB.this; |
||||
while (container.getParent() != null) { |
||||
container = container.getParent(); |
||||
if (container instanceof JDialog) { |
||||
container.setVisible(false); |
||||
} |
||||
} |
||||
updateUpdateCheckBoxEnable(); |
||||
((SmartInsertBatchSubmitPane)dialog).showDialogAfterAddCellAction(); |
||||
} |
||||
}; |
||||
|
||||
/* |
||||
* ColumnValueTableCellRenderer |
||||
*/ |
||||
private class SelectedColumnValueTableCellRenderer extends DefaultTableCellRenderer { |
||||
@Override |
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { |
||||
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); |
||||
|
||||
if (value instanceof BatchSubmitPane.ColumnValue) { |
||||
if (((BatchSubmitPane.ColumnValue)value).obj != null) { |
||||
this.setText(((BatchSubmitPane.ColumnValue)value).obj.toString()); |
||||
} else { |
||||
this.setText(""); |
||||
} |
||||
} |
||||
|
||||
if (row == SmartJTablePane4DB.this.editingRowIndex) { |
||||
this.setBackground(Color.cyan); |
||||
} else { |
||||
this.setBackground(Color.white); |
||||
} |
||||
|
||||
return this; |
||||
} |
||||
} |
||||
|
||||
private class ColumnRowGroupCellRenderer implements TableCellRenderer { |
||||
|
||||
@Override |
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, |
||||
boolean hasFocus, int row, int column) { |
||||
JPanel pane = new JPanel(); |
||||
UILabel text = new UILabel(); |
||||
|
||||
String tip = Inter.getLocText("FR-Designer_Double_Click_Edit_OR_Clear"); |
||||
|
||||
if (value instanceof BatchSubmitPane.ColumnValue) { |
||||
Object cv = ((BatchSubmitPane.ColumnValue) value).obj; |
||||
if (cv instanceof ColumnRowGroup && ((ColumnRowGroup)cv).getSize() >= CELL_GROUP_LIMIT) { |
||||
text.setText("[" + Inter.getLocText(new String[]{"Has_Selected", "Classifier-Ge", "Cell"}, |
||||
new String[]{((ColumnRowGroup)cv).getSize()+"", ""}) + "]"); |
||||
tip = cv.toString() + " " + tip; |
||||
} else if (cv != null) { |
||||
text.setText(cv.toString()); |
||||
} else { |
||||
text.setText(""); |
||||
} |
||||
} |
||||
|
||||
if (row == SmartJTablePane4DB.this.editingRowIndex) { |
||||
pane.setBackground(Color.cyan); |
||||
} else { |
||||
pane.setBackground(Color.white); |
||||
} |
||||
|
||||
pane.setToolTipText(tip); |
||||
pane.add(text); |
||||
|
||||
return pane; |
||||
} |
||||
} |
||||
|
||||
private class ColumnRowGroupCellRenderer2 extends DefaultTableCellRenderer { |
||||
@Override |
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { |
||||
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); |
||||
|
||||
String tip = Inter.getLocText("FR-Designer_Double_Click_Edit_OR_Clear"); |
||||
|
||||
if (value instanceof BatchSubmitPane.ColumnValue) { |
||||
Object cv = ((BatchSubmitPane.ColumnValue) value).obj; |
||||
if (cv instanceof ColumnRowGroup && ((ColumnRowGroup)cv).getSize() >= CELL_GROUP_LIMIT) { |
||||
this.setText("[" + Inter.getLocText(new String[]{"Has_Selected", "Classifier-Ge", "Cell"}, |
||||
new String[]{((ColumnRowGroup)cv).getSize()+"", ""}) + "]"); |
||||
tip = cv.toString() + " " + tip; |
||||
} else if (cv != null) { |
||||
this.setText(cv.toString()); |
||||
} else { |
||||
this.setText(""); |
||||
} |
||||
} |
||||
|
||||
this.setToolTipText(tip); |
||||
|
||||
if (row == SmartJTablePane4DB.this.editingRowIndex) { |
||||
this.setBackground(Color.cyan); |
||||
} else { |
||||
this.setBackground(Color.white); |
||||
} |
||||
|
||||
return this; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,288 +0,0 @@
|
||||
package com.fr.design.write.submit.batch.service; |
||||
|
||||
import com.fr.base.*; |
||||
import com.fr.data.NetworkHelper; |
||||
import com.fr.data.core.db.DBUtils; |
||||
import com.fr.data.impl.NameDatabaseConnection; |
||||
import com.fr.design.write.submit.batch.BatchCommit2DBJavaScript; |
||||
import com.fr.form.ui.WebContentUtils; |
||||
import com.fr.general.xml.GeneralXMLTools; |
||||
import com.fr.js.JavaScript; |
||||
import com.fr.json.JSONException; |
||||
import com.fr.json.JSONFunction; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.ColumnRow; |
||||
import com.fr.stable.ParameterProvider; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.UtilEvalError; |
||||
import com.fr.stable.fun.impl.NoSessionIDOPService; |
||||
import com.fr.stable.script.NameSpace; |
||||
import com.fr.web.RepositoryDeal; |
||||
import com.fr.web.core.ReportSessionIDInfor; |
||||
import com.fr.web.core.SessionDealWith; |
||||
import com.fr.web.core.SessionIDInfor; |
||||
import com.fr.web.utils.WebUtils; |
||||
import com.fr.write.batch.SubmitMain; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.sql.Connection; |
||||
import java.util.HashMap; |
||||
import java.util.Iterator; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* Created by loy on 16/8/23. |
||||
*/ |
||||
public class BatchDBCommitService extends NoSessionIDOPService { |
||||
private static BatchDBCommitService service = null; |
||||
|
||||
public static final String ARG_XMLCONF = "xmlconf"; |
||||
public static final String ARG_SESSIONID = "sessionID"; |
||||
|
||||
/** |
||||
* 构造 |
||||
* |
||||
* @return |
||||
*/ |
||||
public static BatchDBCommitService getInstance() { |
||||
if (service == null) { |
||||
service = new BatchDBCommitService(); |
||||
} |
||||
|
||||
return service; |
||||
} |
||||
|
||||
/** |
||||
* OP值 |
||||
* |
||||
* @return 返回OP值 |
||||
*/ |
||||
public String actionOP() { |
||||
return "batchcommit"; |
||||
} |
||||
|
||||
private Map sessionMap = new HashMap(); |
||||
|
||||
/** |
||||
* 提交入库请求处理 |
||||
* |
||||
* @param req 请求 |
||||
* @param res 响应 |
||||
* @throws Exception 抛出异常 |
||||
*/ |
||||
public void process(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||
String sessionID = WebUtils.getHTTPRequestParameter(req, ARG_SESSIONID); |
||||
CountLock lock = getCountLock(sessionID); |
||||
try { |
||||
synchronized (lock) { |
||||
process0(req, res); |
||||
} |
||||
} finally { |
||||
releaseLock(sessionID, lock); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void releaseLock(String sessionID, CountLock lock) { |
||||
synchronized (sessionMap) { |
||||
lock.reduce(); |
||||
if (lock.getCount() == 0) { |
||||
sessionMap.remove(sessionID); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private CountLock getCountLock(String sessionID) { |
||||
CountLock lock; |
||||
synchronized (sessionMap) { |
||||
lock = (CountLock) sessionMap.get(sessionID); |
||||
if (lock == null) { |
||||
lock = new CountLock(); |
||||
sessionMap.put(sessionID, lock); |
||||
} |
||||
lock.increase(); |
||||
} |
||||
return lock; |
||||
} |
||||
|
||||
private void process0(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||
String dbManiXML = NetworkHelper.getHTTPRequestEncodeParameter(req, ARG_XMLCONF, false); |
||||
if (dbManiXML != null) { |
||||
BatchCommit2DBJavaScript commit2DBJS = (BatchCommit2DBJavaScript) GeneralXMLTools.readStringAsXMLable(dbManiXML); |
||||
Calculator ca = Calculator.createCalculator(); |
||||
RepositoryDeal repo = prepareRepository(req, ca); |
||||
NameSpace ns = ParameterMapNameSpace.create(WebUtils.parameters4SessionIDInfor(req)); |
||||
ca.pushNameSpace(ns); |
||||
Map<String, Object> feedbackMap = prepareFeedBackMap(req, ca); |
||||
boolean success = true; |
||||
JSONObject fr_submitinfo = new JSONObject(); |
||||
Map<String, Connection> connectionMap = new HashMap<String, Connection>(); |
||||
try { |
||||
String location = WebUtils.getHTTPRequestParameter(req, "location"); |
||||
ColumnRow cr = ColumnRow.valueOf(location); |
||||
for (int i = 0; i < commit2DBJS.getDBManipulation().size(); i++) { |
||||
if (cr != ColumnRow.ERROR) { |
||||
ca.setCurrentFromColumnRow(cr);// commit的时候, 也会去set关联格子的ColumnRow, 为防止上一个提交对下一个造成影响, 这边每次重置
|
||||
} |
||||
SubmitMain dbManipulation = (SubmitMain) commit2DBJS.getDBManipulation().get(i); |
||||
if (dbManipulation != null && dbManipulation.getDmlConfig() != null) { |
||||
String dbName = dbManipulation.getDBName(ca); |
||||
Connection conn = createConnection(dbName, connectionMap); |
||||
ca.putConnection(dbName, conn); |
||||
dbManipulation.doJob(ca); |
||||
connectionMap.put(dbName, conn); |
||||
} |
||||
} |
||||
} catch (Exception e) { |
||||
FRContext.getLogger().error(e.getMessage(), e); |
||||
Iterator iter = connectionMap.entrySet().iterator(); |
||||
while (iter.hasNext()) { |
||||
DBUtils.rollback((Connection) ((Map.Entry) iter.next()).getValue()); |
||||
} |
||||
success = false; |
||||
fr_submitinfo.put("failinfo", e.getMessage()); |
||||
} finally { |
||||
DBUtils.commitConnections(connectionMap); |
||||
} |
||||
ca.removeNameSpace(ns); |
||||
JSONObject jo = new JSONObject(); |
||||
createJo(req, jo, feedbackMap, success, fr_submitinfo, repo); |
||||
java.io.PrintWriter writer = WebUtils.createPrintWriter(res); |
||||
writer.write(jo.toString()); |
||||
writer.flush(); |
||||
writer.close(); |
||||
} |
||||
} |
||||
|
||||
private Connection createConnection(String dbName, Map<String, Connection> connectionMap) throws Exception { |
||||
Connection conn = null; |
||||
if (connectionMap.containsKey(dbName)) { |
||||
return connectionMap.get(dbName); |
||||
} else { |
||||
NameDatabaseConnection db = new NameDatabaseConnection(dbName); |
||||
return db.createConnection(); |
||||
} |
||||
} |
||||
|
||||
private RepositoryDeal prepareRepository(HttpServletRequest req, Calculator ca) { |
||||
String sessionID = WebUtils.getHTTPRequestParameter(req, ARG_SESSIONID); |
||||
SessionIDInfor sessionIDInfor = SessionDealWith.getSessionIDInfor(sessionID); |
||||
|
||||
RepositoryDeal repo = null; |
||||
if (sessionIDInfor != null) { |
||||
repo = new RepositoryDeal(req, sessionIDInfor); |
||||
if (sessionIDInfor instanceof ReportSessionIDInfor) { |
||||
dealWithParaForCa(req, ca, (ReportSessionIDInfor) sessionIDInfor); |
||||
} |
||||
|
||||
NameSpace sessionNamespace = sessionIDInfor.asNameSpace(sessionID); |
||||
ca.pushNameSpace(sessionNamespace); |
||||
} |
||||
|
||||
return repo; |
||||
} |
||||
|
||||
private Map<String, Object> prepareFeedBackMap(HttpServletRequest req, Calculator ca) { |
||||
String feedback = WebUtils.getHTTPRequestParameter(req, "feedbackMap"); |
||||
Map feedbackMap = null; |
||||
if (StringUtils.isNotEmpty(feedback)) { |
||||
try { |
||||
feedbackMap = new JSONObject(feedback).toMap(); |
||||
} catch (JSONException e) { |
||||
FRContext.getLogger().error(e.getMessage()); |
||||
} |
||||
NameSpace feedbackNS = ParameterMapNameSpace.create(feedbackMap); |
||||
ca.pushNameSpace(feedbackNS); |
||||
} |
||||
|
||||
return feedbackMap; |
||||
} |
||||
|
||||
private void dealWithParaForCa(HttpServletRequest req, Calculator ca, ReportSessionIDInfor sessionIDInfor) { |
||||
ca.setAttribute(Calculator.SHEET_NUMBER_KEY, WebUtils.getHTTPRequestParameter(req, "sheetNum")); |
||||
sessionIDInfor.setUpAttribute4dbCommit(ca); |
||||
|
||||
// 提交入库可能用当前模板的参数
|
||||
NameSpace paras = ParameterMapNameSpace.create(sessionIDInfor.getParameterMap4Execute()); |
||||
ca.pushNameSpace(paras); |
||||
} |
||||
|
||||
private void createJo(HttpServletRequest req, JSONObject jo, Map feedbackMap, |
||||
boolean success, JSONObject fr_submitinfo, RepositoryDeal repo) throws Exception { |
||||
// 生成的时候没有encode的,用没有进行urldecode的方法获取callback语句,防止+和%出错
|
||||
String callBackXML = NetworkHelper.getHTTPRequestEncodeParameter(req, "callback", false); |
||||
JavaScript callBack = (JavaScript) GeneralXMLTools.readStringAsXMLable(callBackXML); |
||||
fr_submitinfo.put("success", success); |
||||
|
||||
if (callBack != null) { |
||||
dealWithSuccessPara(callBack, fr_submitinfo, repo); |
||||
if (feedbackMap != null) { |
||||
callBack.addParameterMap(feedbackMap); |
||||
} |
||||
jo.put("callback", new JSONFunction(new String[]{"res"}, callBack.createJS(repo), repo.getDevice())); |
||||
} |
||||
} |
||||
|
||||
private void dealWithSuccessPara(JavaScript callBack, JSONObject fr_submitinfo, RepositoryDeal repo) { |
||||
Map submitInfo = new HashMap(); |
||||
submitInfo.put(WebContentUtils.FR_SUBMITINFO, fr_submitinfo); |
||||
if (callBack != null) { |
||||
callBack.addParameterMap(submitInfo); |
||||
ParameterProvider[] ps = new ParameterProvider[callBack.getParameters().length + 1]; |
||||
int len = callBack.getParameters().length; |
||||
for (int i = 0; i < len; i++) { |
||||
ps[i] = callBack.getParameters()[i]; |
||||
} |
||||
ps[len] = new Parameter(WebContentUtils.FR_SUBMITINFO, fr_submitinfo); |
||||
callBack.setParameters(ps); |
||||
} |
||||
|
||||
// if the parameter contains "fr_submitinfo" then recalculate it
|
||||
ParameterProvider[] paras; |
||||
if (callBack != null) { |
||||
paras = callBack.getParameters(); |
||||
} else { |
||||
paras = new Parameter[0]; |
||||
} |
||||
Calculator ca = Calculator.createCalculator(); |
||||
if (repo != null) { |
||||
NameSpace ns = ParameterMapNameSpace.create(repo.getReportParameterMap()); |
||||
ca.pushNameSpace(ns); |
||||
} |
||||
ca.pushNameSpace(ParameterMapNameSpace.create(submitInfo)); |
||||
|
||||
for (int i = 0; i < paras.length; i++) { |
||||
Object obj = paras[i].getValue(); |
||||
if (obj instanceof Formula && needToRecalculate(paras[i])) { |
||||
try { |
||||
((Formula) obj).setResult(ca.eval((Formula) obj)); |
||||
} catch (UtilEvalError utilEvalError) { |
||||
|
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
private boolean needToRecalculate(ParameterProvider p) { |
||||
return Utils.objectToString(p.getValue()).toLowerCase().indexOf(WebContentUtils.FR_SUBMITINFO) != -1; |
||||
} |
||||
} |
||||
|
||||
|
||||
class CountLock { |
||||
private int count; |
||||
|
||||
public void increase() { |
||||
count++; |
||||
} |
||||
|
||||
public void reduce() { |
||||
count--; |
||||
} |
||||
|
||||
public int getCount() { |
||||
return count; |
||||
} |
||||
} |
Loading…
Reference in new issue