Package org.zkoss.zss.app.ctrl

Source Code of org.zkoss.zss.app.ctrl.InsertFormulaCtrl2

/* InsertFormulaCtrl2.java

{{IS_NOTE
  Purpose:
   
  Description:
   
  History:
    Nov 25, 2010 5:54:06 PM , Created by Sam
}}IS_NOTE

Copyright (C) 2009 Potix Corporation. All Rights Reserved.

*/
package org.zkoss.zss.app.ctrl;

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.ForwardEvent;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zss.app.formula.FormulaMetaInfo;
import org.zkoss.zss.app.formula.Formulas;
import org.zkoss.zss.app.zul.Dialog;
import org.zkoss.zss.app.zul.Zssapp;
import org.zkoss.zss.app.zul.ctrl.DesktopWorkbenchContext;
import org.zkoss.zss.ui.Position;
import org.zkoss.zss.ui.Rect;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.SimpleListModel;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

/**
* @author Sam
*
*/
public class InsertFormulaCtrl2 extends GenericForwardComposer {
 
  private final static String ALL = "All";
 
  private Dialog _insertFormulaDialog;
  private Textbox searchTextbox;
  private Button searchBtn;
 
  private Combobox categoryCombobox;
  private Listbox functionListbox;
  private Label expression;
  private Label description;
 
  private Button okBtn;
 
  LinkedHashMap<String, List<FormulaMetaInfo>> formulaInfos;
 
  private int rowIdx;
  private int colIdx;
 
  @Override
  public void doAfterCompose(Component comp) throws Exception {
    super.doAfterCompose(comp);
   
    formulaInfos = Formulas.getFormulaInfos();
   
    LinkedList<String> categoryArys = new LinkedList<String>();
    categoryArys.add(ALL);
    categoryArys.addAll(formulaInfos.keySet());
    categoryCombobox.setModel(
        new BindingListModelList(categoryArys, false));
    categoryCombobox.addEventListener("onAfterRender", new EventListener() {
      public void onEvent(Event event) throws Exception {
        categoryCombobox.setSelectedIndex(0);
        initFunctionListbox();
      }
    });
   
    functionListbox.setItemRenderer(new ListitemRenderer() {
      public void render(Listitem item, Object data) throws Exception {
        FormulaMetaInfo info = (FormulaMetaInfo)data;
        item.setLabel(info.getFunction());
        item.setValue(info);
      }

      @Override
      public void render(Listitem item, Object data, int index)
          throws Exception {
        render(item, data);
      }
    });
    functionListbox.addEventListener(Events.ON_DOUBLE_CLICK, new EventListener() {
      public void onEvent(Event event) throws Exception {
        openComposeFormulaDialog();
      }
    });
  }
 
  public void onOpen$_insertFormulaDialog(ForwardEvent evt) {
   
    Rect selection = (Rect) evt.getOrigin().getData();
   
    _insertFormulaDialog.setMode(Window.MODAL);
    searchTextbox.setText(null);
    initFunctionListbox();
    searchTextbox.focus();
   
    rowIdx = selection.getTop();
    colIdx = selection.getLeft();
  }
 
  public void onSelect$categoryCombobox() {
    initFunctionListbox();
  }
 
  private void initFunctionListbox() {
    String category = categoryCombobox.getText();
    if (category == null)
      return;
   
    List<FormulaMetaInfo> ary = formulaInfos.get(category);
    if (ary == null) {
      //means all
      ary = new LinkedList<FormulaMetaInfo>();
      for (List<FormulaMetaInfo> infoAry : formulaInfos.values()) {
        ary.addAll(infoAry);
      }
    }
    functionListbox.setModel(new SimpleListModel(ary));
  }
 
  public void onClick$functionListbox() {
    FormulaMetaInfo info = (FormulaMetaInfo)functionListbox.getSelectedItem().getValue();
    expression.setValue(info.getExpression());
    description.setValue(info.getDescription());
  }
 
  public void onClick$okBtn() {
    openComposeFormulaDialog();
  }
 
  private void openComposeFormulaDialog() {
    Listitem item = (Listitem)functionListbox.getSelectedItem();
    if (item == null) {
      Messagebox.show("Select a function");
      return;
   
   
    FormulaMetaInfo info = (FormulaMetaInfo) item.getValue();
    if (info.getRequiredParameter() == 0) {
      getDesktopWorkbenchContext().getWorkbookCtrl().insertFormula(rowIdx, colIdx, "=" + info.getFunction() + "()");
    } else {
      info.setRowIndex(rowIdx);
      info.setColIndex(colIdx);
      getDesktopWorkbenchContext().getWorkbenchCtrl().
        openComposeFormulaDialog((FormulaMetaInfo)item.getValue());
    }

    _insertFormulaDialog.fireOnClose(null);
  }
 
  //TODO: shall I use echo event to showbusy, need to test speed
  private List<FormulaMetaInfo> search(String searchFor) {
    searchFor = searchFor.toLowerCase();
    LinkedList<FormulaMetaInfo> searchResult = new LinkedList<FormulaMetaInfo>();
    for (List<FormulaMetaInfo> infoAry : formulaInfos.values()) {
      for (FormulaMetaInfo info : infoAry) {
        if (info.getFunction().toLowerCase().contains(searchFor) ||
          info.getExpression().toLowerCase().contains(searchFor) ||
          info.getDescription().toLowerCase().contains(searchFor))
          searchResult.add(info);
      }
    }
    Collections.sort(searchResult, new Comparator<FormulaMetaInfo>() {
      public int compare(FormulaMetaInfo o1, FormulaMetaInfo o2) {
        return o1.getFunction().compareTo(o2.getFunction());
      }
    });
    return searchResult;
  }
  public void onOK$searchTextbox() {
    String searchFor = searchTextbox.getValue();
    if (searchFor == null || "".equals(searchFor))
      return;
    functionListbox.setModel(new SimpleListModel(search(searchFor)));
  }
 
  public void onClick$searchBtn() {
    String searchFor = searchTextbox.getText();
    if (searchFor == null || "".equals(searchFor))
      return;
    functionListbox.setModel(new SimpleListModel(search(searchFor)));
  }
  protected DesktopWorkbenchContext getDesktopWorkbenchContext() {
    return Zssapp.getDesktopWorkbenchContext(self);
  }
}
TOP

Related Classes of org.zkoss.zss.app.ctrl.InsertFormulaCtrl2

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.