private void sanitizeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (PluginTree.SelectedRecord == null)
            {
                MessageBox.Show(Resources.NoPluginSelected, Resources.ErrorText);
                return;
            }
            try
            {
                var rec = PluginTree.SelectedRecord as Record;
                var p   = rec != null?rec.GetPlugin() : null;

                TESVSnip.Spells.SanitizePlugin(p);
            }
            catch (ApplicationException ex)
            {
                MessageBox.Show(ex.Message, Resources.ErrorText);
            }
            catch
            {
                MessageBox.Show("Unknown Exception", Resources.ErrorText);
            }
            finally
            {
                PluginTree.RebuildObjects();
                SendStatusText("Sanitization Complete", SystemColors.ControlText);
            }
        }
Beispiel #2
0
        /// <summary>
        /// 创建插件对象。
        /// </summary>
        /// <param name="pluginTree">依附的插件树对象。</param>
        /// <param name="name">插件名称,该名称必须在同级插件中唯一。</param>
        /// <param name="filePath">插件文件路径(完整路径)。</param>
        /// <param name="parent">所属的父插件。</param>
        /// <remarks>创建的插件对象,并没有被加入到<paramref name="parent"/>参数指定的父插件的子集中(<seealso cref="Tiandao.Plugins.Plugin.Children"/>)。</remarks>
        internal Plugin(PluginTree pluginTree, string name, string filePath, Plugin parent)
        {
            if (pluginTree == null)
            {
                throw new ArgumentNullException("pluginTree");
            }

            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException("name");
            }

            if (string.IsNullOrWhiteSpace(filePath))
            {
                throw new ArgumentNullException("filePath");
            }

            _pluginTree = pluginTree;
            _name       = name.Trim();
            _filePath   = filePath;
            _parent     = parent;
            _status     = PluginStatus.None;
            _manifest   = new PluginManifest(this);
            _children   = new PluginCollection(this);
            _builtins   = new List <Builtin>();

            _modules  = new FixedElementCollection <IApplicationModule>();
            _parsers  = new FixedElementCollection <IParser>();
            _builders = new BuilderElementCollection();
        }
Beispiel #3
0
 private void InternalCollapse(object item)
 {
     foreach (var child in PluginTree.GetChildren(item))
     {
         InternalCollapse(child);
     }
     PluginTree.Collapse(item);
 }
Beispiel #4
0
 private void InternalExpand(object item)
 {
     PluginTree.Expand(item);
     foreach (var child in PluginTree.GetChildren(item))
     {
         InternalExpand(child);
     }
 }
Beispiel #5
0
        public PluginResolver(PluginTree pluginTree)
        {
            if (pluginTree == null)
            {
                throw new ArgumentNullException("pluginTree");
            }

            _pluginTree = pluginTree;
        }
        public PluginsHostBuilder(string applicationName, IHostBuilder builder)
        {
            _builder = builder ?? throw new ArgumentNullException(nameof(builder));

            builder.ConfigureAppConfiguration((ctx, configurator) =>
            {
                var options = _initialize?.Invoke(ctx);
                if (options != null)
                {
                    ctx.Properties[typeof(PluginOptions)] = options;
                }

                var environment = Environment.GetEnvironmentVariable(HostDefaults.EnvironmentKey);

                if (!string.IsNullOrWhiteSpace(environment))
                {
                    ctx.HostingEnvironment.EnvironmentName = environment.Trim();
                }

                if (!string.IsNullOrWhiteSpace(applicationName))
                {
                    ctx.HostingEnvironment.ApplicationName = applicationName;
                }

                var pluginsHostBuilderContext = GetPluginsBuilderContext(ctx);
                configurator.Add(new Zongsoft.Configuration.PluginConfigurationSource(pluginsHostBuilderContext.Options));
            });

            builder.ConfigureServices((ctx, services) =>
            {
                if (ctx.Properties.TryGetValue(typeof(PluginOptions), out var options))
                {
                    //将插件启动设置选项加载到服务中
                    services.AddSingleton((PluginOptions)options);

                    //获取插件树并加载它
                    var tree = PluginTree.Get((PluginOptions)options).Load();

                    var registry = new HashSet <Assembly>();

                    foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
                    {
                        if (!assembly.IsDynamic && assembly.FullName.StartsWith("Zongsoft.") && registry.Add(assembly))
                        {
                            Zongsoft.Services.ServiceCollectionExtension.Register(services, assembly, ctx.Configuration);
                        }
                    }

                    foreach (var plugin in tree.Plugins)
                    {
                        RegisterPlugin(plugin, services, ctx.Configuration, registry);
                    }
                }
            });

            builder.UseServiceProviderFactory(new Zongsoft.Services.ServiceProviderFactory());
        }
        public PluginTreeNode(PluginTree tree, string name, object value) : base(name, null)
        {
            if (tree == null)
            {
                throw new ArgumentNullException("tree");
            }

            _tree      = tree;
            _children  = new PluginTreeNodeCollection(this);
            this.Value = value;
        }
        //该构造函数用来构造根节点专用
        internal PluginTreeNode(PluginTree tree) : base("/", true)
        {
            if (tree == null)
            {
                throw new ArgumentNullException("tree");
            }

            _tree      = tree;
            _children  = new PluginTreeNodeCollection(this);
            this.Value = null;
        }
