Package ro.fortsoft.wicket.pivot.web

Source Code of ro.fortsoft.wicket.pivot.web.PivotTable

/*
* Copyright 2012 Decebal Suiu
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with
* the License. You may obtain a copy of the License in the LICENSE file, or at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package ro.fortsoft.wicket.pivot.web;

import java.io.Serializable;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.convert.IConverter;

import ro.fortsoft.wicket.pivot.PivotField;
import ro.fortsoft.wicket.pivot.PivotModel;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.DataHeaderRenderCell;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.DataRenderRow;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.DataValueRenderCell;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.GrandTotalHeaderRenderCell;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.GrandTotalRenderRow;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.GrandTotalRowHeaderRenderCell;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.GrandTotalValueRenderCell;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.HeaderRenderCell;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.HeaderRenderRow;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.HeaderValueRenderCell;
import ro.fortsoft.wicket.pivot.PivotTableRenderModel.RenderCell;

/**
* @author Decebal Suiu
*/
public class PivotTable extends GenericPanel<PivotModel> {

  private static final long serialVersionUID = 1L;

  public PivotTable(String id, PivotModel pivotModel) {
    super(id, Model.of(pivotModel));
  }

  private Component applyRowColSpan(RenderCell cell, Component tmp) {
    if (cell.getColspan() > 1)
      tmp.add(AttributeModifier.append("colspan", cell.getColspan()));
    if (cell.getRowspan() > 1)
      tmp.add(AttributeModifier.append("rowspan", cell.getRowspan()));
    return tmp;
  }

