Example #1
0
        private HResult OpenSpecificEditor(string document, Guid editorType, INiEditorFactory editorFactory, INiHierarchy hier, IServiceProvider serviceProvider, out INiWindowFrame windowFrame)
        {
            windowFrame = null;

            try
            {
                if (document == null)
                {
                    throw new ArgumentNullException("document");
                }
                if (editorFactory == null)
                {
                    throw new ArgumentNullException("editorFactory");
                }
                if (serviceProvider == null)
                {
                    throw new ArgumentNullException("serviceProvider");
                }

                OpenDocument openDocument;
                if (_openDocuments.TryGetValue(document, out openDocument))
                {
                    ErrorUtil.ThrowOnFailure(openDocument.WindowFrame.Show());
                    return(HResult.OK);
                }

                string        editorCaption;
                INiWindowPane windowPane;
                var           hr = editorFactory.CreateEditor(document, out editorCaption, out windowPane);

                if (ErrorUtil.Failure(hr))
                {
                    return(hr);
                }
                if (windowPane == null)
                {
                    return(HResult.False);
                }

                hr = windowPane.SetSite(serviceProvider);

                if (ErrorUtil.Failure(hr))
                {
                    return(hr);
                }

                hr = ((INiShell)GetService(typeof(INiShell))).CreateToolWindow(
                    windowPane,
                    NiDockStyle.Document,
                    NiToolWindowOrientation.Top,
                    out windowFrame
                    );

                if (ErrorUtil.Failure(hr))
                {
                    return(hr);
                }

                ErrorUtil.ThrowOnFailure(windowFrame.SetCaption(
                                             editorCaption ?? Path.GetFileName(document)
                                             ));

                hr = windowPane.Initialize();

                if (ErrorUtil.Failure(hr))
                {
                    return(hr);
                }

                var docData = windowPane as INiPersistDocData;

                if (docData == null)
                {
                    var textBufferProvider = windowPane as INiTextBufferProvider;

                    if (textBufferProvider != null)
                    {
                        INiTextBuffer textBuffer;
                        hr = textBufferProvider.GetTextBuffer(out textBuffer);

                        if (ErrorUtil.Failure(hr))
                        {
                            return(hr);
                        }

                        docData = textBuffer;
                    }
                }

                int rdtCooke = -1;

                if (docData != null)
                {
                    hr = docData.LoadDocData(document);
                    if (ErrorUtil.Failure(hr))
                    {
                        return(hr);
                    }

                    hr = ((INiRunningDocumentTable)GetService(typeof(INiRunningDocumentTable))).Register(
                        document, hier, docData, out rdtCooke
                        );
                    if (ErrorUtil.Failure(hr))
                    {
                        return(hr);
                    }
                }

                windowFrame.SetPropertyEx(NiFrameProperty.DocCookie, rdtCooke);
                windowFrame.SetPropertyEx(NiFrameProperty.DocView, windowPane);
                windowFrame.SetPropertyEx(NiFrameProperty.DocData, docData);
                windowFrame.SetPropertyEx(NiFrameProperty.Document, document);
                windowFrame.SetPropertyEx(NiFrameProperty.EditorType, editorType);
                windowFrame.SetPropertyEx(NiFrameProperty.Hierarchy, hier);
                windowFrame.SetPropertyEx(NiFrameProperty.Type, NiFrameType.Document);

                _openDocuments.Add(document, new OpenDocument(
                                       this,
                                       document,
                                       hier,
                                       windowFrame,
                                       rdtCooke,
                                       docData
                                       ));

                return(windowFrame.Show());
            }
            catch (Exception ex)
            {
                return(ErrorUtil.GetHResult(ex));
            }
        }