Beispiel #9
0
 public void CollapseAll(object item)
 {
     PluginTree.BeginUpdate();
     try
     {
         InternalCollapse(item);
     }
     finally
     {
         PluginTree.EndUpdate();
     }
 }
Beispiel #10
0
 public void ExpandAll(object item)
 {
     PluginTree.BeginUpdate();
     try
     {
         InternalExpand(item);
     }
     finally
     {
         PluginTree.EndUpdate();
     }
 }
Beispiel #11
0
 private void BaseRecord_ChildListChanged(object sender, RecordChangeEventArgs e)
 {
     if (e.Record == null || e.Record == PluginList.All) // use null record as hint to reset the roots
     {
         UpdateRoots();
         //PluginTree.RebuildAll(true);
         GC.Collect(); // clean up memory after releasing plugins
     }
     else
     {
         PluginTree.RefreshObject(e.Record);
     }
 }
Beispiel #12
0
        private void stripEDIDsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (PluginTree.SelectedRecord == null)
            {
                MessageBox.Show(Resources.NoPluginSelected, Resources.ErrorText);
                return;
            }
            if (MessageBox.Show(Resources.GeneralSpellWarningInquiry, Resources.WarningText, MessageBoxButtons.YesNo) !=
                DialogResult.Yes)
            {
                return;
            }
            var p = GetPluginFromNode(PluginTree.SelectedRecord);

            TESVSnip.Spells.StripEDIDs(p);
            PluginTree.RebuildObjects();
        }
Beispiel #13
0
        internal PluginContext(PluginSetup settings, PluginApplicationContext applicationContext)
        {
            if (settings == null)
            {
                throw new ArgumentNullException("settings");
            }

            if (applicationContext == null)
            {
                throw new ArgumentNullException("applicationContext");
            }

            _settings           = (PluginSetup)settings.Clone();
            _pluginTree         = new PluginTree(this);
            _applicationContext = applicationContext;

            _settings.PropertyChanged += delegate
            {
                if (_pluginTree != null && _pluginTree.Status != PluginTreeStatus.None)
                {
                    throw new InvalidOperationException();
                }
            };
        }