  @Override
  protected void onInitialize() {
    super.onInitialize();

    PivotModel pivotModel = getModelObject();
    PivotTableRenderModel renderModel =  PivotTableRenderModel.create(pivotModel);

    // rendering header
    RepeatingView column = new RepeatingView("header");
    add(column);

    Component tmp = null;
    for (HeaderRenderRow row : renderModel.getHeaderRows()) {
      // rendering row header (first columns)
      WebMarkupContainer tr = new WebMarkupContainer(column.newChildId());
      column.add(tr);
      RepeatingView rowHeader = new RepeatingView("rowHeader");
      tr.add(rowHeader);

      for (HeaderRenderCell cell : row.getRowHeader()) {
        if (cell.getPivotField() == null) {
          // rendering an empty cell
          tmp = new Label(rowHeader.newChildId(), "");
          tmp.add(AttributeModifier.append("class", "empty"));
          applyRowColSpan(cell, tmp);
          rowHeader.add(tmp);
        } else {
          // rendering row field
          tmp = createTitleLabel(rowHeader.newChildId(), cell.getPivotField());
          applyRowColSpan(cell, tmp);
          rowHeader.add(tmp);
        }
      }

      // rendering column keys
      RepeatingView value = new RepeatingView("value");
      tr.add(value);
      for (RenderCell cell : row.getValueCells()) {
        if (cell instanceof HeaderValueRenderCell) {
          HeaderValueRenderCell headerValueRenderCell = (HeaderValueRenderCell) cell;
          tmp = createValueLabel(value.newChildId(), headerValueRenderCell.getRawValue(),
              headerValueRenderCell.getPivotField());
          applyRowColSpan(cell, tmp);
          value.add(tmp);
        } else {
          HeaderRenderCell headerRenderCell = (HeaderRenderCell) cell;
          tmp = createTitleLabel(value.newChildId(), headerRenderCell.getPivotField());
          applyRowColSpan(cell, tmp);
          value.add(tmp);
        }
      }

      // rendering grand total column
      RepeatingView grandTotalColumn = new RepeatingView("grandTotalColumn");
      for (RenderCell cell : row.getGrandTotalColumn()) {
        if (cell instanceof GrandTotalHeaderRenderCell) {
          GrandTotalHeaderRenderCell grandTotalHeaderRenderCell = (GrandTotalHeaderRenderCell) cell;
          if (grandTotalHeaderRenderCell.getRawValue() != null) {
            tmp = new Label(grandTotalColumn.newChildId(), grandTotalHeaderRenderCell.getRawValue()
                .toString());
            applyRowColSpan(cell, tmp);
            grandTotalColumn.add(tmp);
          } else {
            tmp = new WebMarkupContainer(grandTotalColumn.newChildId());
            applyRowColSpan(cell, tmp);
            tmp.add(AttributeModifier.append("class", "empty"));
            grandTotalColumn.add(tmp);
          }
        } else {
          HeaderRenderCell headerCell = (HeaderRenderCell) cell;
          tmp = createTitleLabel(value.newChildId(), headerCell.getPivotField());
          applyRowColSpan(cell, tmp);
          grandTotalColumn.add(tmp);
        }
      }
      grandTotalColumn.setVisible(row.getGrandTotalColumn().size() > 0);
      tr.add(grandTotalColumn);
    }

    // rendering rows
    RepeatingView row = new RepeatingView("row");
    add(row);
    for (DataRenderRow renderRow : renderModel.getValueRows()) {
      WebMarkupContainer tr = new WebMarkupContainer(row.newChildId());
      row.add(tr);
      RepeatingView rowHeader = new RepeatingView("rowHeader");
      tr.add(rowHeader);

      for (DataHeaderRenderCell cell : renderRow.getRowHeader()) {
        tmp = createValueLabel(rowHeader.newChildId(), cell.getRawValue(), cell.getPivotField());
        applyRowColSpan(cell, tmp);
        rowHeader.add(tmp);
      }

      RepeatingView value = new RepeatingView("value");
      tr.add(value);

      for (RenderCell cell : renderRow.getValue()) {
        if (cell instanceof DataValueRenderCell) {
          tmp = createValueLabel(value.newChildId(), cell.getRawValue(), cell.getPivotField());
          applyRowColSpan(cell, tmp);
          value.add(tmp);
        } else {
          GrandTotalValueRenderCell grandTotalCell = (GrandTotalValueRenderCell) cell;
          tmp = createGrandTotalLabel(value.newChildId(), grandTotalCell.getRawValue(), grandTotalCell.isForRow());
          applyRowColSpan(cell, tmp);
          tmp.add(AttributeModifier.append("class", "grand-total"));
          value.add(tmp);
        }
      }
    }

    WebMarkupContainer grandTotalRow = new WebMarkupContainer("grandTotalRow");
    grandTotalRow.setVisible(renderModel.getGrandTotalRows().size() > 0);
    add(grandTotalRow);
    /*
     * We currently expect exactly one GrantTotalRenderRow, therefor we dont
     * need a repeating viewer
     */
    for (GrandTotalRenderRow grantTotalRenderRow : renderModel.getGrandTotalRows()) {
      for (GrandTotalRowHeaderRenderCell cell : grantTotalRenderRow.getRowHeader()) {
        Label grandTotalRowHeader = new Label("rowHeader", "Grand Total");
        applyRowColSpan(cell, grandTotalRowHeader);
        grandTotalRow.add(grandTotalRowHeader);
      }

      RepeatingView value = new RepeatingView("value");
      grandTotalRow.add(value);
      for (GrandTotalValueRenderCell cell : grantTotalRenderRow.getValue()) {
        tmp = createGrandTotalLabel(value.newChildId(), cell.getRawValue(), cell.isForRow());
        value.add(tmp);
      }
    }
  }

  /**
   * Retrieves a name that display the pivot table title (for fields on ROW
   * and DATA areas)
   */
  protected Label createTitleLabel(String id, PivotField pivotField) {
    String title = pivotField.getTitle();
    if (pivotField.getArea().equals(PivotField.Area.DATA)) {
      title += " (" + pivotField.getCalculationDescription() + ")";
    }

    return new Label(id, title);
  }

  protected Label createValueLabel(String id, Object value, final PivotField pivotField) {
    return new Label(id, Model.of((Serializable) value)) {
      private static final long serialVersionUID = 1L;

      @SuppressWarnings("unchecked")
      @Override
      public <C> IConverter<C> getConverter(Class<C> type) {
        IConverter<C> converter = (IConverter<C>) pivotField.getConverter();
        if (converter != null) {
          return converter;
        }

        return super.getConverter(type);
      }

    };
  }

  protected Label createGrandTotalLabel(String id, Object value, boolean forRow) {
    return new Label(id, Model.of((Serializable) value));
  }
}
TOP

Related Classes of ro.fortsoft.wicket.pivot.web.PivotTable

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.