@Override
	public Rectangle getCellRect(int row, int column, final boolean includeSpacing) {

		final Rectangle sRect = super.getCellRect(row, column, includeSpacing);
		if ((row < 0) || (column < 0) || (getRowCount() <= row)
				|| (getColumnCount() <= column)) {
			return sRect;
		}
		final CellSpan cellAtt = (CellSpan) ((AttributiveCellTableModel) getModel())
				.getCellAttribute();
		if (!cellAtt.isVisible(row, column)) {
			final int temp_row = row;
			final int temp_column = column;
			row += cellAtt.getSpan(temp_row, temp_column)[CellSpan.ROW];
			column += cellAtt.getSpan(temp_row, temp_column)[CellSpan.COLUMN];
		}
		final int[] n = cellAtt.getSpan(row, column);

		int index = 0;
		final int columnMargin = getColumnModel().getColumnMargin();
		final Rectangle cellFrame = new Rectangle();
		final int aCellHeight = rowHeight + rowMargin;
		cellFrame.y = row * aCellHeight;
		cellFrame.height = n[CellSpan.ROW] * aCellHeight;

		final Enumeration enumeration = getColumnModel().getColumns();
		while (enumeration.hasMoreElements()) {
			final TableColumn aColumn = (TableColumn) enumeration.nextElement();
			cellFrame.width = aColumn.getWidth() + columnMargin;
			if (index == column) {
				break;
			}
			cellFrame.x += cellFrame.width;
			index++;
		}
		for (int i = 0; i < n[CellSpan.COLUMN] - 1; i++) {
			final TableColumn aColumn = (TableColumn) enumeration.nextElement();
			cellFrame.width += aColumn.getWidth() + columnMargin;
		}

		if (!includeSpacing) {
			final Dimension spacing = getIntercellSpacing();
			cellFrame.setBounds(cellFrame.x + spacing.width / 2, cellFrame.y
					+ spacing.height / 2, cellFrame.width - spacing.width,
					cellFrame.height - spacing.height);
		}
		return cellFrame;
	}