@Override
  public Object getValueAt(final int row, final int col) {
    Pair<Integer, Integer> key = itemToChunkKey(row, col);

    try {
      ListenableFuture<ArrayChunk> chunk = myChunkCache.get(key);

      if (chunk.isDone()) {
        Object[][] data = chunk.get().getData();
        int r = row % CHUNK_ROW_SIZE;
        int c = col % CHUNK_COL_SIZE;

        if (r < data.length) {
          if (c < data[r].length) {
            return correctStringValue(data[r][c]);
          }
        }
      }
      else {
        myQueue.queue(new Update("get chunk from debugger") {
          @Override
          public void run() {
            chunk.addListener(() -> UIUtil.invokeLaterIfNeeded(() -> fireTableDataChanged()), myExecutorService);
            myExecutorService.execute(((ListenableFutureTask<ArrayChunk>)chunk));
          }
        });
      }
      return EMPTY_CELL_VALUE;
    }
    catch (Exception e) {
      return EMPTY_CELL_VALUE; //TODO: handle it
    }
  }
@Override
  public Object getValueAt(final int row, final int col)