/// <summary> /// ON events /// </summary> /// <param name="pars"></param> public void Visit(ParsedOnStatement pars) { // To code explorer PushToCodeExplorer( GetExplorerListNode("ON events", CodeExplorerIconType.OnEvent), new OnEventCodeItem { DisplayText = pars.Name, Flags = pars.Flags, SubText = null, DocumentOwner = pars.FilePath, GoToLine = pars.Line, GoToColumn = pars.Column }); }
public void Visit(ParsedOnStatement pars) { AppendEverything(pars); }
/// <summary> /// Creates parsed item for ON CHOOSE OF XXX events /// (choose or anything else) /// </summary> /// <param name="onToken"></param> /// <returns></returns> private ParsedOnStatement CreateParsedOnEvent(Token onToken) { /* * ON event-list * { ANYWHERE | { OF widget-list | [ OR event-list OF widget-list]... | [ ANYWHERE ] | } | } | { trigger-block | REVERT | { PERSISTENT RUN procedure | [ ( input-parameters ) ] | } | } | | ON event OF database-object | [referencing-phrase] | [ OVERRIDE ] | {trigger-block | REVERT } | | ON key-label key-function | | ON "WEB-NOTIFY" ANYWHERE {trigger-block} */ // info we will extract from the current statement : ParsedOnStatement newParsedOn = null; var eventList = new StringBuilder(); var widgetList = new StringBuilder(); int state = 0; do { var token = PeekAt(1); // next token if (token is TokenPreProcDirective) { // this is the case of an empty ON statement that will not end by a . but is still compilable... // we just hope this is in a analyze suspend/resume block break; } if (token is TokenEos) { break; } if (token is TokenComment) { continue; } switch (state) { case 0: // matching event type if (token is TokenWord || token is TokenString || token is TokenSymbol) { eventList.Append((eventList.Length == 0 ? "" : ", ") + GetTokenStrippedValue(token)); state++; } break; case 1: // matching an event list? if (token is TokenSymbol && token.Value.Equals(",")) { state--; break; } if (!(token is TokenWord)) { break; } if (token.Value.EqualsCi("anywhere")) { // we match anywhere, need to return to match a block start widgetList.Append("anywhere"); newParsedOn = new ParsedOnStatement(eventList + " " + widgetList, onToken, eventList.ToString(), widgetList.ToString()); AddParsedItem(newParsedOn, onToken.OwnerNumber); state = 99; break; } // if not anywhere, we expect an "of" if (token.Value.EqualsCi("of")) { state++; break; } // we matched a 'ON key-label key-function' widgetList.Append(token.Value); newParsedOn = new ParsedOnStatement(eventList + " " + widgetList, onToken, eventList.ToString(), widgetList.ToString()); AddParsedItem(newParsedOn, onToken.OwnerNumber); state = 99; break; case 2: // matching widget name if (token is TokenWord || token is TokenString) { // ON * OF FRAME fMain, on ne prend pas en compte le FRAME if (!token.Value.EqualsCi("frame")) { widgetList.Append((widgetList.Length == 0 ? "" : ", ") + GetTokenStrippedValue(token)); state++; } } break; case 3: // matching a widget list? if (token is TokenSymbol && token.Value.Equals(",")) { state--; break; } if (!(token is TokenWord)) { break; } // matching a widget IN FRAME if (token.Value.EqualsCi("in")) { var nextNonSpace = PeekAtNextNonType <TokenWhiteSpace>(1); if (!(nextNonSpace is TokenWord && nextNonSpace.Value.Equals("frame"))) { // skip the whole IN FRAME XX MoveNext(); MoveNext(); MoveNext(); MoveNext(); break; } } newParsedOn = new ParsedOnStatement(eventList + " " + widgetList, onToken, eventList.ToString(), widgetList.ToString()); AddParsedItem(newParsedOn, onToken.OwnerNumber); // matching a OR (in that case we can create several ParsedOnStatement in this method, but we should always return the last created) if (token.Value.EqualsCi("or")) { widgetList.Clear(); eventList.Clear(); state = 0; break; } // end here state = 99; break; } if (state == 99) { break; } } while (MoveNext()); return(newParsedOn); }