This post is an extension to this previous post. Code in the previous post is used to multi select cell in a row using the shift keys. It is updated to add functionality to select cells in a particular row using control key and also highlight the row that we are currently working on.
import java.util.ArrayList;
import java.util.List;
import com.extjs.gxt.ui.client.core.El;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.widget.grid.CellSelectionModel;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
/**
* This class is an extension of CellSelectionModel.* The CellSelectionModel allows us to select only one cell at a particular time.* This Class allows us to select multiple cells in a particular row in a grid.* Multi select is performed by pressing the shift key with the mouse click** @author Ravikanth Kolli* @version 1.0*** @param <M>*/public class RowCellSelectionModel<M extends ModelData> extends CellSelectionModel<M> {int lastSelectedRow = -1;
int lastSelectedCol = -1;
private CellSelection selected ;
List<CellSelection> cellsSelected = new ArrayList<CellSelection>();
/**
* Overriding the handleMouseDown event.* MultiSelect is done by pressing the shiftkey*/@Overrideprotected void handleMouseDown(GridEvent e) {super.handleMouseDown(e);
if(lastSelectedRow == -1)
{selected = new CellSelection(listStore.getAt(e.getRowIndex()),e.getRowIndex(),e.getColIndex());
cellsSelected.add(selected);lastSelectedRow = e.getRowIndex();lastSelectedCol = e.getColIndex();}else if (lastSelectedRow == e.getRowIndex() && (e.isShiftKey() || e.isControlKey())) {// control key press adding or removing cell from the cellsSelected list.
if(e.isShiftKey())
{if(cellsSelected.size() > 0)
El.fly(grid.getView().getRow(cellsSelected.get(0).row)).removeStyleName("x-grid3-row-selected");
cellsSelected.clear();for (int i = 1 ; i < e.getGrid().getColumnModel().getColumnCount(); i++) {Element cell = grid.getView().getCell(lastSelectedRow, i);if (cell != null) {El.fly(cell).removeStyleName("x-grid3-cell-selected");
}}if(lastSelectedCol > e.getColIndex()){
for (int iter = e.getColIndex(); iter < lastSelectedCol+1 ; iter++){selected = new CellSelection(listStore.getAt(e.getRowIndex()),e.getRowIndex(),iter);
cellsSelected.add(selected);}lastSelectedRow = e.getRowIndex();}else
{for (int iter = lastSelectedCol; iter < e.getColIndex() + 1 ; iter++){selected = new CellSelection(listStore.getAt(e.getRowIndex()),e.getRowIndex(),iter);
cellsSelected.add(selected);}lastSelectedRow = e.getRowIndex();}}// control key press adding or removing cell from the cellsSelected list.
else if(e.isControlKey()){if(cellsSelected.size() > 0)
El.fly(grid.getView().getRow(cellsSelected.get(0).row)).removeStyleName("x-grid3-row-selected");
boolean isSelected = false;for (int i =0 ; i < cellsSelected.size();i++){El.fly(grid.getView().getCell(cellsSelected.get(i).row, cellsSelected.get(i).cell)).removeStyleName("x-grid3-cell-selected");
if(cellsSelected.get(i).row == e.getRowIndex() && cellsSelected.get(i).cell == e.getColIndex())
{isSelected = true;
cellsSelected.remove(i);}}if(!isSelected)
{selected = new CellSelection(listStore.getAt(e.getRowIndex()), e.getRowIndex(), e.getColIndex());
cellsSelected.add(selected);}lastSelectedRow = e.getRowIndex();}}else
{if(!e.isRightClick()
|| cellsSelected.size() == 0|| !(cellsSelected.get(0).row == e.getRowIndex() && cellsSelected.get(0).cell <= e.getColIndex() && e.getColIndex() <= cellsSelected.get(cellsSelected.size() - 1).cell)|| cellsSelected.get(0).row != e.getRowIndex()){if(cellsSelected.size() > 0)
El.fly(grid.getView().getRow(cellsSelected.get(0).row)).removeStyleName("x-grid3-row-selected");
cellsSelected.clear();for (int i = 1 ; i < e.getGrid().getColumnModel().getColumnCount(); i++){Element cell = grid.getView().getCell(lastSelectedRow, i);if (cell != null) {El.fly(cell).removeStyleName("x-grid3-cell-selected");
}}selected = new CellSelection(listStore.getAt(e.getRowIndex()),e.getRowIndex(),e.getColIndex());
cellsSelected.add(selected);lastSelectedRow = e.getRowIndex();lastSelectedCol = e.getColIndex();}}/**
* Add the cell selected style after all the events are handled*/DeferredCommand.addCommand(new Command() {
public void execute() {if(cellsSelected.size() > 0)
{El.fly(grid.getView().getRow(cellsSelected.get(0).row)).addStyleName("x-grid3-row-selected");
}for (int iter = 0 ; iter < cellsSelected.size() ; iter++) {Element element = grid.getView().getCell(cellsSelected.get(iter).row,cellsSelected.get(iter).cell);if (element != null) {El.fly(element).addStyleName("x-grid3-cell-selected");
}El.fly(grid.getView().getHeaderCell(cellsSelected.get(iter).cell)).setStyleName("x-setItalics");
}}});}/**
* Method to get the list of all the selected cells at a particular time* @return list of selected CellSelections.*/public List<CellSelection> getSelectedCells()
{return cellsSelected;
}/**
* clear the selections in cellsSelected*/public void clearSelections(){cellsSelected.clear();}}