All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.extjs.gxt.ui.client.widget.treegrid.CellTreeGridSelectionModel Maven / Gradle / Ivy

There is a newer version: 2.3.1-gwt22
Show newest version
/*
 * Sencha GXT 2.3.0 - Sencha for GWT
 * Copyright(c) 2007-2013, Sencha, Inc.
 * [email protected]
 * 
 * http://www.sencha.com/products/gxt/license/
 */
 package com.extjs.gxt.ui.client.widget.treegrid;

import java.util.ArrayList;
import java.util.List;

import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.widget.grid.CellSelectionModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.google.gwt.event.dom.client.KeyCodes;

@SuppressWarnings({"unchecked","rawtypes"})
public class CellTreeGridSelectionModel extends CellSelectionModel {

  protected TreeGrid tree;
  protected TreeStore treeStore;
  protected List selectedPreRender;

  @Override
  public void bindGrid(Grid grid) {
    tree = null;
    treeStore = null;
    super.bindGrid(grid);
    if (grid != null) {
      tree = (TreeGrid) grid;
      treeStore = tree.getTreeStore();
    }
  }

  protected void ensureExpanded(M model) {
    List stack = new ArrayList();
    model = treeStore.getParent(model);
    while (model != null) {
      stack.add(model);
      model = treeStore.getParent(model);
    }

    for (int i = stack.size() - 1; i >= 0; i--) {
      M m = stack.get(i);
      tree.setExpanded(m, true);
    }
  }

  @Override
  protected void handleMouseDown(GridEvent e) {
    if (!tree.getTreeView().isSelectableTarget(e.getModel(), e.getTarget())) {
      return;
    }
    super.handleMouseDown(e);
  }

  protected void hookPreRender(M item, boolean select) {
    if (selectedPreRender == null) {
      selectedPreRender = new ArrayList();
      tree.addListener(Events.Render, new Listener() {
        public void handleEvent(ComponentEvent be) {
          tree.removeListener(Events.Render, this);
          onRender();
        }
      });
    }
    if (select && !selectedPreRender.contains(item)) {
      selectedPreRender.add(item);
    } else if (!select) {
      selectedPreRender.remove(item);
    }
  }

  @Override
  protected void onAdd(List models) {

  }
  
  @Override
  protected void onKeyPress(GridEvent e) {
    super.onKeyPress(e);
    if (GXT.isFocusManagerEnabled()) {
      int kc = e.getKeyCode();
      if (kc == KeyCodes.KEY_ENTER && selection != null && !(grid instanceof EditorTreeGrid)) {
        tree.toggle(selection.model);
      }
    }
  }

  @Override
  protected void onKeyLeft(GridEvent ce) {
    if (lastSelected == null) {
      return;
    }
    if (!tree.isLeaf(lastSelected) && tree.isExpanded(lastSelected)) {
      tree.setExpanded(lastSelected, false);
    } else if (treeStore.getParent(lastSelected) != null) {
      doSingleSelect(treeStore.getParent(lastSelected), false);
    }
  }

  @Override
  protected void onKeyRight(GridEvent e) {
    if (lastSelected == null) {
      return;
    }
    if (!tree.isLeaf(lastSelected)) {
      if (!tree.isExpanded(lastSelected)) {
        tree.setExpanded(lastSelected, true);
      }
    }
  }

  protected void onRender() {
    if (selectedPreRender != null) {
      for (M item : selectedPreRender) {
        onSelectChange(item, true);
      }
      selectedPreRender = null;
    }
  }

  @Override
  protected void onSelectChange(M model, boolean select) {
    if (locked) return;
    if (!tree.isRendered()) {
      hookPreRender(model, select);
      return;
    }
    if (select) {
      ensureExpanded(model);
    }

    super.onSelectChange(model, select);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy