Example #1
0
        private static IEnumerable <ParseTreeNode> CellContainedInRanges(ParseTreeNode fqcellref, ParseTreeNode formula, Context CtxF)
        {
            var cell = new Location(fqcellref.ChildNodes[1].Print());
            // Select all  references and qualify them
            var references = formula.GetReferenceNodes().Select(CtxF.Qualify).ToList();

            // Check the different types of ranges
            var ranges  = formula.AllNodes().Where(reference => reference.MatchFunction(":"));
            var rangesc = ranges.Where(range =>
            {
                var args  = range.GetFunctionArguments().Select(ExcelFormulaParser.Print).ToList();
                var start = new Location(args[0]);
                var end   = new Location(args[1]);
                return(cell.Row >= start.Row && cell.Row <= end.Row &&
                       cell.Column >= start.Column && cell.Column <= end.Column);
            });
            var vranges = references.Where(reference =>
                                           reference.ChildNodes[0].Is(GrammarNames.Prefix) &&
                                           reference.ChildNodes[1].Is(GrammarNames.VerticalRange)
                                           );
            var vrangesc = vranges.Where(reference =>
            {
                var vrange = reference.ChildNodes[1];
                var pieces = vrange.Print().Replace("$", "").Split(':');
                return(cell.Column >= AuxConverter.ColToInt(pieces[0]) &&
                       cell.Column <= AuxConverter.ColToInt(pieces[1]));
            });
            var hranges = references.Where(reference =>
                                           reference.ChildNodes[0].Is(GrammarNames.Prefix) &&
                                           reference.ChildNodes[1].Is(GrammarNames.HorizontalRange)
                                           );
            var hrangesc = hranges.Where(reference =>
            {
                var hrange = reference.ChildNodes[1];
                var pieces = hrange.Print().Replace("$", "").Split(':');
                return(cell.Row >= (int.Parse(pieces[0]) - 1) && cell.Row <= (int.Parse(pieces[1]) - 1));
            });
            var combined = new[] { rangesc, vrangesc, hrangesc }.SelectMany(x => x);

            return(combined);
        }