/**
*    
* @功能 添加参数
* @author 创建人 gao_jie
* @date 创建日期 Apr 23, 2009
* @version 1.0
*    
*/

public class AddParameter extends Window implements AfterCompose {

   private static final long serialVersionUID = 1L;

   private int num = 0; // 条件个数
   private Window win; // 参数风格
   private Rows parameterRows; // 条件行数
   private DesignerWnd desiWnd = null;
  @SuppressWarnings( "unused")
   private Spreadsheet spreadSheet;
   private InforReport inforreport;

   /*
    * (non-Javadoc)
    *    
    * @see org.zkoss.zk.ui.ext.AfterCompose#afterCompose()
    */

   public void afterCompose() {
    parameterRows = (Rows) this.getFellow( "parameterRows");
    win = (Window) this.getFellow( "AddParameter");
    desiWnd = (DesignerWnd) Sessions.getCurrent().getAttribute( "dWnd");
    spreadSheet = (Spreadsheet) desiWnd.getFellow( "spreadSheet");
    inforreport = spreadSheet.getReport();
     this.initiPage(inforreport.getParameters());
  }

   /**
    * 初始化参数页面 获取已定义的参数 现实参数的name,type,defaultValue并可改
    *    
    * @param Parameters
    */

  @SuppressWarnings( "unchecked")
   public void initiPage(Map Parameters) {
    parameterRows.getChildren().clear();
     if (Parameters != null && !Parameters.isEmpty()) {
       // 遍历Parameters的键集
      Set parametset = Parameters.keySet();
      Iterator ir = parametset.iterator();
       while (ir.hasNext()) {
        String key = (String) ir.next();
         // 获取已有的每一个参数
        Parameter parameter = (Parameter) Parameters.get(key);
         // 计数器+1
        num = num + 1;
         // 为每个参数在parameterRows里创建一个Row
        Row row = new Row();
        row.setId( "row_" + num);
        row.setParent(parameterRows);
         // 每个Row添加一个name,赋值为当前获取参数的name
        Textbox name = new Textbox();
        name.setId( "name_" + num);
        name.setWidth( "80px");
        name.setValue(parameter.getName());
        name.setParent(row);
         // 每个Row添加一个type,赋值为当前获取参数的type
        Listbox type = new Listbox();
        type.setParent(row);
        type.setId( "type_" + num);
        type.setMold( "select");
        type.appendChild( new Listitem( "字符串|String", "String"));
        type.appendChild( new Listitem( "整型|Int", "Int"));
        type.appendChild( new Listitem( "日期|Date", "Date"));
        type.appendChild( new Listitem( "长整型|Long", "Long"));
        type.appendChild( new Listitem( "单精度|Single", "Single"));
        type.appendChild( new Listitem( "双精度|Double", "Double"));
        type.appendChild( new Listitem( "货币|Currency", "Currency"));
        type.appendChild( new Listitem( "字节|Byte", "Byte"));
        type.appendChild( new Listitem( "布尔|Boolean", "Boolean"));
        type.appendChild( new Listitem( "时间|Time", "Time"));
        type.appendChild( new Listitem( "日期时间|Datetime", "Datetime"));
         if (parameter.getType().contains( "String")) {
          type.setSelectedIndex(0);
        } else if (parameter.getType().contains( "Int")) {
          type.setSelectedIndex(1);
        } else if (parameter.getType().contains( "Date")) {
          type.setSelectedIndex(2);
        } else if (parameter.getType().contains( "Long")) {
          type.setSelectedIndex(3);
        } else if (parameter.getType().contains( "Single")) {
          type.setSelectedIndex(4);
        } else if (parameter.getType().contains( "Double")) {
          type.setSelectedIndex(5);
        } else if (parameter.getType().contains( "Currency")) {
          type.setSelectedIndex(6);
        } else if (parameter.getType().contains( "Byte")) {
          type.setSelectedIndex(7);
        } else if (parameter.getType().contains( "Boolean")) {
          type.setSelectedIndex(8);
        } else if (parameter.getType().contains( "Time")) {
          type.setSelectedIndex(9);
        } else if (parameter.getType().contains( "Datetime")) {
          type.setSelectedIndex(10);
        } else {
          type.setSelectedIndex(0);
        }
         // 每个Row添加一个defaultValue,赋值为当前获取参数的defaultValue
        Textbox defaultValue = new Textbox();
        defaultValue.setId( "parameter_" + num);
        defaultValue.setWidth( "80px");
        defaultValue.setValue(parameter.getDefaultValue());
        defaultValue.setParent(row);
         // 每个Row添加一个"删除"按钮,触发删除事件
        Button delbtn = new Button();
        delbtn.setId( "delbtd_" + num);
        delbtn.setLabel( "删除");
        delbtn.addEventListener( "onClick", new DelEventListener(num));
        delbtn.setParent(row);
      }
    }
  }

