Package com.sencha.gxt.widget.core.client.grid

Source Code of com.sencha.gxt.widget.core.client.grid.GroupSummaryView

/**
* Sencha GXT 3.0.0 - Sencha for GWT
* Copyright(c) 2007-2012, Sencha, Inc.
* licensing@sencha.com
*
* http://www.sencha.com/products/gxt/license/
*/
package com.sencha.gxt.widget.core.client.grid;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.sencha.gxt.core.client.ValueProvider;
import com.sencha.gxt.core.client.dom.XDOM;
import com.sencha.gxt.core.client.dom.XElement;
import com.sencha.gxt.data.shared.ListStore;

public class GroupSummaryView<M> extends GroupingView<M> {

  /**
   * Returns the summary node element.
   *
   * @param g the group element
   * @return the summary node
   */
  public XElement getSummaryNode(Element g) {
    if (g != null) {
      return fly(g).down(".x-grid-summary-row");
    }
    return null;
  }

  /**
   * Returns true if summaries are visible.
   *
   * @return true for visible
   */
  public boolean isSummaryVisible() {
    return !grid.getElement().hasClassName("x-grid-hide-summary");
  }

  /**
   * Toggles the summary information visibility.
   *
   * @param visible true for visible, false to hide
   */
  public void toggleSummaries(boolean visible) {
    XElement el = grid.getElement();
    if (el != null) {
      if (visible) {
        el.removeClassName("x-grid-hide-summary");
      } else {
        el.addClassName("x-grid-hide-summary");
      }
    }
  }

  protected Map<ValueProvider<? super M, ?>, Number> calculate(List<M> models) {
    Map<ValueProvider<? super M, ?>, Number> data = new HashMap<ValueProvider<? super M, ?>, Number>();

    for (int i = 0, len = cm.getColumnCount(); i < len; i++) {
      SummaryColumnConfig<M,?> cf = (SummaryColumnConfig<M,?>) cm.getColumn(i);
      if (cf.getSummaryType() != null) {
        data.put(cf.getValueProvider(), calculate(cf, models));
      }
    }
    return data;
  }
 
  /**
   * Helper to ensure generics are typesafe
   * @param cf
   * @param models
   * @return
   */
  private <N> Number calculate(SummaryColumnConfig<M, N> cf, List<M> models) {
    ValueProvider<? super M, N> vp = cf.getValueProvider();
    SummaryType<N, ?> summaryType = cf.getSummaryType();
    return summaryType.calculate(models, vp);
  }

  @Override
  protected void onRemove(M m, int index, boolean isUpdate) {
    super.onRemove(m, index, isUpdate);
    if (!isUpdate) {
      refreshSummaries();
    }
  }

  @Override
  protected void onUpdate(ListStore<M> store, List<M> models) {
    super.onUpdate(store, models);
    refreshSummaries();
  }

  protected void refreshSummaries() {
    NodeList<Element> groups = getGroups();
    List<GroupingData<M>> groupData = getGroupData();
    for (int i = 0; i < groupData.size(); i++) {
      Element g = groups.getItem(i);
      if (g == null) continue;
      SafeHtml s = renderGroupSummary(groupData.get(i));
      XElement existing = getSummaryNode(g);
      if (existing != null) {
        existing.removeFromParent();
      }
      g.appendChild(XDOM.create(s));
    }
  }

  @Override
  protected void renderGroup(SafeHtmlBuilder buf, GroupingData<M> g, SafeHtml renderedRows) {
    super.renderGroup(buf, g, renderedRows);
    buf.append(renderGroupSummary(g));
  }

  @Override
  protected SafeHtml renderGroupSummary(GroupingData<M> groupInfo) {
    Map<ValueProvider<? super M, ?>, Number> data = calculate(groupInfo.getItems());
    return renderSummary(groupInfo, data);
  };

  protected SafeHtml renderSummary(GroupingData<M> groupInfo, Map<ValueProvider<? super M, ?>, Number> data) {
    int colCount = cm.getColumnCount();
    int last = colCount - 1;

    String unselectableClass = " " + unselectable;

    String cellClass = styles.cell();
    String cellInner = styles.cellInner();
    String cellFirstClass = " x-grid-cell-first";
    String cellLastClass = " x-grid-cell-last";

    SafeHtmlBuilder trBuilder = new SafeHtmlBuilder();
   
    for (int i = 0, len = colCount; i < len; i++) {
      SummaryColumnConfig<M,?> cf = (SummaryColumnConfig<M,?>) cm.getColumn(i);
      ColumnData cd = getColumnData().get(i);

      String cellClasses = cellClass;
      cellClasses += (i == 0 ? cellFirstClass : (i == last ? cellLastClass : ""));

      String id = cf.getColumnClassSuffix();
      if (id != null && !id.equals("")) {
        cellClasses += " x-grid-td-" + id;
      }

      Number n = data.get(cm.getValueProvider(i));
      String value = "";

      if (cf.getSummaryFormat() != null) {
        value = n == null ? "" : cf.getSummaryFormat().format(n.doubleValue());
      } else if (cf.getSummaryRenderer() != null) {
        value = cf.getSummaryRenderer().render(n, data).asString();
      }

      SafeHtml tdContent = tpls.td(i, cellClasses, cd.getStyles(), cellInner, cf.getColumnTextStyle(), SafeHtmlUtils.fromString(value));
      trBuilder.append(tdContent);

    }

    String rowClasses = "x-grid-row-summary";

    if (!selectable) {
      rowClasses += unselectableClass;
    }

    SafeHtml cells = trBuilder.toSafeHtml();

    return tpls.tr(rowClasses, cells);
  }
}
TOP

Related Classes of com.sencha.gxt.widget.core.client.grid.GroupSummaryView

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.