private IBindingContext makeColumnContext(int columnIndex, IBindingContext rowBindingContext) { // create name for the column open class String columnOpenClassName = String.format("%sColType%d", spreadsheetHeader.getName(), columnIndex); IBindingContext generalBindingContext = componentsBuilder.getBindingContext(); Map<Integer, SpreadsheetHeaderDefinition> headers = componentsBuilder.getRowHeaders(); ComponentOpenClass columnOpenClass = new ComponentOpenClass(columnOpenClassName, generalBindingContext.getOpenL()); int height = cells.length; for (int rowIndex = 0; rowIndex < height; rowIndex++) { SpreadsheetHeaderDefinition headerDefinition = headers.get(rowIndex); proc(rowIndex, columnOpenClass, columnIndex, headerDefinition); } return new SpreadsheetContext(rowBindingContext, columnOpenClass); }
@Override public void collect(int columnInRange, int rowInRange, SpreadsheetCellField field) { if (casts[columnInRange][rowInRange] == null && !rangeType.equals(field.getType())){ casts[columnInRange][rowInRange] = getCast(field.getType(), rangeType); if (!casts[columnInRange][rowInRange].isImplicit()){ casts[columnInRange][rowInRange] = null; } if (casts[columnInRange][rowInRange] == null) { implicitCastNotSupported = true; } } }
IOpenField fstart = findVar(namespace, rangeStartName, true); IOpenField fend = findVar(namespace, rangeEndName, true); iterateThroughTheRange(sx, sy, w, h, rangeTypeCollector); IOpenClass rangeType = rangeTypeCollector.getRangeType(); iterateThroughTheRange(sx, sy, w, h, castsCollector);
private void iterateThroughTheRange(int startColumn, int startRow, int columnsInRange, int rowsInRange, SpreadsheetFieldCollector collector) { ComponentOpenClass componentOpenClass = getComponentOpenClass(); ComponentBindingContext componentBindingContext = this; while (componentOpenClass != null) { for (IOpenField f : componentOpenClass.getDeclaredFields().values()) { if (f instanceof SpreadsheetCellField) { SpreadsheetCellField field = (SpreadsheetCellField) f; int columnInRange = field.getCell().getColumnIndex() - startColumn; int rowInRange = field.getCell().getRowIndex() - startRow; if (columnInRange >= 0 && columnInRange < columnsInRange && rowInRange >= 0 && rowInRange < rowsInRange) { collector.collect(columnInRange, rowInRange, field); } } } if (componentBindingContext.getDelegate() instanceof ComponentBindingContext) { componentBindingContext = (ComponentBindingContext) componentBindingContext.getDelegate(); componentOpenClass = componentBindingContext.getComponentOpenClass(); } else { componentOpenClass = null; } } }
private IBindingContext makeRowContext(int rowIndex) { /** create name for the row open class */ String rowOpenClassName = String.format("%sRowType%d", spreadsheetHeader.getName(), rowIndex); /** create row open class and populate it with fields **/ IBindingContext generalBindingContext = componentsBuilder.getBindingContext(); Map<Integer, SpreadsheetHeaderDefinition> headers = componentsBuilder.getColumnHeaders(); // create row open class for current row ComponentOpenClass rowOpenClass = new ComponentOpenClass(rowOpenClassName, generalBindingContext.getOpenL()); // get the width of the whole spreadsheet int width = cells[0].length; // create for each column in row its field for (int columnIndex = 0; columnIndex < width; columnIndex++) { SpreadsheetHeaderDefinition columnHeader = headers.get(columnIndex); proc(rowIndex, rowOpenClass, columnIndex, columnHeader); } /** create row binding context **/ return new SpreadsheetContext(spreadsheetBindingContext, rowOpenClass); }
/** * Add to {@link SpreadsheetOpenClass} fields that are represented by spreadsheet cells. * * @param spreadsheetType open class of the spreadsheet */ public void addCellFields(SpreadsheetOpenClass spreadsheetType, boolean autoType) { IBindingContext generalBindingContext = componentsBuilder.getBindingContext(); CellsHeaderExtractor cellsHeadersExtractor = componentsBuilder.getCellsHeadersExtractor(); int rowsCount = cellsHeadersExtractor.getHeight(); int columnsCount = cellsHeadersExtractor.getWidth(); // create cells according to the size of the spreadsheet cells = new SpreadsheetCell[rowsCount][columnsCount]; // create the binding context for the spreadsheet level spreadsheetBindingContext = new SpreadsheetContext(generalBindingContext, spreadsheetType); for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++) { for (int columnIndex = 0; columnIndex < columnsCount; columnIndex++) { // build spreadsheet cell SpreadsheetCell spreadsheetCell = buildCell(rowIndex, columnIndex, autoType); // init cells array with appropriate cell cells[rowIndex][columnIndex] = spreadsheetCell; // create and add field of the cell to the spreadsheetType addSpreadsheetFields(spreadsheetType, spreadsheetCell, rowIndex, columnIndex); } } }