private static void selectionRegionChanged(
      JGrid grid, SelectionRegion selectionRegion, boolean add) {
    if (!add) {
      grid.getSelectionModel().clearSelection();
    }
    List<Cell> selectedCells = new ArrayList<Cell>();
    for (int i = selectionRegion.getFirstRow(); i <= selectionRegion.getLastRow(); i++) {
      for (int j = selectionRegion.getFirstColumn(); j <= selectionRegion.getLastColumn(); j++) {
        boolean isSpan = grid.getSpanModel().isCellSpan(i, j);

        // if (!isSpan) {
        Cell cell = new Cell(i, j);
        //						System.out.println("cell=" + cell);
        selectedCells.add(cell);
        //                    } else {
        //                        CellSpan cellSpan = grid.getSpanModel().getSpanOver(i, j);
        //                        if ((cellSpan.getRow() == i) && (cellSpan.getGroupColumn() == j))
        // {
        //                            Cell cell = new Cell(i, j);
        //                            System.out.println("cell=" + cell);
        //                            selectedCells.add(cell);
        //                        }
        //                    }
      }
    }
    grid.getSelectionModel().addSelectionCells(selectedCells);
  }
 public void actionPerformed(ActionEvent event) {
   JGrid grid = (JGrid) event.getSource();
   if (!grid.hasFocus()) {
     CellEditor cellEditor = grid.getCurrentCellEditor();
     if ((cellEditor != null) && !cellEditor.stopCellEditing()) {
       return;
     }
     grid.requestFocus();
   }
   SelectionModel selectionModel = grid.getSelectionModel();
   Cell selectedCell = selectionModel.getSelectedCell();
   int row = selectedCell.getRow();
   int column = selectedCell.getColumn();
   grid.editCellAt(row, column, null);
   Component editorComponent = grid.getEditorComponent();
   if (editorComponent != null) {
     editorComponent.requestFocus();
   }
 }
    public void actionPerformed(ActionEvent event) {

      JGrid grid = (JGrid) event.getSource();
      if (grid.isEditing() && !grid.getCurrentCellEditor().stopCellEditing()) {
        return;
      }
      SelectionModel selectionModel = grid.getSelectionModel();
      List<Cell> selectedCells = selectionModel.getSelectedCells();
      int selectedCount = selectedCells.size();
      if (selectedCount == 0) {
        return;
      }

      Cell firstSelectedCell = selectionModel.getSelectedCell();
      Cell lastSelectedCell = selectionModel.getLastSelectedCell();
      int row = lastSelectedCell.getRow();
      int column = lastSelectedCell.getColumn();

      if (shiftPressed) {

        if (shiftRegion == null) {
          shiftRegion = new SelectionRegion();
          shiftRegion.setFirstRow(row);
          shiftRegion.setFirstColumn(column);
          shiftRegion.setLastRow(row);
          shiftRegion.setLastColumn(column);
        }
        boolean nextSelection = true;
        if ((dx == 1) && (column < grid.getColumnCount() - 1)) {
          column++;
        } else if ((dx == -1) && (column > 0)) {
          column--;
        } else if ((dy == 1) && (row < grid.getRowCount() - 1)) {
          row++;
        } else if ((dy == -1) && (row > 0)) {
          row--;
        } else {
          nextSelection = false;
        }
        if (nextSelection) {
          GridSelectionAlgorithm selectionAlgorithm = new GridSelectionAlgorithm(grid);

          selectionAlgorithm.update(
              row,
              column,
              firstSelectedCell.getRow(),
              firstSelectedCell.getColumn(),
              lastSelectedCell.getRow(),
              lastSelectedCell.getColumn(),
              shiftRegion);

          selectionRegionChanged(grid, shiftRegion, false);
          // because the selectionModel is cleared and made from scratch
          // keep a reference to first and last selected cells
          selectionModel.setFirstCell(firstSelectedCell);
          selectionModel.setLastCell(new Cell(row, column));
        }

      } else {
        shiftRegion = null;
        SpanModel spanModel = grid.getSpanModel();
        if (spanModel.isCellSpan(row, column)) {
          CellSpan span = spanModel.getSpanOver(row, column);

          row = span.getRow();
          column = span.getColumn();

          if ((dx > 0) && (span.getColumnCount() > 1)) {
            column = span.getLastColumn();
          }
          if ((dy > 0) && (span.getRowCount() > 1)) {
            row = span.getLastRow();
          }
        }

        row = clipToRange(row + dy, 0, grid.getRowCount());
        column = clipToRange(column + dx, 0, grid.getColumnCount());
        selectionModel.clearSelection();
        if (!grid.isCellSpan(row, column)) {
          selectionModel.addSelectionCell(new Cell(row, column));
        } else {
          CellSpan span = spanModel.getSpanOver(row, column);
          List<Cell> cells = new ArrayList<Cell>();
          for (int i = 0; i < span.getRowCount(); i++) {
            for (int j = 0; j < span.getColumnCount(); j++) {
              cells.add(new Cell(span.getRow() + i, span.getColumn() + j));
            }
          }
          selectionModel.addSelectionCells(cells);
        }
      }
    }