Exemple #1
0
        /// <summary>
        /// Function to load all the plug-in assemblies from the plug-in directory.
        /// </summary>
        /// <param name="plugInDirectory">Plug-in directory that contains the assemblies.</param>
        /// <param name="callback">The function to call back to when loading the assembly.</param>
        /// <returns>The list of plug-ins loaded.</returns>
        private static IList <GorgonPlugIn> LoadAssemblies(DirectoryInfo plugInDirectory, Action <string> callback)
        {
            var results = new List <GorgonPlugIn>();
            IEnumerable <FileInfo> assemblies = plugInDirectory.GetFiles("*.dll", SearchOption.AllDirectories);

            foreach (var assembly in assemblies)
            {
                EditorLogging.Print("Loading plug-in assembly \"{0}\".", assembly.FullName);

                if (!Gorgon.PlugIns.IsPlugInAssembly(assembly.FullName))
                {
                    EditorLogging.Print("Assembly \"{0}\" is not a valid plug-in assembly.", assembly.FullName);
                    continue;
                }

                if (callback != null)
                {
                    callback(assembly.FullName);
                }

                // Load the DLL and return the list of plugins from it.
                AssemblyName name = Gorgon.PlugIns.LoadPlugInAssembly(assembly.FullName);
                IEnumerable <GorgonPlugIn> plugIns = Gorgon.PlugIns.EnumeratePlugIns(name);

                results.AddRange(plugIns.Where(item => item is EditorPlugIn || item is GorgonFileSystemProviderPlugIn));
            }

            return(results);
        }
Exemple #2
0
        /// <summary>
        /// Function to initialize the plug-ins interface.
        /// </summary>
        private void InitializePlugIns()
        {
            PlugIns.PlugInPath          = Program.Settings.PlugInDirectory;
            PlugIns.UserDisabledPlugIns = Program.Settings.DisabledPlugIns.ToArray();

            EditorLogging.Print("Loading plug-ins...", LoggingLevel.Verbose);
            _splash.UpdateVersion(Resources.GOREDIT_TEXT_LOADING_PLUGINS);

            PlugIns.LoadPlugIns(UpdateSplashPlugInText);
        }
Exemple #3
0
        /// <summary>
        /// Function to initialize the scratch files area.
        /// </summary>
        private void InitializeScratchArea()
        {
            ScratchArea.ScratchPath = Program.Settings.ScratchPath;

            EditorLogging.Print("Creating scratch area at \"{0}\"", LoggingLevel.Verbose, ScratchArea.ScratchPath);

            _splash.UpdateVersion(Resources.GOREDIT_TEXT_CREATING_SCRATCH);

            // Ensure that we're not being clever and trying to mess up our system.
            if (ScratchArea.CanAccessScratch(Program.Settings.ScratchPath) == ScratchAccessibility.SystemArea)
            {
                GorgonDialogs.ErrorBox(null, Resources.GOREDIT_ERR_CANNOT_USESYS_SCRATCH);
            }
            else
            {
                // Destroy previous scratch area files if possible.
                // Do not do this when we have it set to a system area, this will keep us from
                // destroying anything critical.
                ScratchArea.CleanOldScratchAreas();
            }

            // Ensure we can actually access the scratch area.
            while (ScratchArea.CanAccessScratch(Program.Settings.ScratchPath) != ScratchAccessibility.Accessible)
            {
                EditorLogging.Print("Could not access scratch area at \"{0}\"", LoggingLevel.Verbose, Program.Settings.ScratchPath);

                if (ScratchArea.SetScratchLocation() == ScratchAccessibility.Canceled)
                {
                    // Exit the application if we cancel.
                    MainForm.Dispose();
                    Gorgon.Quit();
                    return;
                }

                EditorLogging.Print("Setting scratch area to \"{0}\".", LoggingLevel.Verbose, Program.Settings.ScratchPath);

                // Update with the new scratch path.
                Program.Settings.Save();
            }

            ScratchArea.InitializeScratch();

            // Get only the providers that are not disabled.
            var plugIns = from plugIn in Gorgon.PlugIns
                          where plugIn is GorgonFileSystemProviderPlugIn &&
                          PlugIns.UserDisabledPlugIns.All(name => !string.Equals(name, plugIn.Name, StringComparison.OrdinalIgnoreCase))
                          select plugIn;

            foreach (GorgonPlugIn plugIn in plugIns)
            {
                ScratchArea.ScratchFiles.Providers.LoadProvider(plugIn.Name);
            }
        }
Exemple #4
0
        static void Main()
        {
            try
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Settings.Load();

                Gorgon.PlugIns.AssemblyResolver = (appDomain, e) => appDomain.GetAssemblies()
                                                  .FirstOrDefault(assembly => assembly.FullName == e.Name);

                Gorgon.Run(new AppContext());
            }
            catch (Exception ex)
            {
                GorgonDialogs.ErrorBox(null, ex);
            }
            finally
            {
                Gorgon.PlugIns.AssemblyResolver = null;

                ContentManagement.UnloadCurrentContent();

                // Clean up the plug-ins.
                foreach (var plugInItem in PlugIns.ContentPlugIns)
                {
                    plugInItem.Value.Dispose();
                }

                foreach (var plugInItem in PlugIns.WriterPlugIns)
                {
                    plugInItem.Value.Dispose();
                }

                // Shut down the graphics interface.
                if (ContentObject.Graphics != null)
                {
                    ContentObject.Graphics.Dispose();
                    ContentObject.Graphics = null;
                }

                // Clean up temporary files in scratch area.
                if (Settings != null)
                {
                    ScratchArea.DestroyScratchArea();
                }

                EditorLogging.Close();
            }
        }
