| using System; | |
| using System.Collections.Generic; | |
| using System.Linq; | |
| using System.Text; | |
| using OfficeOpenXml.FormulaParsing.ExcelUtilities; | |
| namespace OfficeOpenXml.FormulaParsing | |
| { | |
| /// <summary> | |
| /// This class implements a stack on which instances of <see cref="ParsingScope"/> | |
| /// are put. Each ParsingScope represents the parsing of an address in the workbook. | |
| /// </summary> | |
| public class ParsingScopes | |
| { | |
| private readonly IParsingLifetimeEventHandler _lifetimeEventHandler; | |
| public ParsingScopes(IParsingLifetimeEventHandler lifetimeEventHandler) | |
| { | |
| _lifetimeEventHandler = lifetimeEventHandler; | |
| } | |
| private Stack<ParsingScope> _scopes = new Stack<ParsingScope>(); | |
| /// <summary> | |
| /// Creates a new <see cref="ParsingScope"/> and puts it on top of the stack. | |
| /// </summary> | |
| /// <param name="address"></param> | |
| /// <returns></returns> | |
| public virtual ParsingScope NewScope(RangeAddress address) | |
| { | |
| ParsingScope scope; | |
| if (_scopes.Count() > 0) | |
| { | |
| scope = new ParsingScope(this, _scopes.Peek(), address); | |
| } | |
| else | |
| { | |
| scope = new ParsingScope(this, address); | |
| } | |
| _scopes.Push(scope); | |
| return scope; | |
| } | |
| /// <summary> | |
| /// The current parsing scope. | |
| /// </summary> | |
| public virtual ParsingScope Current | |
| { | |
| get { return _scopes.Count() > 0 ? _scopes.Peek() : null; } | |
| } | |
| /// <summary> | |
| /// Removes the current scope, setting the calling scope to current. | |
| /// </summary> | |
| /// <param name="parsingScope"></param> | |
| public virtual void KillScope(ParsingScope parsingScope) | |
| { | |
| _scopes.Pop(); | |
| if (_scopes.Count() == 0) | |
| { | |
| _lifetimeEventHandler.ParsingCompleted(); | |
| } | |
| } | |
| } | |
| } |