/*=============================================================================#
 # Copyright (c) 2012, 2021 Original NatTable authors and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0
 # 
 # Contributors:
 #     Original NatTable authors and others - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.ecommons.waltable.layer.cell;


public class DataCell {

	protected long columnPosition;
	
	protected long rowPosition;
	
	protected long columnSpan;
	
	protected long rowSpan;
	
	public DataCell(final long columnPosition, final long rowPosition) {
		this(columnPosition, rowPosition, 1, 1);
	}	
	
	public DataCell(final long columnPosition, final long rowPosition, final long columnSpan, final long rowSpan) {
		this.columnPosition= columnPosition;
		this.rowPosition= rowPosition;
		this.columnSpan= columnSpan;
		this.rowSpan= rowSpan;
	}
	
	public long getColumnPosition() {
		return this.columnPosition;
	}
	
	public long getRowPosition() {
		return this.rowPosition;
	}
	
	public long getColumnSpan() {
		return this.columnSpan;
	}
	
	public long getRowSpan() {
		return this.rowSpan;
	}
	
	public boolean isSpannedCell() {
		return this.columnSpan > 1 || this.rowSpan > 1;
	}
	
	
	@Override
	public int hashCode() {
		int h= (int) (this.columnPosition ^ (this.columnPosition >>> 32));
		h= Integer.rotateRight(h, 15);
		h ^= (int) (this.rowPosition ^ (this.rowPosition >>> 32));
		h ^= (h >>> 7);
		h ^= 3 * (int) (this.columnSpan ^ (this.columnSpan >>> 32));
		h ^= 31 * (int) (this.rowSpan ^ (this.rowSpan >>> 32));
		return h;
	}
	
	@Override
	public boolean equals(final Object obj) {
		if (this == obj) {
			return true;
		}
		if (!(obj instanceof DataCell)) {
			return false;
		}
		final DataCell other= (DataCell) obj;
		return (this.columnPosition == other.columnPosition
				&& this.rowPosition == other.rowPosition
				&& this.columnSpan == other.columnSpan
				&& this.rowSpan == other.rowSpan);
	}
	
	@Override
	public String toString() {
		return getClass().getSimpleName() + " (" //$NON-NLS-1$
			+ "\n\tcolumnPosition= " + this.columnPosition //$NON-NLS-1$
			+ "\n\trowPosition= " + this.rowPosition //$NON-NLS-1$
			+ "\n\tcolumnSpan= " + this.columnSpan //$NON-NLS-1$
			+ "\n\trowSpan= " + this.rowSpan //$NON-NLS-1$
			+ "\n)"; //$NON-NLS-1$
	}
	
}
