示例#1
0
        /// <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]);
        }