package AsposeCellsExamples.TechnicalArticles;

import com.aspose.cells.BackgroundType;
import com.aspose.cells.BorderType;
import com.aspose.cells.Cell;
import com.aspose.cells.CellBorderType;
import com.aspose.cells.Color;
import com.aspose.cells.Font;
import com.aspose.cells.FontUnderlineType;
import com.aspose.cells.LightCellsDataProvider;
import com.aspose.cells.Row;
import com.aspose.cells.Style;
import com.aspose.cells.TextAlignmentType;
import com.aspose.cells.Workbook;

public class LightCellsDataProviderDemo implements LightCellsDataProvider {

	private final int sheetCount;
	private final int maxRowIndex;
	private final int maxColIndex;
	private int rowIndex;
	private int colIndex;
	private final Style style1;
	private final Style style2;

	public LightCellsDataProviderDemo(Workbook wb, int sheetCount, int rowCount, int colCount) {
		// set the variables/objects
		this.sheetCount = sheetCount;
		this.maxRowIndex = rowCount - 1;
		this.maxColIndex = colCount - 1;

		// add new style object with specific formattings
		style1 = wb.createStyle();
		Font font = style1.getFont();
		font.setName("MS Sans Serif");
		font.setSize(10);
		font.setBold(true);
		font.setItalic(true);
		font.setUnderline(FontUnderlineType.SINGLE);
		font.setColor(Color.fromArgb(0xffff0000));
		style1.setHorizontalAlignment(TextAlignmentType.CENTER);

		// create another style
		style2 = wb.createStyle();
		style2.setCustom("#,##0.00");
		font = style2.getFont();
		font.setName("Copperplate Gothic Bold");
		font.setSize(8);
		style2.setPattern(BackgroundType.SOLID);
		style2.setForegroundColor(Color.fromArgb(0xff0000ff));
		style2.setBorder(BorderType.TOP_BORDER, CellBorderType.THICK, Color.getBlack());
		style2.setVerticalAlignment(TextAlignmentType.CENTER);
	}

	public boolean isGatherString() {
		return false;
	}

	public int nextCell() {
		if (colIndex < maxColIndex) {
			colIndex++;
			return colIndex;
		}
		return -1;
	}

	public int nextRow() {
		if (rowIndex < maxRowIndex) {
			rowIndex++;
			colIndex = -1; // reset column index
			if (rowIndex % 1000 == 0) {
				System.out.println("Row " + rowIndex);
			}
			return rowIndex;
		}
		return -1;
	}

	public void startCell(Cell cell) {
		if (rowIndex % 50 == 0 && (colIndex == 0 || colIndex == 3)) {
			// do not change the content of hyperlink.
			return;
		}
		if (colIndex < 10) {
			cell.putValue("test_" + rowIndex + "_" + colIndex);
			cell.setStyle(style1);
		} else {
			if (colIndex == 19) {
				cell.setFormula("=Rand() + test!L1");
			} else {
				cell.putValue(rowIndex * colIndex);
			}
			cell.setStyle(style2);
		}
	}

	public void startRow(Row row) {
		row.setHeight(25);
	}

	public boolean startSheet(int sheetIndex) {
		if (sheetIndex < sheetCount) {
			// reset row/column index
			rowIndex = -1;
			colIndex = -1;
			return true;
		}
		return false;
	}

}
