public ValueEval Evaluate(ValueEval[] args, int srcCellRow, int srcCellCol) { if (args.Length < 1 || args.Length > 5) { return(ErrorEval.VALUE_INVALID); } try { BaseRef baseRef = EvaluateBaseRef(args[0]); // optional arguments // If offsets are omitted, it is assumed to be 0. int rowOffset = (args[1] is MissingArgEval) ? 0 : EvaluateIntArg(args[1], srcCellRow, srcCellCol); int columnOffset = (args[2] is MissingArgEval) ? 0 : EvaluateIntArg(args[2], srcCellRow, srcCellCol); int height = baseRef.Height; int width = baseRef.Width; // optional arguments // If height or width are omitted, it is assumed to be the same height or width as reference. switch (args.Length) { case 5: if (!(args[4] is MissingArgEval)) { width = EvaluateIntArg(args[4], srcCellRow, srcCellCol); } // fall-through to pick up height if (!(args[3] is MissingArgEval)) { height = EvaluateIntArg(args[3], srcCellRow, srcCellCol); } break; case 4: if (!(args[3] is MissingArgEval)) { height = EvaluateIntArg(args[3], srcCellRow, srcCellCol); } break; default: break; } // Zero height or width raises #REF! error if (height == 0 || width == 0) { return(ErrorEval.REF_INVALID); } LinearOffsetRange rowOffsetRange = new LinearOffsetRange(rowOffset, height); LinearOffsetRange colOffsetRange = new LinearOffsetRange(columnOffset, width); return(CreateOffset(baseRef, rowOffsetRange, colOffsetRange)); } catch (EvaluationException e) { return(e.GetErrorEval()); } }
private static AreaEval CreateOffset(BaseRef baseRef, LinearOffsetRange orRow, LinearOffsetRange orCol) { LinearOffsetRange absRows = orRow.NormaliseAndTranslate(baseRef.FirstRowIndex); LinearOffsetRange absCols = orCol.NormaliseAndTranslate(baseRef.FirstColumnIndex); if (absRows.IsOutOfBounds(0, LAST_VALID_ROW_INDEX)) { throw new EvaluationException(ErrorEval.REF_INVALID); } if (absCols.IsOutOfBounds(0, LAST_VALID_COLUMN_INDEX)) { throw new EvaluationException(ErrorEval.REF_INVALID); } return(baseRef.Offset(orRow.FirstIndex, orRow.LastIndex, orCol.FirstIndex, orCol.LastIndex)); }
public ValueEval Evaluate(ValueEval[] args, int srcCellRow, int srcCellCol) { if (args.Length < 3 || args.Length > 5) { return(ErrorEval.VALUE_INVALID); } try { BaseRef baseRef = EvaluateBaseRef(args[0]); int rowOffset = EvaluateIntArg(args[1], srcCellRow, srcCellCol); int columnOffset = EvaluateIntArg(args[2], srcCellRow, srcCellCol); int height = baseRef.Height; int width = baseRef.Width; switch (args.Length) { case 5: width = EvaluateIntArg(args[4], srcCellRow, srcCellCol); break; case 4: height = EvaluateIntArg(args[3], srcCellRow, srcCellCol); break; } // Zero height or width raises #REF! error if (height == 0 || width == 0) { return(ErrorEval.REF_INVALID); } LinearOffsetRange rowOffsetRange = new LinearOffsetRange(rowOffset, height); LinearOffsetRange colOffsetRange = new LinearOffsetRange(columnOffset, width); return(CreateOffset(baseRef, rowOffsetRange, colOffsetRange)); } catch (EvaluationException e) { return(e.GetErrorEval()); } }
private static AreaEval CreateOffset(BaseRef baseRef, LinearOffsetRange orRow, LinearOffsetRange orCol) { LinearOffsetRange absRows = orRow.NormaliseAndTranslate(baseRef.FirstRowIndex); LinearOffsetRange absCols = orCol.NormaliseAndTranslate(baseRef.FirstColumnIndex); if (absRows.IsOutOfBounds(0, LAST_VALID_ROW_INDEX)) { throw new EvaluationException(ErrorEval.REF_INVALID); } if (absCols.IsOutOfBounds(0, LAST_VALID_COLUMN_INDEX)) { throw new EvaluationException(ErrorEval.REF_INVALID); } return baseRef.Offset(orRow.FirstIndex, orRow.LastIndex, orCol.FirstIndex, orCol.LastIndex); }
public Eval Evaluate(Eval[] args, int srcCellRow, short srcCellCol) { if (args.Length < 3 || args.Length > 5) { return ErrorEval.VALUE_INVALID; } try { BaseRef baseRef = EvaluateBaseRef(args[0]); int rowOffset = EvaluateIntArg(args[1], srcCellRow, srcCellCol); int columnOffset = EvaluateIntArg(args[2], srcCellRow, srcCellCol); int height = baseRef.Height; int width = baseRef.Width; switch (args.Length) { case 5: width = EvaluateIntArg(args[4], srcCellRow, srcCellCol); break; case 4: height = EvaluateIntArg(args[3], srcCellRow, srcCellCol); break; } // Zero height or width raises #REF! error if (height == 0 || width == 0) { return ErrorEval.REF_INVALID; } LinearOffsetRange rowOffsetRange = new LinearOffsetRange(rowOffset, height); LinearOffsetRange colOffsetRange = new LinearOffsetRange(columnOffset, width); return CreateOffset(baseRef, rowOffsetRange, colOffsetRange); } catch (EvaluationException e) { return e.GetErrorEval(); } }