/// <summary> /// Add a new todo item to the container /// </summary> /// <param name="container"></param> /// <param name="input"></param> static void AddToContainer(ITodoContainer container, string input) { string strippedInput = input.Substring(2); ITodoContainer newContainer = NewTodo(strippedInput); container.AddChild(newContainer); }
/// <summary> /// Save the given root todo container with the given serializer. /// </summary> /// <param name="serializer"></param> /// <param name="rootContainer"></param> static void SaveRoot(string filename, DataContractJsonSerializer serializer, ITodoContainer rootContainer) { Console.WriteLine(string.Format("Saving to {0}", filename)); using (Stream stream = File.Open(filename, FileMode.Create)) { serializer.WriteObject(stream, rootContainer); } }
/// <summary> /// Display the todo container. /// </summary> /// <param name="container"></param> /// <returns></returns> public string Display(ITodoContainer container) { StringBuilder sb = new StringBuilder(); if (_parentDisplay != null) { if (container.Parent != null) { ITodoContainer parent = container.Parent; while (parent != null) { if (parent.Todo != null) { sb.Insert(0, string.Format("{0} > ", _parentDisplay.Display(parent.Todo))); } else { sb.Insert(0, "root > "); } parent = parent.Parent; } sb.AppendLine("\n"); } else { sb.AppendLine("<root>"); } } if (_todoDisplay != null && container.Todo != null) { sb.AppendLine(_todoDisplay.Display(container.Todo)); } if (container.Children.Any()) { sb.AppendFormat("{0} Children:\n", container.Children.Count()); if (_childDisplay != null) { int i = 0; foreach (ITodo child in container.Children.Select(c => c.Todo)) { sb.AppendFormat(" {0} {1}\n", i, _childDisplay.Display(child)); i++; } } } else { sb.AppendLine("No TODOs."); } return(sb.ToString()); }
static void Main(string[] args) { _serializer = new DataContractJsonSerializer(typeof(TodoContainer)); _rootContainer = LoadRoot(SAVE_PATH, _serializer); ITodoContainer currentContainer = _rootContainer; ITodoDisplay detailedDisplay = new DetailedTodoDisplay(); ITodoDisplay summaryDisplay = new SummaryTodoDisplay(); ITodoContainerDisplay detailedContainerDisplay = new DetailedTodoContainerDisplay(detailedDisplay, summaryDisplay, summaryDisplay); while (HandleInput(detailedContainerDisplay, ref currentContainer)) { } SaveRoot(SAVE_PATH, _serializer, _rootContainer); }
/// <summary> /// Remove a child container. /// </summary> /// <param name="container"></param> /// <returns></returns> public bool RemoveChild(ITodoContainer container) { container.Parent = null; return(_children.Remove(container)); }
/// <summary> /// Add a new child todo container to this container. /// </summary> /// <param name="container"></param> public void AddChild(ITodoContainer container) { container.Parent = this; _children.Add(container); }
/// <summary> /// Remove a child container by index. /// </summary> /// <param name="index"></param> /// <returns></returns> public bool RemoveChild(int index) { ITodoContainer container = _children.ElementAt(index); return(RemoveChild(container)); }
/// <summary> /// Display the todo container, and handle user input. /// </summary> /// <param name="containerDisplay"></param> /// <param name="currentContainer"></param> /// <returns></returns> static bool HandleInput(ITodoContainerDisplay containerDisplay, ref ITodoContainer currentContainer) { Console.WriteLine(containerDisplay.Display(currentContainer)); string input = Console.ReadLine().Trim(); Console.Clear(); if (string.IsNullOrEmpty(input)) { return(true); } if (input.Equals("q", StringComparison.OrdinalIgnoreCase) || input.Equals("quit", StringComparison.OrdinalIgnoreCase) || input.Equals("exit", StringComparison.OrdinalIgnoreCase)) { return(false); } if (input.Equals("s", StringComparison.OrdinalIgnoreCase)) { SaveRoot(SAVE_PATH, _serializer, _rootContainer); return(true); } if (input.Equals("p", StringComparison.OrdinalIgnoreCase)) { if (currentContainer.Parent != null) { currentContainer = currentContainer.Parent; } else { Console.WriteLine("No parent."); } return(true); } if (input.StartsWith("a ", StringComparison.OrdinalIgnoreCase)) { AddToContainer(currentContainer, input); return(true); } if (input.StartsWith("r ", StringComparison.OrdinalIgnoreCase)) { string numStr = input.Substring(2); int index; if (int.TryParse(numStr, out index)) { currentContainer.RemoveChild(index); } else { Console.WriteLine(string.Format("No child found matching index '{0}'", numStr)); } return(true); } if (input.Equals("r", StringComparison.OrdinalIgnoreCase)) { if (currentContainer.Parent != null) { ITodoContainer containerToRemove = currentContainer; currentContainer = currentContainer.Parent; currentContainer.RemoveChild(containerToRemove); } else { Console.WriteLine("Can't remove root node."); } return(true); } int num; if (int.TryParse(input, out num)) { ITodoContainer newContainer = currentContainer.Children.ElementAtOrDefault(num); if (newContainer != null) { currentContainer = newContainer; } else { Console.WriteLine(string.Format("Can't find child index {0}", num)); } return(true); } Console.WriteLine(string.Format("Couldn't understand command '{0}'", input)); return(true); }