/* * Copyright (C) 2000-2012 InfoChamp System Corporation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.gk.engine.client.event; import java.util.List; import java.util.Map; import jfreecode.gwt.event.client.bus.JsonConvert; import jfreecode.gwt.event.client.bus.obj.InfoMap; import org.gk.engine.client.build.EngineDataStore; import org.gk.engine.client.build.XComponent; import org.gk.engine.client.build.js.XJavaScript; import org.gk.engine.client.exception.GKEngineException; import org.gk.engine.client.gen.UIGen; import org.gk.engine.client.i18n.EngineMessages; import com.extjs.gxt.ui.client.event.BaseEvent; import com.extjs.gxt.ui.client.event.DNDEvent; import com.extjs.gxt.ui.client.event.FieldEvent; import com.extjs.gxt.ui.client.event.TreePanelEvent; /** * JS事件處理器 * * @author i23250 * @since 2010/10/28 */ public class JSHandler extends EventHandler { @Override public void process(String xComId, List sources, List targets, XComponent xCom, BaseEvent be) { // 如果源頭是FieldEvent,就取得來源欄位實際的id,因為Field在Grid 裡面會加上序號 // (參考 gkTextColumnConfig 類別),所以必須取得設定的真正id if (be instanceof FieldEvent) { xComId = ((FieldEvent) be).getBoxComponent().getId(); } XJavaScript xJavaScript; StringBuffer content = new StringBuffer(""); boolean isScript = false; if (!sources.isEmpty()) { EventValue ev = EventFactory.convertToEventValue(sources.get(0)); String value = ev.getContent(); switch (ev.getType()) { case ID: // 若value為「this」,則表示直接執行本身內的script,不透過事件觸發 if ("this".equals(value)) { content.append(xComId); } else if (value.startsWith(IEventConstants.TYPE_DATA)) { // 若為「#」開頭,則表示後面整段都是要執行的script content.append(value.substring(1)); isScript = true; } else { content.append(value); } break; case EXPR: content.append(eval(value)); break; case STRING: content.append(value); isScript = true; break; default: break; } } if (isScript) { xJavaScript = new XJavaScript(content.toString()); } else { UIGen uiGen = EngineDataStore.getUIGenNode(content.toString()); if (uiGen == null || !(uiGen instanceof XJavaScript)) { throw new GKEngineException( EngineMessages.msg.error_jsNotFound(content.toString())); } xJavaScript = (XJavaScript) uiGen; xJavaScript.setComId(xComId); } // 重新產生xJavaScript必須重新註冊 JSMethod方法,因為原先的會被移除掉 xJavaScript.initJSMethod(xJavaScript); // 如果是拖拉事件,轉型為DNDEvent取得源頭資料 if (be instanceof DNDEvent) { xJavaScript.setDNDEvent((DNDEvent) be); Object data = ((DNDEvent) be).getData(); xJavaScript.setData(JsonConvert.Object2JSONString(data)); } else if (be instanceof TreePanelEvent) { TreePanelEvent tpe = (TreePanelEvent) be; if (tpe.getNode() != null) { Map nodeInfo = (Map) tpe.getNode().getModel(); String json = new InfoMap(nodeInfo).toString(); xJavaScript.setData(json); } else { return; } } xJavaScript.createScriptNodeToExecute(); } }