Beispiel #1
0
        public static IPreviewHelper Create(
            string extension,
            List <IPreviewHelper> previewAppDescriptions
            )
        {
            IPreviewHelper appDescription = null;

            string lowPointlessExt = extension.ToLower().Replace(@".", string.Empty);

            foreach (var previewAppDescription in previewAppDescriptions)
            {
                foreach (var ext in previewAppDescription.Extensions)
                {
                    if (lowPointlessExt == ext)
                    {
                        appDescription = previewAppDescription;
                        break;
                    }
                }

                if (appDescription != null)
                {
                    break;
                }
            }

            return(appDescription);
        }
        /// <summary>
        /// Opens the specified file using the appropriate preview handler and displays the result in this PreviewHandlerHost.
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        public override bool Open(string filename)
        {
            _appDescription = PreviewAppDescriptionFactory.Create(
                Path.GetExtension(filename),
                PreviewAppDescriptions
                );

            if (_appDescription != null)
            {
                _appDescription.Startup();
            }

            UnloadPreviewHandler();

            if (String.IsNullOrEmpty(filename))
            {
                ErrorMessage = Messages.FileNotLoaded;
                return(false);
            }

            // try to get GUID for the preview handler
            Guid guid = GetPreviewHandlerGUID(filename);

            ErrorMessage = "";

            if (guid != Guid.Empty)
            {
                try
                {
                    if (guid != _currentPreviewHandlerGuid)
                    {
                        _currentPreviewHandlerGuid = guid;

                        // need to instantiate a different COM type (file format has changed)
                        if (_currentPreviewHandler != null)
                        {
                            Marshal.FinalReleaseComObject(_currentPreviewHandler);
                        }

                        // use reflection to instantiate the preview handler type
                        Type comType = Type.GetTypeFromCLSID(_currentPreviewHandlerGuid);
                        _currentPreviewHandler = Activator.CreateInstance(comType);
                    }

                    if (_currentPreviewHandler is IInitializeWithFile)
                    {
                        // some handlers accept a filename
                        ((IInitializeWithFile)_currentPreviewHandler).Initialize(filename, 0);
                    }
                    else if (_currentPreviewHandler is IInitializeWithStream)
                    {
                        if (File.Exists(filename))
                        {
                            // other handlers want an IStream (in this case, a file stream)
                            _currentPreviewHandlerStream = File.Open(filename, FileMode.Open);
                            StreamWrapper stream = new StreamWrapper(_currentPreviewHandlerStream);
                            ((IInitializeWithStream)_currentPreviewHandler).Initialize(stream, 0);
                        }
                        else
                        {
                            ErrorMessage = Messages.FileNotFound;
                        }
                    }

                    if (_currentPreviewHandler is IPreviewHandler)
                    {
                        // bind the preview handler to the control's bounds and preview the content
                        Rectangle r = ClientRectangle;
                        ((IPreviewHandler)_currentPreviewHandler).SetWindow(Handle, ref r);
                        ((IPreviewHandler)_currentPreviewHandler).DoPreview();


                        return(true);
                    }
                }
                catch (Exception ex)
                {
                    ErrorMessage = Messages.PreviewError + ":\n" + ex.Message;
                }
            }
            else
            {
                ErrorMessage = Messages.NoPreviewAvailable;
            }

            return(false);
        }