Package com.sencha.gxt.state.client

Source Code of com.sencha.gxt.state.client.BorderLayoutStateHandler$Handler

/**
* Sencha GXT 3.1.0-beta - Sencha for GWT
* Copyright(c) 2007-2014, Sencha, Inc.
* licensing@sencha.com
*
* http://www.sencha.com/products/gxt/license/
*/
package com.sencha.gxt.state.client;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.state.client.BorderLayoutStateHandler.BorderLayoutState;
import com.sencha.gxt.widget.core.client.Component;
import com.sencha.gxt.widget.core.client.ComponentHelper;
import com.sencha.gxt.widget.core.client.ContentPanel;
import com.sencha.gxt.widget.core.client.SplitBar;
import com.sencha.gxt.widget.core.client.container.BorderLayoutContainer;
import com.sencha.gxt.widget.core.client.container.BorderLayoutContainer.BorderLayoutData;
import com.sencha.gxt.widget.core.client.event.AddEvent;
import com.sencha.gxt.widget.core.client.event.AddEvent.AddHandler;
import com.sencha.gxt.widget.core.client.event.CollapseItemEvent;
import com.sencha.gxt.widget.core.client.event.CollapseItemEvent.CollapseItemHandler;
import com.sencha.gxt.widget.core.client.event.ExpandItemEvent;
import com.sencha.gxt.widget.core.client.event.ExpandItemEvent.ExpandItemHandler;
import com.sencha.gxt.widget.core.client.event.RemoveEvent;
import com.sencha.gxt.widget.core.client.event.RemoveEvent.RemoveHandler;
import com.sencha.gxt.widget.core.client.event.SplitBarDragEvent;
import com.sencha.gxt.widget.core.client.event.SplitBarDragEvent.SplitBarDragHandler;

public class BorderLayoutStateHandler extends ComponentStateHandler<BorderLayoutState, BorderLayoutContainer> {

  public interface BorderLayoutState {
    Set<String> getCollapsed();

    Map<String, Double> getSizes();

    void setCollapsed(Set<String> collapsed);

    void setSizes(Map<String, Double> sizes);
  }

  private class Handler implements AddHandler, RemoveHandler, CollapseItemHandler<ContentPanel>,
      ExpandItemHandler<ContentPanel> {

    @Override
    public void onAdd(AddEvent event) {
      handleAdd(event);
    }

    @Override
    public void onCollapse(CollapseItemEvent<ContentPanel> event) {
      handleCollapse(event);
    }

    @Override
    public void onExpand(ExpandItemEvent<ContentPanel> event) {
      handleExpand(event);
    }

    @Override
    public void onRemove(RemoveEvent event) {
      handleRemove(event);
    }

  }

  private SplitBarDragHandler splitBarHandler = new SplitBarDragHandler() {

    @Override
    public void onDragEvent(SplitBarDragEvent event) {
      handleResize(event);
    }
  };

  public BorderLayoutStateHandler(BorderLayoutContainer component) {
    super(BorderLayoutState.class, component);

    Handler h = new Handler();
    component.addAddHandler(h);
    component.addCollapseHandler(h);
    component.addExpandHandler(h);
  }

  public BorderLayoutStateHandler(BorderLayoutContainer component, String key) {
    super(BorderLayoutState.class, component, key);

    Handler h = new Handler();
    component.addAddHandler(h);
    component.addCollapseHandler(h);
    component.addExpandHandler(h);
  }

  @Override
  public void applyState() {

  }

  protected void handleAdd(AddEvent event) {
    if (!getObject().isStateful()) return;
    Widget w = event.getWidget();

    Object obj = w.getLayoutData();

    if (obj instanceof BorderLayoutData && w instanceof Component) {
      BorderLayoutData data = (BorderLayoutData) obj;
      Component c = (Component)w;
      String id = c.getId();
     
      Map<String, Double> sizes = getState().getSizes();
      if (sizes != null && sizes.containsKey(id)) {
        data.setSize(sizes.get(id));
      }

      if (c instanceof ContentPanel) {
        Set<String> collapsed = getState().getCollapsed();
        if (collapsed != null && collapsed.contains(id)) {
          data.setCollapsed(true);
        }
      }

      SplitBar bar = c.getData("splitBar");
      if (bar != null) {
        bar.addSplitBarDragHandler(splitBarHandler);
      }
    }

  }

  protected void handleCollapse(CollapseItemEvent<ContentPanel> event) {
    if (!getObject().isStateful()) return;
    ContentPanel panel = event.getItem();
    Set<String> collapsed = getState().getCollapsed();
    if (collapsed == null) {
      collapsed = new HashSet<String>();
    }
    collapsed.add(panel.getId());

    getState().setCollapsed(collapsed);
    saveState();
  }

  protected void handleExpand(ExpandItemEvent<ContentPanel> event) {
    if (!getObject().isStateful()) return;
    ContentPanel panel = event.getItem();
    Set<String> collapsed = getState().getCollapsed();
    if (collapsed != null) {
      collapsed.remove(panel.getId());
    }

    getState().setCollapsed(collapsed);
    saveState();
  }

  protected void handleRemove(RemoveEvent event) {
    if (!getObject().isStateful()) return;
    Component c = (Component) event.getWidget();
    SplitBar bar = c.getData("splitBar");
    if (bar != null) {
      ComponentHelper.removeHandler(bar, SplitBarDragEvent.getType(), splitBarHandler);
    }
  }

  protected void handleResize(SplitBarDragEvent event) {
    SplitBar bar = event.getSource();
    Component target = bar.getTargetWidget();

    BorderLayoutData data = (BorderLayoutData) target.getLayoutData();

    Map<String, Double> sizes = getState().getSizes();
    if (sizes == null) {
      sizes = new HashMap<String, Double>();
    }

    sizes.put(target.getId(), data.getSize());

    getState().setSizes(sizes);
    saveState();
  }
}
TOP

Related Classes of com.sencha.gxt.state.client.BorderLayoutStateHandler$Handler

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.