Exemple #5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="AppContext"/> class.
        /// </summary>
        public AppContext()
        {
            float startTime = GorgonTiming.SecondsSinceStart;

            try
            {
                PlugIns.DefaultImageEditorPlugIn = Program.Settings.DefaultImageEditor;

                _splash  = new FormSplash();
                MainForm = new FormMain();

                _splash.Show();
                _splash.Refresh();

                // Fade in our splash screen.
                FadeSplashScreen(true, 500.0f);

                EditorLogging.Open();

                InitializeGraphics();
                InitializePlugIns();
                InitializeScratchArea();
                InitializeInput();

                FileManagement.InitializeFileTypes();

                // Load the last opened file.
                if ((Program.Settings.AutoLoadLastFile) && (!string.IsNullOrWhiteSpace(Program.Settings.LastEditorFile)))
                {
                    LoadLastFile();
                }

                // Set up the default pane.
                _splash.UpdateVersion(Resources.GOREDIT_TEXT_LOAD_DEFAULT);
                ContentManagement.DefaultContentType = typeof(DefaultContent);
                ContentManagement.LoadDefaultContentPane();

                // Keep showing the splash screen.
                while ((GorgonTiming.SecondsSinceStart - startTime) < 3)
                {
                    Thread.Sleep(1);
                }

                FadeSplashScreen(false, 250.0f);

                // Bring up our application form.
                MainForm.Show();
            }
            catch (Exception ex)
            {
                GorgonDialogs.ErrorBox(null, ex);

                if ((MainForm != null) && (!MainForm.IsDisposed))
                {
                    MainForm.Dispose();
                }

                // Signal quit.
                Gorgon.Quit();
            }
            finally
            {
                if (_splash != null)
                {
                    _splash.Dispose();
                }
                _splash = null;
            }
        }
Exemple #6
0
        /// <summary>
        /// Function to load the plug-ins for the application.
        /// </summary>
        /// <param name="callback">The function to call back to when a plug-in is loaded.</param>
        /// <returns>The number of plug-ins loaded.</returns>
        public static int LoadPlugIns(Action <string> callback)
        {
            var plugInDirectory = new DirectoryInfo(PlugInPath);

            if (!plugInDirectory.Exists)
            {
                plugInDirectory.Create();
            }

            IList <GorgonPlugIn> plugIns = LoadAssemblies(plugInDirectory, callback);

            if (plugIns.Count == 0)
            {
                return(0);
            }

            // Process each plug-in.
            foreach (var plugIn in plugIns)
            {
                if (UserDisabledPlugIns.Any(item => String.Equals(item, plugIn.Name, StringComparison.OrdinalIgnoreCase)))
                {
                    EditorLogging.Print("Found plug-in: \"{0}\".  But it is disabled by the user.", plugIn.Description);

                    _disabled.Add(new DisabledPlugIn(plugIn, APIResources.GOREDIT_TEXT_DISABLED_BY_USER));

                    continue;
                }

                // Check for a file system provider first.
                var fileReader = plugIn as GorgonFileSystemProviderPlugIn;

                if (fileReader != null)
                {
                    EditorLogging.Print("Found a file system provider plug-in: \"{0}\".", fileReader.Name);


                    _readerPlugIns[fileReader.Name] = fileReader;
                    continue;
                }

                var editorPlugIn = (EditorPlugIn)plugIn;

                var validationData = editorPlugIn.ValidatePlugIn();

                if (!String.IsNullOrWhiteSpace(validationData))
                {
                    EditorLogging.Print("Found a {0} plug-in: \"{1}\".  But it is disabled for the following reasons:",
                                        editorPlugIn.PlugInType,
                                        editorPlugIn.Description);
                    EditorLogging.Print("{0}", validationData);

                    _disabled.Add(new DisabledPlugIn(plugIn, validationData));
                    continue;
                }

                EditorLogging.Print("Found a {0} plug-in: \"{1}\".", editorPlugIn.PlugInType, editorPlugIn.Description);

                // Categorize the editor plug-ins.
                switch (editorPlugIn.PlugInType)
                {
                case PlugInType.Content:
                    var contentPlugIn = editorPlugIn as ContentPlugIn;

                    if (contentPlugIn != null)
                    {
                        _contentPlugIns[editorPlugIn.Name] = contentPlugIn;
                    }
                    break;

                case PlugInType.FileWriter:
                    var writerPlugIn = editorPlugIn as FileWriterPlugIn;

                    if (writerPlugIn != null)
                    {
                        _writerPlugIns[editorPlugIn.Name] = writerPlugIn;
                    }
                    break;

                default:
                    EditorLogging.Print("Found a {0} plug-in: \"{1}\".  But it is disabled for the following reasons:",
                                        editorPlugIn.PlugInType,
                                        editorPlugIn.Description);
                    EditorLogging.Print("Plug-in type is unknown.", LoggingLevel.Verbose);

                    _disabled.Add(new DisabledPlugIn(editorPlugIn, APIResources.GOREDIT_TEXT_UNKNOWN_PLUG_IN_TYPE));
                    break;
                }
            }

            return(plugIns.Count);
        }