public TaskData(IEnumerable <Task> tasks, IEnumerable <Folder> folders, BaseFolder currentFolder, string filter)
        {
            Util.RequireNotNull(tasks, "tasks");
            Util.RequireNotNull(folders, "folders");
            Util.RequireNotNull(currentFolder, "currentFolder");

            folders.ForEach(folder => AddFolder(folder));
            m_userFolders = new ReadOnlyCollection <Folder>(m_folderList);
            tasks.ForEach(task => AddTask(task));
            CurrentFolder = currentFolder;
            m_filter      = filter;
            refreshAllFolders();
        }
        public void RenameFolder(Folder folder, string newName)
        {
            Util.RequireNotNull(folder, "folder");
            Util.RequireArgument(m_folderList.Contains(folder), "folder");
            Util.RequireArgument(newName == newName.SuperTrim(), "newName");
            Util.RequireArgument(Folder.IsValidFolderName(newName), "newName");

            if (folder.Name == newName)
            {
                // no-op
            }
            else if (folder.Name.EasyEquals(newName))
            {
                // just a case change -> easy
                // make darn sure we haven't broken our logic -> should only have folder that matches w/ case
                Debug.Assert(m_folderList.Count(existing => existing.Name.EasyEquals(newName)) == 1);
                folder.UpdateName(newName);
            }
            else if (m_folderList.Count(existing => existing.Name.EasyEquals(newName)) > 0)
            {
                Debug.Assert(m_folderList.Count(existing => existing.Name.EasyEquals(newName)) == 1);
                var target = m_folderList.First(existing => existing.Name.EasyEquals(newName));

                // move existing items to target folder
                m_taskList
                .Where(task => task.Folder == folder)
                .ForEach(task => task.Folder = target);

                // nuke existing folder
                m_folderList.Remove(folder);
                if (m_currentFolder == folder)
                {
                    CurrentFolder = target;
                }
            }
            else
            {
                // this is an entirely novel name. Cool!
                // make darn sure we haven't broken our logic -> should have no folder with matching name
                Debug.Assert(m_folderList.Count(existing => existing.Name.EasyEquals(newName)) == 0);
                folder.UpdateName(newName);
            }

            refreshAllFolders();
        }