/* * 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.attrib; import java.util.Map; import org.gk.engine.client.Engine; import org.gk.engine.client.utils.ComponentUtils; import org.gk.ui.client.com.IC; import org.gk.ui.client.com.form.gkComboBox; import org.gk.ui.client.com.form.gkMap; import org.gk.ui.client.com.form.gkTimeField; import org.gk.ui.client.com.panel.gkHtmlContainer; import org.gk.ui.client.com.toolbar.gkButton; import org.gk.ui.client.com.tree.dir.gkTreeDirPanelIC; import org.gk.ui.client.com.tree.xml.gkXMLTreePanelIC; import org.gk.ui.client.com.utils.DateTimeUtils; import org.gk.ui.client.com.utils.TreeUtils; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.store.Record.RecordUpdate; import com.extjs.gxt.ui.client.store.Store; import com.extjs.gxt.ui.client.store.StoreEvent; import com.extjs.gxt.ui.client.store.TreeStore; import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.ComponentManager; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.WidgetComponent; import com.extjs.gxt.ui.client.widget.form.ComboBox; import com.extjs.gxt.ui.client.widget.form.DateField; import com.extjs.gxt.ui.client.widget.form.Field; import com.extjs.gxt.ui.client.widget.grid.Grid; import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Frame; /** * Value屬性 * * @author i23250 * @since 2010/9/30 */ public class ValueAttribute implements IAttribute { @Override public Object getAttributeValue(Component com) { Object value = null; if (com instanceof IC) { value = ((IC) com).getInfo(); } else if (com instanceof gkHtmlContainer) { gkHtmlContainer hc = (gkHtmlContainer) com; value = hc.getHtml(); } else if (com instanceof Field) { Field field = (Field) com; if (field instanceof DateField) { value = DateTimeUtils.getValue((DateField) field); } else if (field instanceof gkTimeField) { value = ((gkTimeField) field).getTimeValue(); } else { value = field.getValue(); } } else if (com instanceof gkButton) { gkButton field = (gkButton) com; value = field.getValue(); } else if (com instanceof LayoutContainer) { // 如果是LayoutContainer,而且第一個元件是Frame,就取得URL字串 // 這是因為XFrame是使用LayoutContainer包Frame (詳見 XFrame) Object obj = ((LayoutContainer) com).getItem(0); if (obj instanceof WidgetComponent && ((WidgetComponent) obj).getWidget() instanceof Frame) { Frame frame = (Frame) ((WidgetComponent) obj).getWidget(); value = frame.getUrl(); } } else { // 如果都找不到合適的,就直接拿Element取得html字串 Element ele = com.getElement(); value = ele.getInnerHTML(); Component g = ComponentManager.get().get(ele.getAttribute("gid")); if (g instanceof Grid) { // 針對cellEditor欄位取值 String[] param = ele.getId().split("_"); if (param.length != 2) { return value; } String columnName = ((Grid) g).getColumnModel() .getColumnById(param[0]).getDataIndex(); int rowIdx = Integer.parseInt(param[1]); ModelData md = (ModelData) ((Grid) g).getStore().getModels() .get(rowIdx); value = md.get(columnName); } } return value; } @Override public void setAttributeValue(Component com, Object value) { if (com instanceof IC) { // 如果是Tree而且資料是Map,就進行該節點的更新 if (com instanceof gkXMLTreePanelIC && value instanceof Map) { TreeUtils.updateSelectNode((gkXMLTreePanelIC) com, (Map) value); } else if (com instanceof gkTreeDirPanelIC && value instanceof Map) { // 更新節點內容,目前只提供name屬性更動 Map map = (Map) value; assert map.containsKey(gkTreeDirPanelIC.ID) : "can't found nodeId:" + map; String id = map.get(gkTreeDirPanelIC.ID).toString(); if (map.containsKey(gkTreeDirPanelIC.NAME)) { // 由於改變name時,同時也更動path,所以採用新增及刪除的方式修改 String name = map.get(gkTreeDirPanelIC.NAME).toString(); TreePanel tree = (TreePanel) com; TreeStore store = tree.getStore(); ModelData md = store.findModel(id); ModelData parent = store.getParent(md); int index = store.indexOf(md); gkMap newmd = (gkMap) gkMap.clone((Map) md); String oldPath = md.get(gkTreeDirPanelIC.PATH).toString(); String oldName = md.get(gkTreeDirPanelIC.NAME).toString(); int last = oldPath.lastIndexOf(oldName); String lastPath = oldPath.substring(last); lastPath = lastPath.replace(oldName, name); String newPath = oldPath.substring(0, last) + lastPath; newmd.set(gkTreeDirPanelIC.NAME, name); newmd.set(gkTreeDirPanelIC.PATH, newPath); store.insert(parent, newmd, index, false); store.remove(md); } } else { ((IC) com).setInfo(value); } } else if (com instanceof gkButton) { gkButton btn = (gkButton) com; btn.setValue((String) value); } else if (com instanceof gkHtmlContainer) { gkHtmlContainer hc = (gkHtmlContainer) com; if (value instanceof Map) { hc.setInfo((Map) value); } else { hc.setHtml((String) value); } } else if (com instanceof LayoutContainer) { String v = (String) value; LayoutContainer lc = (LayoutContainer) com; // 如果LayoutContainer裡面放的是Frame,就進行url設定 Object obj = lc.getItem(0); if (obj instanceof WidgetComponent && ((WidgetComponent) obj).getWidget() instanceof Frame) { ((Frame) ((WidgetComponent) obj).getWidget()).setUrl(v); } else { Engine.get().renderPanel(v, lc, true); } } else if (com instanceof Field) { Field field = (Field) com; boolean orgFireChange = field.isFireChangeEventOnSetValue(); // 記錄原先設定 field.setFireChangeEventOnSetValue(true); if (field instanceof DateField) { DateTimeUtils.setValue((DateField) field, value + ""); } else if (field instanceof gkTimeField) { ((gkTimeField) field).setTimeValue(value + ""); } else if (field instanceof gkComboBox && value instanceof Map && ((ComboBox) com).getStore().getCount() == 0) { // 適用於下拉選單是動態產生未點擊時可直接設定當前的text:value的情境,將map // add到store中並setValue ComboBox combo = (ComboBox) com; Map data = (Map) value; combo.getStore().add(new gkMap(data)); combo.getPropertyEditor().setList(combo.getStore().getModels()); field.setValue(value); } else { if (value instanceof String) { field.setValue(field.getPropertyEditor() .convertStringValue((String) value)); } else { field.setValue(value); } } field.setFireChangeEventOnSetValue(orgFireChange); // 還原原來設定 } else { // 如果都找不到合適的,就直接拿Element設定html字串 // 會判別如果有gid屬性,就必須找grid更新ModelData Element ele = com.getElement(); ele.setInnerHTML((String) value); // gid對於一般欄位是同層,對於labelField則是上一層 // 所以當拿不到gid就試著找上一層取得gid,都拿不到gid // 就不用處理Grid store儲存問題 String gid = ele.getAttribute("gid"); if (gid == null || gid.equals("")) { gid = ele.getParentElement().getAttribute("gid"); } Component g = ComponentManager.get().get(gid); if (g instanceof Grid) { // 對於cellEditor欄位處理 String[] param = ele.getId().split("_"); if (param.length != 2) { return; } ListStore ds = ((Grid) g).getStore(); String columnName = ((Grid) g).getColumnModel() .getColumnById(param[0]).getDataIndex(); int rowIdx = Integer.parseInt(param[1]); ModelData md = (ModelData) ds.getModels().get(rowIdx); md.set(columnName, value); StoreEvent evt = new StoreEvent(ds); evt.setModel(md); evt.setOperation(RecordUpdate.EDIT); ds.fireEvent(Store.Update, evt); // 設定cellEditor 編輯狀態下,欄位的顯示資料 Component editorField = ComponentUtils.findComponent(param[0]); if (editorField instanceof Field) { ((Field) editorField).setValue(value); } } } } }