private static void ReloadTheme(TmNode node) { Debug.Assert(node != null, "There is no bound TMNode for this property panel"); if (node == null) { MessageBox.Show("Internal Error: Unable to find the node to reload."); return; } LoadingForm form = new LoadingForm(); if (node.IsTheme) { form.Message = "Reloading " + node.Name + "..."; } else { form.Message = "Reloading all themes in " + node.Name + "..."; } form.AllowCancel = true; form.Node = node; form.Command = form.ReloadNodeAsync; form.ShowDialog(); //Treeview may need updating. //Data type (icon) may have changed, and sub-themes may have been added/removed. node.UpdateTree(); }
internal DataTable ListThemesWithUnknownIcon(TmNode themeList, BackgroundWorker bw) { DataTable data = new DataTable(); data.Columns.Add(new DataColumn("Category", typeof(string))); data.Columns.Add(new DataColumn("Theme", typeof(string))); data.Columns.Add(new DataColumn("Type", typeof(string))); data.Columns.Add(new DataColumn("Theme Path", typeof(string))); data.Columns.Add(new DataColumn("Theme Type", typeof(string))); foreach (var theme in themeList.Recurse(x => x.Children) .Where(n => (n.IsTheme || n.IsSubTheme) && (n.ImageKey == "Theme" || n.ImageKey == "Themelock" || n.ImageKey == "Themenew" || n.Data.Type.Contains("Error", StringComparison.OrdinalIgnoreCase)))) { DataRow row = data.NewRow(); row["Category"] = theme.CategoryPath(); row["Theme"] = theme.Name; row["Type"] = (theme.IsTheme) ? "Theme" : "SubTheme"; row["Theme Path"] = theme.Data.Path; row["Theme Type"] = theme.Data.Type; data.Rows.Add(row); if (bw.CancellationPending) { return(data); } } return(data); }
internal async Task<string> ReloadNodeAsync(TmNode root) { if (root == null) return "No node provided for reload"; root.SuspendUpdates(); List<TmNode> nodes = root.Recurse(x => x.Children) .Where(n => n.IsTheme) .ToList(); int count = nodes.Count; int index = 0; foreach (var node in nodes) { progressLabel.Text = string.Format("Loading {1} of {2} ({0})", node.Name, index + 1, count); progressBar.Value = (int)(100 * (float)index / count); try { await node.ReloadThemeAsync(); } catch (Exception ex) { root.ResumeUpdates(); return ex.Message; } if (CancelRequested) { root.ResumeUpdates(); return null; } index++; } root.ResumeUpdates(); return null; }
internal DataTable ListThemesWithNoMetadataInfo(TmNode themeList, BackgroundWorker bw) { DataTable data = new DataTable(); data.Columns.Add(new DataColumn("Category", typeof(string))); data.Columns.Add(new DataColumn("Theme", typeof(string))); data.Columns.Add(new DataColumn("Type", typeof(string))); data.Columns.Add(new DataColumn("Metadata Path", typeof(string))); foreach (var theme in themeList.Recurse(x => x.Children) .Where(n => (n.IsTheme || n.IsSubTheme) && !string.IsNullOrWhiteSpace(n.Metadata.Path) && string.IsNullOrWhiteSpace(n.Description) && string.IsNullOrWhiteSpace(n.Summary) && string.IsNullOrWhiteSpace(n.Tags))) { DataRow row = data.NewRow(); row["Category"] = theme.CategoryPath(); row["Theme"] = theme.Name; row["Type"] = (theme.IsTheme) ? "Theme" : "SubTheme"; row["Metadata Path"] = theme.Metadata.Path; data.Rows.Add(row); if (bw.CancellationPending) { return(data); } } return(data); }
static async Task ReloadAsync(TmNode root) { List <TmNode> nodes = root.Recurse(x => x.Children) .Where(n => n.IsTheme) .ToList(); Console.WriteLine($"Reloading {nodes.Count} Themes"); //TODO: reload nodes in parallel foreach (var node in nodes) { try { await node.ReloadThemeAsync(); } catch (Exception ex) { Console.WriteLine($"\nError reloading node {node.CategoryPath()}/{node.Name}: {ex.Message}"); } if (!node.HasData) { Console.WriteLine($"\nNode {node.CategoryPath()}/{node.Name} has no data"); } if (!node.HasMetadata) { Console.WriteLine($"\nNode {node.CategoryPath()}/{node.Name} ({node.Data?.Type}) has no metadata"); } Console.Write("."); } Console.WriteLine(""); }
public override void Build(TmNode node) { if (node == null) { throw new ArgumentNullException("TMNode is null"); } if (!_loaded) { Load(); } if (Version[0] == '1') { // version 1 had no tbl_list, and hence no databaseInfo node.Name = _path; } if (Version[0] == '2') { node.Name = _databaseInfo.Name; if (!string.IsNullOrEmpty(_databaseInfo.Link)) { node.Metadata = new Metadata(_databaseInfo.Link, MetadataType.Url, MetadataFormat.Html); } node.Description = _databaseInfo.Description; if (_databaseInfo.HasAuthor) { node.Author = _databaseInfo.Author; } } FillCategory(node, -1); }
private DataTable ListThemes(TmNode themeList, BackgroundWorker bw) { DataTable data = new DataTable(); data.Columns.Add(new DataColumn("Category", typeof(string))); data.Columns.Add(new DataColumn("Theme", typeof(string))); data.Columns.Add(new DataColumn("File", typeof(string))); data.Columns.Add(new DataColumn("File Type", typeof(string))); foreach (var theme in themeList.Recurse(x => x.Children).Where(n => n.IsTheme)) { DataRow row = data.NewRow(); row["Category"] = theme.CategoryPath(); row["Theme"] = theme.Name; row["File"] = theme.Data.Path; if (!string.IsNullOrEmpty(theme.Data.Path)) { row["File Type"] = Path.GetExtension(theme.Data.Path); } data.Rows.Add(row); if (bw.CancellationPending) { return(data); } } return(data); }
private static async Task BuildThemesForNodeAsync(TmNode tmNode) { IGisLayer layer; try { layer = await GisInterface.ParseItemAtPathAsGisLayerAsync(tmNode.Data.Path); } catch (Exception ex) { Debug.Print("Unable to load GIS data layers at " + tmNode.Data.Path + " " + ex.Message); // The caller set a default type. Do not return too much info, it may generate an unexpected icon. tmNode.Data.Type += "; Unable to load."; return; } tmNode.Data.Type = layer.DataType; if (layer.IsGroup) { await BuildSubThemesForGroupLayerAsync(tmNode, layer); } else { BuildThemeDataForLayer(tmNode.Data, layer); } }
private async Task SyncThemeAsync(TmNode node) { Debug.Assert(node != null, "There is no bound TMNode for this property panel"); if (node == null) { MessageBox.Show("Internal Error: Unable to find the node to sync."); return; } if (node.HasChildren) { SyncThemes(node); } else { if (string.IsNullOrEmpty(node.Metadata.Path)) { MessageBox.Show("Theme has no metadata"); return; } try { // May need to load/verify metadata which could throw. // No need to recurse, since we just checked that we have no children. await node.SyncWithMetadataAsync(false); } catch (Exception ex) { MessageBox.Show($"Metadata Error: {ex.Message}."); } } }
internal async Task<string> SyncNodeAsync(TmNode root) { if (root == null) return "No node provided for sync"; root.SuspendUpdates(); List<TmNode> nodes = root.Recurse(x => x.Children) .Where(n => !string.IsNullOrEmpty(n.Metadata.Path)) .ToList(); int count = nodes.Count; int index = 0; foreach (var node in nodes) { progressLabel.Text = string.Format("Syncing {1} of {2} ({0})", node.Name, index + 1, count); progressBar.Value = (int)(100 * (float)index / count); try { await node.SyncWithMetadataAsync(false); } catch (Exception ex) { root.ResumeUpdates(); return ex.Message; } if (CancelRequested) { root.ResumeUpdates(); return null; } index++; } root.ResumeUpdates(); return null; }
private static async Task BuildSubThemesForGroupLayerAsync(TmNode node, IGisLayer layer) { foreach (var sublayer in layer.SubLayers) { //TODO: Build in parallel await BuildSubThemeForLayerAsync(node, sublayer); } }
public override void Build(TmNode node) { if (!IsThemeList) { return; } node.Load(_xml); }
public TmTreeNode(TmNode tmNode) { TmNode = tmNode ?? throw new ArgumentNullException("tmNode"); UpdateProperties(); tmNode.PropertyChanged += Data_PropertyChanged; tmNode.ReloadNode += Data_ReloadNode; tmNode.ChildRemoved += Data_ChildRemoved; tmNode.ChildAdded += Data_ChildAdded; foreach (TmNode child in tmNode.Children) { Nodes.Add(new TmTreeNode(child)); } }
internal DataTable ListDataSources(TmNode themeList, BackgroundWorker bw) { DataTable data = new DataTable(); data.Columns.Add(new DataColumn("Category", typeof(string))); data.Columns.Add(new DataColumn("Theme", typeof(string))); data.Columns.Add(new DataColumn("Type", typeof(string))); data.Columns.Add(new DataColumn("Theme Path", typeof(string))); data.Columns.Add(new DataColumn("Layer Name", typeof(string))); data.Columns.Add(new DataColumn("Theme Type", typeof(string))); data.Columns.Add(new DataColumn("Data Source Path", typeof(string))); data.Columns.Add(new DataColumn("Workspace Path", typeof(string))); data.Columns.Add(new DataColumn("Workspace Type", typeof(string))); data.Columns.Add(new DataColumn("Workspace ProgID", typeof(string))); data.Columns.Add(new DataColumn("Container", typeof(string))); data.Columns.Add(new DataColumn("Container Type", typeof(string))); data.Columns.Add(new DataColumn("Data Source", typeof(string))); data.Columns.Add(new DataColumn("Data Source Type", typeof(string))); foreach (var theme in themeList.Recurse(x => x.Children) .Where(n => (n.IsTheme || n.IsSubTheme))) { DataRow row = data.NewRow(); //reload cannot be done in the background, because treeview // on UI thread gets property updates //theme.ReloadTheme(); row["Category"] = theme.CategoryPath(); row["Theme"] = theme.Name; row["Type"] = (theme.IsTheme) ? "Theme" : "SubTheme"; row["Theme Path"] = theme.Data.Path; row["Layer Name"] = theme.Data.DataSetName; row["Theme Type"] = theme.Data.Type; row["Data Source Path"] = theme.Data.DataSource; row["Workspace Path"] = theme.Data.WorkspacePath; row["Workspace Type"] = theme.Data.WorkspaceType; row["Workspace ProgID"] = theme.Data.WorkspaceProgId; row["Container"] = theme.Data.Container; row["Container Type"] = theme.Data.ContainerType; row["Data Source"] = theme.Data.DataSourceName; row["Data Source Type"] = theme.Data.DataSetType; data.Rows.Add(row); if (bw.CancellationPending) { return(data); } } return(data); }
internal DataTable ListMetadataProblems(TmNode themeList, BackgroundWorker bw) { DataTable data = new DataTable(); data.Columns.Add(new DataColumn("Category", typeof(string))); data.Columns.Add(new DataColumn("Theme", typeof(string))); data.Columns.Add(new DataColumn("Metadata", typeof(string))); data.Columns.Add(new DataColumn("Error", typeof(string))); List <TmNode> nodes = themeList.Recurse(x => x.Children) .Where(n => n.IsTheme || n.IsSubTheme && !string.IsNullOrEmpty(n.Metadata.Path)) .ToList(); int count = nodes.Count; int index = 0; foreach (var theme in nodes) { string error; try { // This is in a cancellable background thread, so we can just wait for each result // This can ignore the boolean "success" response, because we are checking the error message var _ = theme.Metadata.GetGeneralInfoAsync().Result; error = theme.Metadata.ErrorMessage; } catch (Exception ex) { error = ex.Message; } if (error != null) { DataRow row = data.NewRow(); row["Category"] = theme.CategoryPath(); row["Theme"] = theme.Name; row["Metadata"] = theme.Metadata.Path; row["Error"] = error; data.Rows.Add(row); } index++; if (bw.CancellationPending) { return(data); } bw.ReportProgress((int)(100 * (float)index / count)); } return(data); }
private static async Task BuildSubThemeForLayerAsync(TmNode node, IGisLayer subLayer) { ThemeData data = new ThemeData(null, subLayer.DataType); if (subLayer.IsGroup) { TmNode newNode = new TmNode(TmNodeType.Theme, subLayer.Name, node, data, null, null, null); node.Add(newNode); await BuildSubThemesForGroupLayerAsync(newNode, subLayer); } else { BuildThemeDataForLayer(data, subLayer); Metadata md = await Metadata.FromDataSourceAsync(data); TmNode newNode = new TmNode(TmNodeType.Theme, subLayer.Name, node, data, md, null, null); node.Add(newNode); } }
private void FillCategory(TmNode node, int catId) { // A category can have categories and/or themes for children. List <Category> cats; _categoriesInCategories.TryGetValue(catId, out cats); if (cats != null) { foreach (Category cat in cats) { TmNode newNode = new TmNode(TmNodeType.Category, cat.Name, node, null, MakeMetadataForCategory(cat.Link), cat.Description, null ); node.Add(newNode); FillCategory(newNode, cat.Id); } } List <Theme> themes; _themesInCategories.TryGetValue(catId, out themes); if (themes != null) { foreach (Theme theme in themes) { TmNode newNode = new TmNode(TmNodeType.Theme, theme.Name, node, MakeThemeData(theme.Name, theme.DataSource, theme.Type), MakeMetadataForTheme(theme.Metadata), null, theme.PubDate ); node.Add(newNode); FillTheme(newNode, theme.Id); } } }
internal TmNode BuildThemeFromId(int themeId) { if (!_loaded) { Load(); } Theme theme = FindThemebyId(themeId); TmNode newNode = new TmNode(TmNodeType.Theme, theme.Name, null, MakeThemeData(theme.Name, theme.DataSource, theme.Type), MakeMetadataForTheme(theme.Metadata), null, theme.PubDate ); FillTheme(newNode, themeId); return(newNode); }
private void SyncThemes(TmNode node) { Debug.Assert(node != null, "There is no bound TMNode for this property panel"); if (node == null) { MessageBox.Show("Internal Error: Unable to find the node to sync."); return; } LoadingForm form = new LoadingForm { Message = "Syncing all themes in " + node.Name + "...", AllowCancel = true, Node = node }; form.Command = form.SyncNodeAsync; form.ShowDialog(); //Treeview may need updating. //Description is used for tool tips, and PubDate is used for highlighting the icon. node.UpdateTree(); }
static async Task SyncAsync(TmNode root) { List <TmNode> nodes = root.Recurse(x => x.Children) .Where(n => !string.IsNullOrEmpty(n.Metadata.Path)) .ToList(); Console.WriteLine($"Syncing metadata for {nodes.Count} Themes"); foreach (var node in nodes) { try { await node.SyncWithMetadataAsync(false); } catch (Exception ex) { Console.WriteLine($"\nError syncing metadata for node {node.CategoryPath()}/{node.Name}: {ex.Message}"); } Console.Write("."); } Console.WriteLine(""); }
internal DataTable ListThemesNotFound(TmNode themeList, BackgroundWorker bw) { DataTable data = new DataTable(); data.Columns.Add(new DataColumn("Category", typeof(string))); data.Columns.Add(new DataColumn("Theme", typeof(string))); data.Columns.Add(new DataColumn("File", typeof(string))); data.Columns.Add(new DataColumn("Error", typeof(string))); List <TmNode> nodes = themeList.Recurse(x => x.Children).Where(n => n.IsTheme).ToList(); int count = nodes.Count; int index = 0; foreach (var theme in nodes) { if (string.IsNullOrEmpty(theme.Data.Path) || !File.Exists(theme.Data.Path)) { DataRow row = data.NewRow(); row["Category"] = theme.CategoryPath(); row["Theme"] = theme.Name; row["File"] = theme.Data.Path; if (string.IsNullOrEmpty(theme.Data.Path)) { row["Error"] = "Theme has no file"; } else { row["Error"] = "File not found"; } data.Rows.Add(row); } index++; if (bw.CancellationPending) { return(data); } bw.ReportProgress((int)(100 * (float)index / count)); } return(data); }
private void FillTheme(TmNode node, int themeId) { // A theme can have only themes for children. List <Theme> themes; _themesInThemes.TryGetValue(themeId, out themes); if (themes != null) { foreach (Theme theme in themes) { TmNode newNode = new TmNode(TmNodeType.Theme, theme.Name, node, MakeThemeData(theme.Name, theme.DataSource, theme.Type), MakeMetadataForTheme(theme.Metadata), null, theme.PubDate ); node.Add(newNode); FillTheme(newNode, theme.Id); } } }
public override void Save(TmNode node) { _xml = node.ToXElement(); _xml.Save(_path); }
public override void Build(TmNode node) { if (node == null) throw new ArgumentNullException("TMNode is null"); if (!_loaded) Load(); if (Version[0] == '1') { // version 1 had no tbl_list, and hence no databaseInfo node.Name = _path; } if (Version[0] == '2') { node.Name = _databaseInfo.Name; if (!string.IsNullOrEmpty(_databaseInfo.Link)) node.Metadata = new Metadata(_databaseInfo.Link, MetadataType.Url, MetadataFormat.Html); node.Description = _databaseInfo.Description; if (_databaseInfo.HasAuthor) { node.Author = _databaseInfo.Author; } } FillCategory(node, -1); }
internal static async Task BuildSubThemesForMapDocumentAsync(TmNode node) { await BuildThemesForNodeAsync(node); }
public virtual void Save(TmNode node) { }
public override void Save(TmNode node) { //FIXME - Implement Save; // check version and save appropriate to that version throw new NotImplementedException(); }
private void FillCategory(TmNode node, int catId) { // A category can have categories and/or themes for children. List<Category> cats; _categoriesInCategories.TryGetValue(catId, out cats); if (cats != null) foreach (Category cat in cats) { TmNode newNode = new CategoryNode( cat.Name, node, MakeMetadataForCategory(cat.Link), cat.Description ); node.Add(newNode); FillCategory(newNode, cat.Id); } List<Theme> themes; _themesInCategories.TryGetValue(catId, out themes); if (themes != null) foreach (Theme theme in themes) { TmNode newNode = new ThemeNode( theme.Name, node, MakeThemeData(theme.Name, theme.DataSource, theme.Type), MakeMetadataForTheme(theme.Metadata), null, theme.PubDate ); node.Add(newNode); FillTheme(newNode, theme.Id); } }
private void FillTheme(TmNode node, int themeId) { // A theme can have only themes for children, we create new subtheme nodes.. List<Theme> themes; _themesInThemes.TryGetValue(themeId, out themes); if (themes != null) foreach (Theme theme in themes) { TmNode newNode = new SubThemeNode( theme.Name, node, MakeThemeData(theme.Name, theme.DataSource, theme.Type), MakeMetadataForTheme(theme.Metadata), null, theme.PubDate ); node.Add(newNode); FillTheme(newNode, theme.Id); } }
public virtual void Build(TmNode node) { }
public override void Build(TmNode node) { if (!IsThemeList) return; node.Load(_xml); }
internal static async Task BuildThemesForLayerFileAsync(TmNode node) { await BuildThemesForNodeAsync(node); }
internal TmNode BuildThemeFromId(int themeId) { if (!_loaded) Load(); Theme theme = FindThemebyId(themeId); TmNode newNode = new TmNode(TmNodeType.Theme, theme.Name, null, MakeThemeData(theme.Name, theme.DataSource, theme.Type), MakeMetadataForTheme(theme.Metadata), null, theme.PubDate ); FillTheme(newNode, themeId); return newNode; }