/// <summary> /// Check to see if a tag is already open in the Editor Pane /// </summary> /// <param name="tag">The tag to search for</param> private bool IsTagOpen(TagEntry tag) { return contentTabs.Items.Cast<CloseableTabItem>().Any(tab => tab.Tag != null && ((TagEntry) tab.Tag).RawTag == tag.RawTag); }
public void CreateTag(TagEntry tag) { TagEntry selectedTag = null; TabItem selectedTab = null; if (_tagOpenMode == Settings.TagOpenMode.ExistingTab) { // Get current tab, make sure it is a tag var currentTab = contentTabs.SelectedItem as CloseableTabItem; if (currentTab != null && currentTab.Tag != null && currentTab.Content is MetaContainer && currentTab.Tag is TagEntry) { // Save this selectedTag = (TagEntry) currentTab.Tag; selectedTab = currentTab; } else { foreach ( CloseableTabItem tab in contentTabs.Items.Cast<CloseableTabItem>().Where(tab => tab.Tag is TagEntry && tab.Content is MetaContainer)) { selectedTag = (TagEntry) tab.Tag; selectedTab = tab; } } // ReSharper disable ConditionIsAlwaysTrueOrFalse if (selectedTag != null && selectedTab != null) { var metaContainer = (MetaContainer) selectedTab.Content; metaContainer.LoadNewTagEntry(tag); selectedTab.Header = new ContentControl { Content = string.Format("{0}.{1}", tag.TagFileName.Substring(tag.TagFileName.LastIndexOf('\\') + 1), CharConstant.ToString(tag.RawTag.Class.Magic)), ContextMenu = BaseContextMenu }; selectedTab.Tag = tag; SelectTabFromTag(tag); return; } // ReSharper restore ConditionIsAlwaysTrueOrFalse } if (!IsTagOpen(tag)) { contentTabs.Items.Add(new CloseableTabItem { Header = new ContentControl { Content = string.Format("{0}.{1}", tag.TagFileName.Substring(tag.TagFileName.LastIndexOf('\\') + 1), CharConstant.ToString(tag.RawTag.Class.Magic)), ContextMenu = BaseContextMenu }, Tag = tag, Content = new MetaContainer(_buildInfo, tag, _allTags, _cacheFile, _mapManager, _rteProvider, _stringIdTrie) }); } SelectTabFromTag(tag); }
private bool FilterTag(TagEntry tag, string filter) { if (App.AssemblyStorage.AssemblySettings.HalomapOnlyShowBookmarkedTags && !tag.IsBookmark) return false; if (string.IsNullOrWhiteSpace(filter)) return true; if (filter.StartsWith("0x")) { // Datum search string searchHex = filter.Substring(2); if (tag.RawTag.Index.ToString().ToLower().Substring(2).Contains(searchHex)) return true; } // Name search return tag.TagFileName.ToLower().Contains(filter) || tag.ClassName.ToLower().Contains(filter); }
private void extractTags(bool withRaw, TagEntry tag) { // Ask where to save the extracted tag collection var sfd = new SaveFileDialog { Title = "Save Tag Set", Filter = "Tag Container Files|*.tagc" }; bool? result = sfd.ShowDialog(); if (!result.Value) return; // Make a tag container var container = new TagContainer(); // Recursively extract tags var tagsToProcess = new Queue<ITag>(); var tagsProcessed = new HashSet<ITag>(); var resourcesToProcess = new Queue<DatumIndex>(); var resourcesProcessed = new HashSet<DatumIndex>(); var resourcePagesProcessed = new HashSet<ResourcePage>(); tagsToProcess.Enqueue(tag.RawTag); ResourceTable resources = null; using (var reader = _mapManager.OpenRead()) { while (tagsToProcess.Count > 0) { var currentTag = tagsToProcess.Dequeue(); if (tagsProcessed.Contains(currentTag)) continue; // Get the plugin path var className = VariousFunctions.SterilizeTagClassName(CharConstant.ToString(currentTag.Class.Magic)).Trim(); var pluginPath = string.Format("{0}\\{1}\\{2}.xml", VariousFunctions.GetApplicationLocation() + @"Plugins", _buildInfo.Settings.GetSetting<string>("plugins"), className); // Extract dem data blocks var blockBuilder = new DataBlockBuilder(reader, currentTag, _cacheFile, _buildInfo); using (var pluginReader = XmlReader.Create(pluginPath)) AssemblyPluginLoader.LoadPlugin(pluginReader, blockBuilder); foreach (var block in blockBuilder.DataBlocks) container.AddDataBlock(block); // Add data for the tag that was extracted var tagName = _cacheFile.FileNames.GetTagName(currentTag) ?? currentTag.Index.ToString(); var extractedTag = new ExtractedTag(currentTag.Index, currentTag.MetaLocation.AsPointer(), currentTag.Class.Magic, tagName); container.AddTag(extractedTag); // Mark the tag as processed and then enqueue all of its child tags and resources tagsProcessed.Add(currentTag); foreach (var tagRef in blockBuilder.ReferencedTags) tagsToProcess.Enqueue(_cacheFile.Tags[tagRef]); foreach (var resource in blockBuilder.ReferencedResources) resourcesToProcess.Enqueue(resource); } // Load the resource table in if necessary if (resourcesToProcess.Count > 0) resources = _cacheFile.Resources.LoadResourceTable(reader); } // Extract resource info if (resources != null) { while (resourcesToProcess.Count > 0) { var index = resourcesToProcess.Dequeue(); if (resourcesProcessed.Contains(index)) continue; // Add the resource var resource = resources.Resources[index.Index]; container.AddResource(new ExtractedResourceInfo(index, resource)); // Add data for its pages if (resource.Location == null) continue; if (resource.Location.PrimaryPage != null && !resourcePagesProcessed.Contains(resource.Location.PrimaryPage)) { container.AddResourcePage(resource.Location.PrimaryPage); resourcePagesProcessed.Add(resource.Location.PrimaryPage); if (withRaw) { using (var fileStream = File.OpenRead(_cacheLocation)) { var resourceFile = _cacheFile; Stream resourceStream = fileStream; if (resource.Location.PrimaryPage.FilePath != null) { var resourceCacheInfo = App.AssemblyStorage.AssemblySettings.HalomapResourceCachePaths.FirstOrDefault( r => r.EngineName == _buildInfo.Name); var resourceCachePath = (resourceCacheInfo != null) ? resourceCacheInfo.ResourceCachePath : Path.GetDirectoryName(_cacheLocation); resourceCachePath = Path.Combine(resourceCachePath ?? "", Path.GetFileName(resource.Location.PrimaryPage.FilePath)); if (!File.Exists(resourceCachePath)) { MetroMessageBox.Show("Unable to extract tag", "Unable to extract tag, because a resource it relies on is in a external cache '{0}' that could not be found. Check Assembly's settings and set the file path to resource caches."); return; } resourceStream = File.OpenRead(resourceCachePath); resourceFile = new ThirdGenCacheFile(new EndianReader(resourceStream, Endian.BigEndian), _buildInfo, _cacheFile.BuildString); } var extractor = new ResourcePageExtractor(resourceFile); byte[] pageData; using (var pageStream = new MemoryStream()) { extractor.ExtractPage(resource.Location.PrimaryPage, resourceStream, pageStream); pageData = new byte[pageStream.Length]; Buffer.BlockCopy(pageStream.GetBuffer(), 0, pageData, 0, (int) pageStream.Length); } container.AddExtractedResourcePage(new ExtractedPage(pageData, resource.Location.PrimaryPage.Index)); } } } if (resource.Location.SecondaryPage == null || resourcePagesProcessed.Contains(resource.Location.SecondaryPage)) continue; container.AddResourcePage(resource.Location.SecondaryPage); resourcePagesProcessed.Add(resource.Location.SecondaryPage); if (withRaw) { using (var fileStream = File.OpenRead(_cacheLocation)) { var resourceFile = _cacheFile; Stream resourceStream = fileStream; if (resource.Location.SecondaryPage.FilePath != null) { var resourceCacheInfo = App.AssemblyStorage.AssemblySettings.HalomapResourceCachePaths.FirstOrDefault( r => r.EngineName == _buildInfo.Name); var resourceCachePath = (resourceCacheInfo != null) ? resourceCacheInfo.ResourceCachePath : Path.GetDirectoryName(_cacheLocation); resourceCachePath = Path.Combine(resourceCachePath ?? "", Path.GetFileName(resource.Location.SecondaryPage.FilePath)); if (!File.Exists(resourceCachePath)) { MetroMessageBox.Show("Unable to extract tag", "Unable to extract tag, because a resource it relies on is in a external cache '{0}' that could not be found. Check Assembly's settings and set the file path to resource caches."); return; } resourceStream = File.OpenRead(resourceCachePath); resourceFile = new ThirdGenCacheFile(new EndianReader(resourceStream, Endian.BigEndian), _buildInfo, _cacheFile.BuildString); } var extractor = new ResourcePageExtractor(resourceFile); byte[] pageData; using (var pageStream = new MemoryStream()) { extractor.ExtractPage(resource.Location.SecondaryPage, resourceStream, pageStream); pageData = new byte[pageStream.Length]; Buffer.BlockCopy(pageStream.GetBuffer(), 0, pageData, 0, (int)pageStream.Length); } container.AddExtractedResourcePage(new ExtractedPage(pageData, resource.Location.SecondaryPage.Index)); } } } } // Write it to a file using (var writer = new EndianWriter(File.Open(sfd.FileName, FileMode.Create, FileAccess.Write), Endian.BigEndian)) TagContainerWriter.WriteTagContainer(container, writer); // YAY! MetroMessageBox.Show("Extraction Successful", "Extracted " + container.Tags.Count + " tag(s), " + container.DataBlocks.Count + " data block(s), " + container.ResourcePages.Count + " resource page pointer(s), " + container.ExtractedResourcePages.Count + " extracted resource page(s), and " + container.Resources.Count + " resource pointer(s)."); }
/// <summary> /// Select a tab based on a TagEntry /// </summary> /// <param name="tag">The tag to search for</param> private void SelectTabFromTag(TagEntry tag) { CloseableTabItem tab = null; foreach ( CloseableTabItem tabb in contentTabs.Items.Cast<CloseableTabItem>() .Where(tabb => tabb.Tag != null && ((TagEntry) tabb.Tag).RawTag == tag.RawTag)) tab = tabb; if (tab != null) contentTabs.SelectedItem = tab; }
private void LoadTags() { if (_cacheFile.TagClasses == null || _cacheFile.Tags == null) return; // Load all the tag classes into data var classes = new List<TagClass>(); var classWrappers = new Dictionary<ITagClass, TagClass>(); Dispatcher.Invoke(new Action(() => { foreach (var tagClass in _cacheFile.TagClasses) { var wrapper = new TagClass(tagClass, CharConstant.ToString(tagClass.Magic), _cacheFile.StringIDs.GetString(tagClass.Description)); classes.Add(wrapper); classWrappers[tagClass] = wrapper; } })); Dispatcher.Invoke(new Action(() => StatusUpdater.Update("Loaded Tag Classes"))); // Load all the tags into the treeview (into their class categoies) _hierarchy.Entries = new List<TagEntry>(); foreach (var tag in _cacheFile.Tags) { if (tag.MetaLocation != null) { var fileName = _cacheFile.FileNames.GetTagName(tag); if (fileName == null || fileName.Trim() == "") fileName = tag.Index.ToString(); var parentClass = classWrappers[tag.Class]; var entry = new TagEntry(tag, parentClass, fileName); parentClass.Children.Add(entry); _hierarchy.Entries.Add(entry); } else _hierarchy.Entries.Add(null); } foreach (var tagClass in classes) tagClass.Children.Sort((x, y) => String.Compare(x.TagFileName, y.TagFileName, StringComparison.OrdinalIgnoreCase)); //// Taglist Generation /*string taglistPath = @"C:\" + _cacheFile.Info.InternalName.ToLower() + ".taglist"; List<string> taglist = new List<string>(); taglist.Add("<scenario=\"" + _cacheFile.Info.ScenarioName + "\">"); for (int i = 0; i < _cacheFile.Tags.Count; i++) { ITag tag = _cacheFile.Tags[i]; if (tag.Index.IsValid) taglist.Add(string.Format("\t<tag id=\"{0}\" class=\"{1}\">{2}</tag>", tag.Index.ToString(), ExtryzeDLL.Util.CharConstant.ToString(tag.Class.Magic) ,_cacheFile.FileNames.FindTagName(tag.Index))); } taglist.Add("</scenario>"); File.WriteAllLines(taglistPath, taglist.ToArray<string>());*/ Dispatcher.Invoke(new Action(() => StatusUpdater.Update("Loaded Tags"))); classes.Sort((x, y) => String.Compare(x.TagClassMagic, y.TagClassMagic, StringComparison.OrdinalIgnoreCase)); Dispatcher.Invoke(new Action(delegate { _tagsComplete = new ObservableCollection<TagClass>(classes); // Load un-populated tags foreach (var tagClass in _tagsComplete.Where(tagClass => tagClass.Children.Count > 0)) _tagsPopulated.Add(tagClass); _hierarchy.Classes = _tagsPopulated; })); // Add to the treeview Dispatcher.Invoke(new Action(() => UpdateEmptyTags(cbShowEmptyTags.IsChecked != null && (bool) cbShowEmptyTags.IsChecked))); }
public void OpenTag(TagEntry tag) { if (!IsTagOpen(tag)) { contentTabs.Items.Add(new CloseableTabItem { Header = new ContentControl { Content = string.Format("{0}.{1}", tag.TagFileName.Substring(tag.TagFileName.LastIndexOf('\\') + 1), CharConstant.ToString(tag.RawTag.Class.Magic)), ContextMenu = BaseContextMenu }, Tag = tag, Content = new MetaContainer(_buildInfo, tag, _hierarchy, _cacheFile, _mapManager, _rteProvider, _stringIDTrie) }); } SelectTabFromTag(tag); }
/// <summary> /// Select a tab based on a TagEntry /// </summary> /// <param name="tag">The tag to search for</param> private void SelectTabFromTag(TagEntry tag) { CloseableTabItem tab = null; foreach (CloseableTabItem tabb in contentTabs.Items) if (tabb.Tag == tag) tab = tabb; if (tab != null) contentTabs.SelectedItem = tab; }
/// <summary> /// Check to see if a tag is already open in the Editor Pane /// </summary> /// <param name="tag">The tag to search for</param> private bool IsTagOpen(TagEntry tag) { foreach (CloseableTabItem tab in contentTabs.Items) if (tab.Tag == tag) return true; return false; }
public void OpenTag(TagEntry tag) { if (!IsTagOpen(tag)) { contentTabs.Items.Add(new CloseableTabItem() { Header = string.Format("{0}.{1}", tag.TagFileName.Substring(tag.TagFileName.LastIndexOf('\\') + 1).Replace("_", "__"), CharConstant.ToString(tag.RawTag.Class.Magic)), Tag = tag, Content = new MetaContainer(_buildInfo, tag, _hierarchy, _cacheFile, _mapManager) }); } SelectTabFromTag(tag); }