/* Function: CreateFileSourceEntry * Creates an entry for the file source, adds it to the menu, and returns it. It will also create the <rootFileMenu> * container if necessary. */ protected MenuEntries.Files.FileSource CreateFileSourceEntry(Files.FileSource fileSource) { #if DEBUG if (FindFileSourceEntry(fileSource) != null) { throw new Exception("Tried to create a file source entry that already existed in the menu."); } #endif if (rootFileMenu == null) { rootFileMenu = new MenuEntries.Base.Container(); rootFileMenu.Title = Engine.Locale.Get("NaturalDocs.Engine", "Menu.Files"); } MenuEntries.Files.FileSource fileSourceEntry = new MenuEntries.Files.FileSource(fileSource); fileSourceEntry.Parent = rootFileMenu; rootFileMenu.Members.Add(fileSourceEntry); return(fileSourceEntry); }
/* Function: CreateLanguageEntry * Creates an entry for the language, adds it to the class menu, and returns it. It will also create the <rootClassMenu> * container if necessary. */ protected MenuEntries.Classes.Language CreateLanguageEntry(Languages.Language language) { #if DEBUG if (FindLanguageEntry(language) != null) { throw new Exception("Tried to create a language entry that already existed in the menu."); } #endif if (rootClassMenu == null) { rootClassMenu = new MenuEntries.Base.Container(); rootClassMenu.Title = Engine.Locale.Get("NaturalDocs.Engine", "Menu.Classes"); } MenuEntries.Classes.Language languageEntry = new MenuEntries.Classes.Language(language); languageEntry.Parent = rootClassMenu; rootClassMenu.Members.Add(languageEntry); return(languageEntry); }
/* Function: AddFile * Adds a file to the menu tree. */ public void AddFile(Files.File file) { #if DEBUG if (isCondensed) { throw new Exception("Cannot add a file to the menu once it's been condensed."); } #endif // Find which file source owns this file and generate a relative path to it. MenuEntries.Files.FileSource fileSourceEntry = FindOrCreateFileSourceEntryOf(file); Path relativePath = fileSourceEntry.WrappedFileSource.MakeRelative(file.FileName); // Split off the file name and split the rest into individual folder names. string prefix; List <string> pathSegments; relativePath.Split(out prefix, out pathSegments); string fileName = pathSegments[pathSegments.Count - 1]; pathSegments.RemoveAt(pathSegments.Count - 1); // Create the file entry and find out where it goes. Create new folder levels as necessary. MenuEntries.Files.File fileEntry = new MenuEntries.Files.File(file); MenuEntries.Base.Container container = fileSourceEntry; foreach (string pathSegment in pathSegments) { Path pathFromFileSource; if (container == fileSourceEntry) { pathFromFileSource = pathSegment; } else { pathFromFileSource = (container as MenuEntries.Files.Folder).PathFromFileSource + '/' + pathSegment; } MenuEntries.Files.Folder folderEntry = null; foreach (var member in container.Members) { if (member is MenuEntries.Files.Folder && (member as MenuEntries.Files.Folder).PathFromFileSource == pathFromFileSource) { folderEntry = (MenuEntries.Files.Folder)member; break; } } if (folderEntry == null) { folderEntry = new MenuEntries.Files.Folder(pathFromFileSource); folderEntry.Parent = container; container.Members.Add(folderEntry); } container = folderEntry; } fileEntry.Parent = container; container.Members.Add(fileEntry); }
/* Function: AddClass * Adds a class to the menu tree. */ public void AddClass(Symbols.ClassString classString) { #if DEBUG if (isCondensed) { throw new Exception("Cannot add a class to the menu once it's been condensed."); } #endif string[] classSegments = classString.Symbol.SplitSegments(); MenuEntries.Base.Container container; bool ignoreCase; if (classString.Hierarchy == Symbols.ClassString.HierarchyType.Class) { MenuEntries.Classes.Language languageEntry = FindOrCreateLanguageEntryOf(classString); container = languageEntry; ignoreCase = (languageEntry.WrappedLanguage.CaseSensitive == false); } else // Database { if (rootDatabaseMenu == null) { rootDatabaseMenu = new MenuEntries.Base.Container(); rootDatabaseMenu.Title = Engine.Locale.Get("NaturalDocs.Engine", "Menu.Database"); } container = rootDatabaseMenu; ignoreCase = true; } // Create the class and find out where it goes. Create new scope containers as necessary. MenuEntries.Classes.Class classEntry = new MenuEntries.Classes.Class(classString); string scopeSoFar = null; // We only want to walk through the scope levels so we use length - 1 to ignore the last segment, which is the class name. for (int i = 0; i < classSegments.Length - 1; i++) { string classSegment = classSegments[i]; if (scopeSoFar == null) { scopeSoFar = classSegment; } else { scopeSoFar += Symbols.SymbolString.SeparatorChar + classSegment; } MenuEntries.Classes.Scope scopeEntry = null; foreach (var member in container.Members) { if (member is MenuEntries.Classes.Scope && string.Compare((member as MenuEntries.Classes.Scope).WrappedScopeString, scopeSoFar, ignoreCase) == 0) { scopeEntry = (MenuEntries.Classes.Scope)member; break; } } if (scopeEntry == null) { scopeEntry = new MenuEntries.Classes.Scope(Symbols.SymbolString.FromExportedString(scopeSoFar)); scopeEntry.Parent = container; container.Members.Add(scopeEntry); } container = scopeEntry; } classEntry.Parent = container; container.Members.Add(classEntry); }