Beispiel #14
0
        private void cleanEspToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (PluginTree.SelectedRecord == null)
            {
                MessageBox.Show(Resources.NoPluginSelected, "Error");
                return;
            }
            if (
                MessageBox.Show("This may delete records from the esp.\nAre you sure you wish to continue?", "Warning",
                                MessageBoxButtons.YesNo) != DialogResult.Yes)
            {
                return;
            }
            FixMasters();
            var plugin = GetPluginFromNode(PluginTree.SelectedRecord);

            var  lookup         = new Dictionary <uint, Record>();
            bool missingMasters = false;

            for (int i = 0; i < plugin.Masters.Length - 1; i++)
            {
                if (plugin.Masters[i] == null)
                {
                    missingMasters = true;
                    continue;
                }
                var tes4 = plugin.Records.OfType <Record>().FirstOrDefault(x => x.Name == "TES4");
                if (plugin.Masters[i].Records.Count < 2 || tes4 == null)
                {
                    continue;
                }
                var match = (uint)plugin.Masters.Count(x => x.Name == "MAST");
                match <<= 24;
                uint mask = (uint)i << 24;
                for (int j = 1; j < plugin.Masters[i].Records.Count; j++)
                {
                    cleanRecurse(plugin.Masters[i].Records[j] as Rec, match, mask, lookup);
                }
            }

            if (missingMasters)
            {
                MessageBox.Show("One or more dependencies are not loaded, and will be ignored.", "Warning");
            }

            int count = 0;

            for (int j = 1; j < plugin.Masters[plugin.Masters.Length - 1].Records.Count; j++)
            {
                cleanRecurse2(plugin.Masters[plugin.Masters.Length - 1].Records[j] as Rec, ref count, lookup);
            }
            if (count == 0)
            {
                MessageBox.Show("No records removed");
            }
            else
            {
                MessageBox.Show("" + count + " records removed");
            }


            PluginTree.Refresh();
        }
Beispiel #15
0
 public TreeCommand(PluginTree pluginTree) : this("Tree", pluginTree)
 {
 }
Beispiel #16
0
 public FindCommand(PluginTree pluginTree) : this("Find", pluginTree)
 {
 }
Beispiel #17
0
 public ListCommand(PluginTree pluginTree) : this("List", pluginTree)
 {
 }
 public PluginTreeNode(PluginTree tree, string name) : this(tree, name, null)
 {
 }
Beispiel #19
0
 public ListCommand(string name, PluginTree pluginTree) : base(name)
 {
     _pluginTree = pluginTree ?? throw new ArgumentNullException(nameof(pluginTree));
 }
Beispiel #20
0
 public void RefreshObject(BaseRecord record)
 {
     PluginTree.RefreshObject(record);
 }
Beispiel #21
0
 private void expandAllToolStripMenuItem_Click(object sender, EventArgs e)
 {
     PluginTree.ExpandAll();
 }
Beispiel #22
0
 private void collapseAllToolStripMenuItem_Click(object sender, EventArgs e)
 {
     PluginTree.CollapseAll();
 }
Beispiel #23
0
 public void ExpandAll()
 {
     PluginTree.ExpandAll();
 }
Beispiel #24
0
 public void CollapseAll()
 {
     PluginTree.CollapseAll();
 }
Beispiel #25
0
 private void PluginTree_ModelDropped(object sender, ModelDropEventArgs e)
 {
     if (e.DropTargetLocation == DropTargetLocation.Item)
     {
         var group = e.TargetModel as IGroupRecord;
         if (group == null)
         {
             return;
         }
         var objects = new List <BaseRecord>();
         foreach (IRecord record in e.SourceModels)
         {
             if (e.Effect == DragDropEffects.Copy)
             {
                 var r = record.Clone() as BaseRecord;
                 group.AddRecord(r);
                 objects.Add(r);
             }
             else if (e.Effect == DragDropEffects.Move)
             {
                 var r = record as BaseRecord;
                 if (r != null && r.Parent.DeleteRecord(r))
                 {
                     group.AddRecord(r);
                     objects.Add(r);
                 }
             }
         }
         e.RefreshObjects();
         PluginTree.SelectObject(objects);
         PluginTree.RefreshObject(group);
         PluginTree.RefreshObjects(objects);
     }
     else if (e.DropTargetLocation == DropTargetLocation.AboveItem ||
              e.DropTargetLocation == DropTargetLocation.BelowItem)
     {
         int offset = e.DropTargetLocation == DropTargetLocation.BelowItem ? +1 : 0;
         var rec    = (e.TargetModel as IRecord);
         if (rec == null)
         {
             return;
         }
         var group = rec.Parent as IGroupRecord;
         if (group == null)
         {
             return;
         }
         int idx                   = group.IndexOf(rec as BaseRecord) + offset;
         var refreshObjects        = new List <BaseRecord>();
         var selObjects            = new List <BaseRecord>();
         IEnumerable <IRecord> itr = e.SourceModels.OfType <IRecord>();
         if (e.DropTargetLocation == DropTargetLocation.BelowItem)
         {
             itr = itr.Reverse();
         }
         foreach (IRecord record in itr)
         {
             if (e.Effect == DragDropEffects.Copy)
             {
                 var r = record.Clone() as BaseRecord;
                 group.InsertRecord(idx, r);
                 selObjects.Add(r);
             }
             else if (e.Effect == DragDropEffects.Move)
             {
                 var r = record as BaseRecord;
                 var p = r.Parent;
                 if (r.Parent.DeleteRecord(r))
                 {
                     idx = group.IndexOf(rec as BaseRecord) + offset;
                     group.InsertRecord(idx, r);
                     selObjects.Add(r);
                 }
             }
         }
         e.RefreshObjects();
         PluginTree.SelectObject(selObjects);
         PluginTree.RefreshObject(group);
         PluginTree.RefreshObjects(selObjects);
     }
 }
