- using System;
- using System.Collections.Generic;
- using System.Linq;
- namespace Ink.Parsed
- {
- public class ListDefinition : Parsed.Object
- {
- public Identifier identifier;
- public List<ListElementDefinition> itemDefinitions;
- public VariableAssignment variableAssignment;
- public Runtime.ListDefinition runtimeListDefinition {
- get {
- var allItems = new Dictionary<string, int> ();
- foreach (var e in itemDefinitions) {
- if( !allItems.ContainsKey(e.name) )
- allItems.Add (e.name, e.seriesValue);
- else
- Error("List '"+identifier+"' contains dupicate items called '"+e.name+"'");
- }
- return new Runtime.ListDefinition (identifier?.name, allItems);
- }
- }
- public ListElementDefinition ItemNamed (string itemName)
- {
- if (_elementsByName == null) {
- _elementsByName = new Dictionary<string, ListElementDefinition> ();
- foreach (var el in itemDefinitions) {
- _elementsByName [el.name] = el;
- }
- }
- ListElementDefinition foundElement;
- if (_elementsByName.TryGetValue (itemName, out foundElement))
- return foundElement;
- return null;
- }
- public ListDefinition (List<ListElementDefinition> elements)
- {
- this.itemDefinitions = elements;
- int currentValue = 1;
- foreach (var e in this.itemDefinitions) {
- if (e.explicitValue != null)
- currentValue = e.explicitValue.Value;
- e.seriesValue = currentValue;
- currentValue++;
- }
- AddContent (elements);
- }
- public override Runtime.Object GenerateRuntimeObject ()
- {
- var initialValues = new Runtime.InkList ();
- foreach (var itemDef in itemDefinitions) {
- if (itemDef.inInitialList) {
- var item = new Runtime.InkListItem (this.identifier?.name, itemDef.name);
- initialValues [item] = itemDef.seriesValue;
- }
- }
-
- initialValues.SetInitialOriginName (identifier?.name);
- return new Runtime.ListValue (initialValues);
- }
- public override void ResolveReferences (Story context)
- {
- base.ResolveReferences (context);
- context.CheckForNamingCollisions (this, identifier, Story.SymbolType.List);
- }
- public override string typeName {
- get {
- return "List definition";
- }
- }
- Dictionary<string, ListElementDefinition> _elementsByName;
- }
- public class ListElementDefinition : Parsed.Object
- {
- public string name
- {
- get { return identifier?.name; }
- }
- public Identifier identifier;
- public int? explicitValue;
- public int seriesValue;
- public bool inInitialList;
- public string fullName {
- get {
- var parentList = parent as ListDefinition;
- if (parentList == null)
- throw new System.Exception ("Can't get full name without a parent list");
- return parentList.identifier + "." + name;
- }
- }
- public ListElementDefinition (Identifier identifier, bool inInitialList, int? explicitValue = null)
- {
- this.identifier = identifier;
- this.inInitialList = inInitialList;
- this.explicitValue = explicitValue;
- }
- public override Runtime.Object GenerateRuntimeObject ()
- {
- throw new System.NotImplementedException ();
- }
- public override void ResolveReferences (Story context)
- {
- base.ResolveReferences (context);
- context.CheckForNamingCollisions (this, identifier, Story.SymbolType.ListItem);
- }
- public override string typeName {
- get {
- return "List element";
- }
- }
- }
- }