Пример #1
0
        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());
            }
        }
Пример #2
0
        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));
        }
Пример #3
0
        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());
            }
        }
Пример #4
0
        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);
        }
Пример #5
0
        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();
            }
        }