   /**
    * 添加参数
    */

   public void addParameter() {
    num = num + 1;
     // 产生Row
    Row row = new Row();
    row.setId( "row_" + num);
    row.setParent(parameterRows);

    Textbox name = new Textbox();
    name.setId( "name_" + num);
    name.setWidth( "80px");
    name.setParent(row);

    Listbox type = new Listbox();
    type.setParent(row);
    type.setId( "type_" + num);
    type.setMold( "select");
    type.appendChild( new Listitem( "字符串|String", "String"));
    type.appendChild( new Listitem( "整型|Int", "Int"));
    type.appendChild( new Listitem( "日期|Date", "Date"));
    type.appendChild( new Listitem( "长整型|Long", "Long"));
    type.appendChild( new Listitem( "单精度|Single", "Single"));
    type.appendChild( new Listitem( "双精度|Double", "Double"));
    type.appendChild( new Listitem( "货币|Currency", "Currency"));
    type.appendChild( new Listitem( "字节|Byte", "Byte"));
    type.appendChild( new Listitem( "布尔|Boolean", "Boolean"));
    type.appendChild( new Listitem( "时间|Time", "Time"));
    type.appendChild( new Listitem( "日期时间|Datetime", "Datetime"));
    type.setSelectedIndex(0);

    Textbox defaultValue = new Textbox();
    defaultValue.setId( "parameter_" + num);
    defaultValue.setWidth( "80px");
    defaultValue.setParent(row);

    Button delbtn = new Button();
    delbtn.setId( "delbtd_" + num);
    delbtn.setLabel( "删除");
    delbtn.addEventListener( "onClick", new DelEventListener(num));
    delbtn.setParent(row);
  }

   /**
    *    
    * @功能 监听事件 "删除参数"
    *    
    */

   public class DelEventListener implements EventListener {
     int no;

     public DelEventListener( int no) {
       this.no = no;
    }

    @SuppressWarnings( "unchecked")
     public void onEvent(Event arg0) throws Exception {
       // 移除才操作
      win.getFellow( "row_" + no).detach();
       // 改变现有的,该行以后的所有行,上移一位
       for ( int i = no + 1; i <= num; i++) {
         int j = i - 1;
        win.getFellow( "row_" + i).setId( "row_" + j);
        win.getFellow( "name_" + i).setId( "name_" + j);
        win.getFellow( "type_" + i).setId( "type_" + j);
        win.getFellow( "parameter_" + i).setId( "parameter_" + j);
        Button bun = (Button) win.getFellow( "delbtd_" + i);
        Iterator ite = bun.getListenerIterator( "onClick");
        bun.removeEventListener( "onClick", (EventListener) ite.next());
        bun.setId( "delbtd_" + j);
        bun.addEventListener( "onClick", new DelEventListener(j));
      }
      num--;
    }
  }

   /**
    * 保存选择
    */

  @SuppressWarnings( "unchecked")
   public void saveParameter() {
    Map map = new HashMap();
     // 定位到待保存的每一行
     for ( int i = 1; i <= num; i++) {
       // 获取页面的输入值
      String name = ((Textbox) this.getFellow( "name_" + i)).getValue()
          .trim();
      String type = (String) ((Listbox) this.getFellow( "type_" + i))
          .getSelectedItem().getValue();
      String defaultValue = ((Textbox) this.getFellow( "parameter_" + i))
          .getValue();
       // 当name不为空且不重复,则把页面获取的数据存入Parameter对象
       if (!"".equals(name) && !map.containsKey(name)) {
        Parameter tempparameter = new Parameter();
        tempparameter.setName(name);
        tempparameter.setType(type);
        tempparameter.setDefaultValue(defaultValue);
         // 再以name为键Parameter对象为值,存入一个Map对象
        map.put(name, tempparameter);
      } else if (map.containsKey(name)) {
        Message.showInfo( "第" + i + "行参数名已存在");
         return;
      } else {
        Message.showInfo( "第" + i + "行参数名不能为空");
         return;
      }
    }
     // 把已存的map作为参数列与report关联,并初始化页面
    num = 0;
    inforreport.setParameters(map);
     this.initiPage(inforreport.getParameters());
    Message.showInfo( "保存成功!");
  }
}