Beispiel #26
0
 public void RefreshObject(IList records)
 {
     PluginTree.RefreshObjects(records);
 }
Beispiel #27
0
        private void compileScriptToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FixMasters();
            var r      = PluginTree.SelectedRecord as Record;
            var plugin = GetPluginFromNode(r);

            if (plugin == null || plugin.Parent == null)
            {
                return;
            }

            string errors;

            if (Selection.SelectedSubrecord && Selection.Record.Name != "SCPT")
            {
                var sr = SubrecordList.SubRecord;
                if (sr == null)
                {
                    return;
                }
                if (sr.Name != "SCTX")
                {
                    MessageBox.Show("You need to select a SCPT record or SCTX subrecord to compile", "Error");
                    return;
                }
                ScriptCompiler.ScriptCompiler.Setup(plugin.Masters);
                Record r2;
                if (!ScriptCompiler.ScriptCompiler.CompileResultScript(sr, out r2, out errors))
                {
                    MessageBox.Show("There were compilation errors:\n" + errors);
                }
                else
                {
                    var srs = r.SubRecords;
                    int i   = srs.IndexOf(sr);
                    if (i >= 0)
                    {
                        while (i > 0 && (srs[i - 1].Name == "SCDA" || srs[i - 1].Name == "SCHR"))
                        {
                            srs.RemoveAt(--i);
                        }
                        while (i < srs.Count &&
                               (srs[i].Name == "SCTX" || srs[i].Name == "SLSD" || srs[i].Name == "SCVR" ||
                                srs[i].Name == "SCRO" || srs[i].Name == "SCRV"))
                        {
                            srs.RemoveAt(i);
                        }
                        srs.InsertRange(i, r2.SubRecords);
                        RebuildSelection();
                        PluginTree.RefreshObject(r);
                    }
                }
                return;
            }
            if (r == null || (r.Name != "SCPT"))
            {
                MessageBox.Show("You need to select a SCPT record or SCTX subrecord to compile", "Error");
                return;
            }

            ScriptCompiler.ScriptCompiler.Setup(plugin.Masters);
            if (!ScriptCompiler.ScriptCompiler.Compile(r, out errors))
            {
                MessageBox.Show("There were compilation errors:\n" + errors);
            }
            else
            {
                RebuildSelection();
                PluginTree.RebuildObjects();
            }
        }
Beispiel #28
0
 private void PluginTree_OnContextMenuKey(object sender, EventArgs e)
 {
     contextMenuRecord.Show(PluginTree.PointToScreen(new Point(PluginTree.Width / 4, PluginTree.Height / 4)));
 }
Beispiel #29
0
 private void BaseRecord_RecordDescChanged(object sender, RecordChangeEventArgs e)
 {
     PluginTree.RefreshObject(e.Record);
 }
Beispiel #30
0
 public void RebuildObjects()
 {
     PluginTree.RebuildAll(true);
 }