Package ro.fortsoft.wicket.pivot.web

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

/*
* 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.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.util.template.PackageTextTemplate;

import ro.fortsoft.wicket.pivot.PivotField;
import ro.fortsoft.wicket.pivot.PivotModel;

/**
* @author Decebal Suiu
*/
public class PivotAreaPanel extends Panel {

  private static final long serialVersionUID = 1L;

  private SortableAjaxBehavior sortableAjaxBehavior;
  private ListView<PivotField> fieldsView;
  private PivotField.Area area;
  private ModalWindow modal;
 
  public PivotAreaPanel(String id, PivotField.Area area) {
    super(id);

    this.area = area;
   
    modal = new ModalWindow("modal");
    modal.setAutoSize(true);
    add(modal);

    add(new Label("name", new ResourceModel(area.getName())));
   
    WebMarkupContainer fieldsContainer = new WebMarkupContainer("fieldsContainer");
    fieldsContainer.setOutputMarkupId(true);
    fieldsContainer.setMarkupId("area-" + area.getName() + "-" + getSession().nextSequenceValue());
    add(fieldsContainer);
   
    fieldsView = new ListView<PivotField>("fields") {

      private static final long serialVersionUID = 1L;

      @Override
      protected void populateItem(ListItem<PivotField> item) {
        final IModel<PivotField> itemModel = item.getModel();
        final PivotField pivotField = itemModel.getObject();
        final PivotField.Area area = PivotAreaPanel.this.area;
        Label fieldLabel = new Label("field", new AbstractReadOnlyModel<String>() {

          private static final long serialVersionUID = 1L;

          @Override
          public String getObject() {
            String title = pivotField.getTitle();
            if (area.equals(PivotField.Area.DATA)) {
              title += " (" + pivotField.getCalculationDescription() + ")";
            }
           
            return title;
          }
         
        });
        if (pivotField.isNumber()) {
          item.add(AttributeModifier.append("class", "field-number"));
        }
                       
        // add field actions panel
        if (!area.equals(PivotField.Area.UNUSED)) {
          PivotFieldActionsPanel pivotFieldActionsPanel = new PivotFieldActionsPanel("dropDownPanel", Model.of(pivotField), Model.of(getPivotModel()));
          pivotFieldActionsPanel.setRenderBodyOnly(true);
          item.add(pivotFieldActionsPanel);
          String markupId = "dropdown-" + pivotField.getIndex();
          pivotFieldActionsPanel.get("dropdown").setMarkupId(markupId);
          fieldLabel.add(AttributeModifier.append("data-dropdown", "#" + markupId));
        } else {
          item.add(new EmptyPanel("dropDownPanel").setVisible(false));
        }
       
        item.add(fieldLabel);       
        item.setOutputMarkupId(true);
        item.setMarkupId("field-" + pivotField.getIndex());
      }
    };
    fieldsView.setOutputMarkupPlaceholderTag(true);
    fieldsContainer.add(fieldsView);
   
    setOutputMarkupId(true);
  }

  @Override
  protected void onBeforeRender() {
    IModel<List<PivotField>> model = new LoadableDetachableModel<List<PivotField>>() {

      private static final long serialVersionUID = 1L;

      @Override
      protected List<PivotField> load() {
        return getPivotModel().getFields(area);
      }
     
    };

    fieldsView.setModel(model);
   
    super.onBeforeRender();
  }

  @Override
  protected void onInitialize() {
    super.onInitialize();
   
    addSortableBehavior(get("fieldsContainer"));
  }
 
  public PivotField.Area getArea() {
    return area;
  }
 
  public ModalWindow getModal() {
    return modal;
  }

  @Override
  public void renderHead(IHeaderResponse response) {
        super.renderHead(response);

        CharSequence script = sortableAjaxBehavior.getCallbackFunctionBody();

        Map<String, String> vars = new HashMap<String, String>();
        vars.put("component", get("fieldsContainer").getMarkupId());
        vars.put("stopBehavior", script.toString());

        PackageTextTemplate template = new PackageTextTemplate(PivotAreaPanel.class, "res/sort-behavior.template.js");
        template.interpolate(vars);

        response.render(OnDomReadyHeaderItem.forScript(template.getString()));
        try {
          template.close();
        } catch(IOException e) {
          throw new RuntimeException(e);
        }
    }
 
  public ListView<PivotField> getFieldsView() {
    return fieldsView;
  }

  private void addSortableBehavior(Component component) {
    sortableAjaxBehavior = new SortableAjaxBehavior() {

      private static final long serialVersionUID = 1L;

      @Override
      public void onSort(AjaxRequestTarget target, Item[] items) {
        PivotModel pivotModel = getPivotModel();
        for (Item item : items) {
          PivotField pivotField = pivotModel.getField(item.fieldIndex);
          pivotField.setArea(PivotField.Area.getValue(item.areaName));
          pivotField.setAreaIndex(item.sortIndex);
        }
        send(getPage(), Broadcast.BREADTH, new AreaChangedEvent(target));
      }
     
    };
    component.add(sortableAjaxBehavior);
  }

  private PivotModel getPivotModel() {
    return findParent(PivotPanel.class).getPivotModel();
  }
   
}
TOP

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

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.