/// <summary> /// Launches a preview of the given open resource /// </summary> /// <param name="conn"></param> /// <param name="resourceId"></param> /// <param name="locale"></param> public void PreviewResource(IServerConnection conn, string resourceId, string locale) { Action action = () => { var siteExp = this.MainWindow.ActiveSiteExplorer; var omgr = ServiceRegistry.GetService <OpenResourceManager>(); IEditorViewContent openEd = null; foreach (var ed in omgr.OpenEditors) { if (ed.EditorService.CurrentConnection == conn && ed.EditorService.ResourceID == resourceId) { openEd = ed; break; } } if (openEd != null) { var previewer = ResourcePreviewerFactory.GetPreviewer(conn.ProviderName); if (previewer != null) { previewer.Preview(openEd.Resource, openEd.EditorService, locale); } else { throw new Exception(string.Format(Strings.Error_NoPreviewer, conn.ProviderName)); } } else { throw new Exception(string.Format(Strings.Error_NoOpenEditor, resourceId)); } }; if (this.MainWindow.InvokeRequired) { this.MainWindow.Invoke(action); } else { action(); } }
private IEditorViewContent FindEditor(ViewContentManager svc, ResourceTypeDescriptor rtd) { IEditorViewContent ed = null; IEditorFactory fact = GetRegisteredEditor(rtd); //No registered editor, use the xml editor fallback if (fact == null) { ed = svc.OpenContent <XmlEditor>(ViewRegion.Document); } else { //I LOVE ANONYMOUS DELEGATES! ed = svc.OpenContent(ViewRegion.Document, () => { return(fact.Create()); }); } if (ed == null) { ed = svc.OpenContent <XmlEditor>(ViewRegion.Document); } return(ed); }
internal static string ComputeResourceKey(IResource res, IServerConnection conn) => $"{conn.DisplayName}|{res.ResourceID}"; //NOXLATE /// <summary> /// Opens the specified resource using its assigned editor. If the resource is already /// open, the the existing editor view is activated instead. If the resource has no assigned /// editor or useXmlEditor is true, the resource will be opened in the default /// XML editor. /// </summary> /// <param name="res"></param> /// <param name="conn"></param> /// <param name="useXmlEditor"></param> /// <param name="siteExp"></param> public IEditorViewContent Open(IResource res, IServerConnection conn, bool useXmlEditor, ISiteExplorer siteExp) { string key = ComputeResourceKey(res, conn); if (!_openItems.ContainsKey(key)) { var svc = ServiceRegistry.GetService <ViewContentManager>(); IEditorViewContent ed = null; if (useXmlEditor || !res.IsStronglyTyped) { ed = svc.OpenContent <XmlEditor>(ViewRegion.Document); } else { ed = FindEditor(svc, res.GetResourceTypeDescriptor()); } var launcher = ServiceRegistry.GetService <UrlLauncherService>(); var editorSvc = new ResourceEditorService(res.ResourceID, conn, launcher, siteExp, this, this); ed.EditorService = editorSvc; _openItems[key] = ed; CancelEventHandler vcClosing = (sender, e) => { if (ed.IsDirty && !ed.DiscardChangesOnClose) { if (ed.IsNew) { if (!MessageService.AskQuestion(string.Format(Strings.CloseUnsavedResource, string.Empty))) { e.Cancel = true; } } else { using (var diag = new DirtyStateConfirmationDialog(ed.EditorService)) { if (diag.ShowDialog() == System.Windows.Forms.DialogResult.No) { e.Cancel = true; } } } } }; ed.ViewContentClosing += WeakEventHandler.Wrap(vcClosing, (eh) => ed.ViewContentClosing -= eh); EventHandler vcClosed = (sender, e) => { //Recompute the resource key as that may have changed by a save as operation _openItems.Remove(ComputeResourceKey(((EditorContentBase)sender).EditorService.ResourceID, conn)); siteExp.FlagNode(conn.DisplayName, ed.EditorService.ResourceID, NodeFlagAction.None); }; ed.ViewContentClosed += WeakEventHandler.Wrap(vcClosed, (eh) => ed.ViewContentClosed -= eh); EventHandler edSaved = (sender, e) => { //If saved from new resource, the resource id would be session based //So we need to update this to the new resource id as defined by the //editor service if (_openItems.ContainsKey(key)) { var ed2 = _openItems[key]; _openItems.Remove(key); _openItems[ComputeResourceKey(ed.EditorService.ResourceID, conn)] = ed2; } }; ed.EditorService.Saved += WeakEventHandler.Wrap(edSaved, (eh) => ed.EditorService.Saved -= eh); EventHandler dirty = (sender, e) => { siteExp.FlagNode(conn.DisplayName, res.ResourceID, ed.IsDirty ? NodeFlagAction.HighlightDirty : NodeFlagAction.HighlightOpen); }; ed.DirtyStateChanged += WeakEventHandler.Wrap(dirty, (eh) => ed.DirtyStateChanged -= eh); } _openItems[key].Activate(); siteExp.FlagNode(conn.DisplayName, res.ResourceID, _openItems[key].IsDirty ? NodeFlagAction.HighlightDirty : NodeFlagAction.HighlightOpen); return(_openItems[key]); }