using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using Maestro.Shared.UI; using Maestro.Base.UI; using Maestro.Base; using Maestro.Base.Services; using ICSharpCode.Core; using OSGeo.MapGuide.MaestroAPI.Resource; using OSGeo.MapGuide.MaestroAPI.Resource.Validation; using OSGeo.MapGuide.MaestroAPI; using OSGeo.MapGuide.MaestroAPI.Exceptions; using OSGeo.MapGuide.ObjectModels.Common; namespace HelloAddIn { public partial class SidePanel : SingletonViewContent { public SidePanel() { InitializeComponent(); this.Title = "Side Panel"; } private ISiteExplorer _siteExplorer; protected override void OnLoad(EventArgs e) { base.OnLoad(e); _siteExplorer = Workbench.Instance.ActiveSiteExplorer; _siteExplorer.ItemsSelected += new RepositoryItemEventHandler(OnItemsSelected); CheckButtonState(new RepositoryItem[0]); } void OnItemsSelected(object sender, RepositoryItem[] items) { CheckButtonState(items); } private void CheckButtonState(RepositoryItem[] items) { btnOpenEditor.Enabled = false; btnValidate.Enabled = false; if (items.Length == 1) { btnOpenEditor.Enabled = (!items[0].IsFolder); btnValidate.Enabled = true; } } /// /// Gets the default preferred region this view will "dock" to. For this example we prefer the view docks /// to the right /// public override ViewRegion DefaultRegion { get { return ViewRegion.Right; } } private void btnOpenEditor_Click(object sender, EventArgs e) { //ServerConnectionManager manages the open site connections var connMgr = ServiceRegistry.GetService(); //OpenResourceManager manages the display of resource editor views. This is strongly recommended over using the //ViewContentManager as it knows about what type of editor to create, if it is already open (which in that case //it will activate that instance instead), and knowing whether to fall-back to a generic XML editor (for unknown //resource types and/or unsupported schema versions) var openMgr = ServiceRegistry.GetService(); //The connection name property of the Site Explorer gives us the name of the active connection. The active connection //is the connection that the selected item belongs to. string connName = _siteExplorer.ConnectionName; //We use the connection name to obtain the IServerConnection instance from the ServerConnectionManager var conn = connMgr.GetConnection(connName); //We normally shouldn't dive in like this (ie. We should check the number of items and if it's the valid type //but we already validated this condition in OnItemsSelected, meaning when this method executes, this next line //should never be illegal. var resId = _siteExplorer.SelectedItems[0].ResourceId; openMgr.Open(resId, conn, false, _siteExplorer); } protected object BackgroundValidate(BackgroundWorker worker, DoWorkEventArgs e, params object[] args) { //Collect all documents to be validated. Some of these selected items //may be folders. var documents = new List(); var conn = (IServerConnection)args[0]; foreach (object a in args.Skip(1)) { string rid = a.ToString(); if (ResourceIdentifier.Validate(rid)) { var resId = new ResourceIdentifier(rid); if (resId.IsFolder) { foreach (IRepositoryItem o in conn.ResourceService.GetRepositoryResources(rid).Children) { if (!o.IsFolder) { documents.Add(o.ResourceId); } } } else { documents.Add(rid); } } } worker.ReportProgress(0); var context = new ResourceValidationContext(conn.ResourceService, conn.FeatureService); var set = new ValidationResultSet(); int i = 0; foreach (string s in documents) { worker.ReportProgress((int)((i / (double)documents.Count) * 100), s); IResource item = null; try { item = conn.ResourceService.GetResource(s); set.AddIssues(ResourceValidatorSet.Validate(context, item, true)); } catch (Exception ex) { string msg = NestedExceptionMessageProcessor.GetFullMessage(ex); set.AddIssue(new ValidationIssue(item, ValidationStatus.Error, ValidationStatusCode.Error_General_ValidationError, string.Format("Failed to validate resource: {0}", msg))); } i++; worker.ReportProgress((int)((i / (double)documents.Count) * 100), s); } return set.GetAllIssues(); } private void btnValidate_Click(object sender, EventArgs e) { var wb = Workbench.Instance; var items = wb.ActiveSiteExplorer.SelectedItems; var connMgr = ServiceRegistry.GetService(); var conn = connMgr.GetConnection(wb.ActiveSiteExplorer.ConnectionName); if (items.Length > 0) { var pdlg = new ProgressDialog(); pdlg.CancelAbortsThread = true; object[] args = new object[items.Length + 1]; args[0] = conn; for (int i = 0; i < items.Length; i++) { args[i+1] = items[i].ResourceId; } var issues = (ValidationIssue[])pdlg.RunOperationAsync(wb, new ProgressDialog.DoBackgroundWork(BackgroundValidate), args); CollectAndDisplayIssues(issues); } } static void CollectAndDisplayIssues(ValidationIssue[] issues) { if (issues != null) { if (issues.Length > 0) { //Sigh! LINQ would've made this code so simple... var sort = new Dictionary>(); foreach (var issue in issues) { string resId = issue.Resource.ResourceID; if (!sort.ContainsKey(resId)) sort[resId] = new List(); sort[resId].Add(issue); } var groupedIssues = new List>(); foreach (var kvp in sort) { groupedIssues.Add( new KeyValuePair( kvp.Key, kvp.Value.ToArray())); } var resDlg = new ValidationResultsDialog(groupedIssues); resDlg.Show(); } else { MessageService.ShowMessage("No validation issues found"); } } } } }