[longomatch] Add a new Preferences panel to list plugins and configure them



commit 2e3a0371691889b6896de0269117ea7722c7ee43
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Wed Nov 5 00:19:26 2014 +0100

    Add a new Preferences panel to list plugins and configure them

 LongoMatch.Addins/AddinsManager.cs                 |   58 +++-
 LongoMatch.Addins/ConfigurablePlugin.cs            |  118 ++++++++
 .../ExtensionPoints/ILongoMatchPlugin.cs           |    2 +
 LongoMatch.Addins/LongoMatch.Addins.csproj         |   11 +
 LongoMatch.Addins/Makefile.am                      |    4 +-
 LongoMatch.Addins/PreferencesAttribute.cs          |   32 +++
 LongoMatch.Core/LongoMatch.Core.csproj             |    2 +-
 LongoMatch.GUI/Gui/Component/PluginsPreferences.cs |  104 +++++++
 LongoMatch.GUI/Gui/Panel/PreferencesPanel.cs       |    3 +
 LongoMatch.GUI/LongoMatch.GUI.csproj               |   10 +
 LongoMatch.GUI/Makefile.am                         |    2 +
 .../LongoMatch.Gui.Component.PluginsPreferences.cs |  212 ++++++++++++++
 .../LongoMatch.Gui.Component.TeamTemplateEditor.cs |    1 -
 .../LongoMatch.Gui.Panel.NewProjectPanel.cs        |    1 -
 .../LongoMatch.Gui.Panel.ProjectsManagerPanel.cs   |    1 +
 .../gtk-gui/LongoMatch.Gui.Panel.WelcomePanel.cs   |    1 -
 LongoMatch.GUI/gtk-gui/gui.stetic                  |  295 ++++++++++++++++++++
 LongoMatch.GUI/gtk-gui/objects.xml                 |    4 +
 LongoMatch.Plugins.GStreamer/Assembly.cs           |    3 +-
 LongoMatch.Plugins/Assembly.cs                     |    1 +
 LongoMatch/Main.cs                                 |   23 +-
 build/build.environment.mk                         |    2 +
 22 files changed, 857 insertions(+), 33 deletions(-)
---
diff --git a/LongoMatch.Addins/AddinsManager.cs b/LongoMatch.Addins/AddinsManager.cs
index eebd496..cd6c9ea 100644
--- a/LongoMatch.Addins/AddinsManager.cs
+++ b/LongoMatch.Addins/AddinsManager.cs
@@ -16,29 +16,32 @@
 //  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 // 
 using System;
-using LongoMatch.Addins.ExtensionPoints;
+using System.Collections.Generic;
+using System.Linq;
 using LongoMatch.Core.Common;
 using LongoMatch.Core.Interfaces;
 using LongoMatch.Core.Interfaces.GUI;
 using LongoMatch.Core.Interfaces.Multimedia;
 using LongoMatch.Core.Store;
-using Mono.Addins;
 using LongoMatch.Core.Store.Templates;
+using Mono.Addins;
+using Mono.Addins.Description;
+using LongoMatch.Addins.ExtensionPoints;
 
 [assembly:AddinRoot ("LongoMatch", "1.1")]
 namespace LongoMatch.Addins
 {
        public class AddinsManager
        {
-       
-               public AddinsManager (string configPath, string searchPath)
+               
+               public static void Initialize (string configPath, string searchPath)
                {
                        Log.Information ("Initializing addins at path: " + searchPath);
                        AddinManager.Initialize (configPath, searchPath);
                        AddinManager.Registry.Update ();
                }
 
-               public bool RegisterGStreamerPlugins ()
+               public static bool RegisterGStreamerPlugins ()
                {
                        IGStreamerPluginsProvider[] gstPluginsProvider = 
AddinManager.GetExtensionObjects<IGStreamerPluginsProvider> ();
                        
@@ -53,7 +56,7 @@ namespace LongoMatch.Addins
                        return true; 
                }
 
-               public void LoadConfigModifierAddins ()
+               public static void LoadConfigModifierAddins ()
                {
                        foreach (IConfigModifier configModifier in 
AddinManager.GetExtensionObjects<IConfigModifier> ()) {
                                try {
@@ -65,13 +68,13 @@ namespace LongoMatch.Addins
                        }
                }
 
-               public void LoadExportProjectAddins (IMainController mainWindow)
+               public static void LoadExportProjectAddins (IMainController mainWindow)
                {
                        foreach (IExportProject exportProject in 
AddinManager.GetExtensionObjects<IExportProject> ()) {
                                try {
                                        Log.Information ("Adding export entry from plugin: " + 
exportProject.Name);
                                        mainWindow.AddExportEntry (exportProject.GetMenuEntryName (), 
exportProject.GetMenuEntryShortName (),
-                                                                 new Action<Project, IGUIToolkit> 
(exportProject.ExportProject));
+                                                                  new Action<Project, IGUIToolkit> 
(exportProject.ExportProject));
                                } catch (Exception ex) {
                                        Log.Error ("Error adding export entry");
                                        Log.Exception (ex);
@@ -79,7 +82,7 @@ namespace LongoMatch.Addins
                        }
                }
 
-               public void LoadImportProjectAddins (IProjectsImporter importer)
+               public static void LoadImportProjectAddins (IProjectsImporter importer)
                {
                        foreach (IImportProject importProject in 
AddinManager.GetExtensionObjects<IImportProject> ()) {
                                Log.Information ("Adding import entry from plugin: " + importProject.Name);
@@ -90,7 +93,7 @@ namespace LongoMatch.Addins
                        }
                }
 
-               public void LoadMultimediaBackendsAddins (IMultimediaToolkit mtoolkit)
+               public static void LoadMultimediaBackendsAddins (IMultimediaToolkit mtoolkit)
                {
                        foreach (IMultimediaBackend backend in 
AddinManager.GetExtensionObjects<IMultimediaBackend> ()) {
                                try {
@@ -103,14 +106,14 @@ namespace LongoMatch.Addins
                        }
                }
 
-               public void ShutdownMultimediaBackends ()
+               public static void ShutdownMultimediaBackends ()
                {
                        foreach (IMultimediaBackend backend in 
AddinManager.GetExtensionObjects<IMultimediaBackend> ()) {
                                backend.Shutdown ();
                        }
                }
-               
-               public void LoadDashboards (ICategoriesTemplatesProvider provider)
+
+               public static void LoadDashboards (ICategoriesTemplatesProvider provider)
                {
                        foreach (IAnalisysDashboardsProvider plugin in 
AddinManager.GetExtensionObjects<IAnalisysDashboardsProvider> ()) {
                                foreach (Dashboard dashboard in plugin.Dashboards) {
@@ -118,7 +121,34 @@ namespace LongoMatch.Addins
                                        provider.Register (dashboard);
                                }
                        }
-                       
+               }
+
+               public static Dictionary<AddinDescription, List<ConfigurablePlugin>> Plugins {
+                       get {
+                               HashSet <string> paths;
+                               Dictionary<AddinDescription, List<ConfigurablePlugin>> plugins;
+                               
+                               paths = new HashSet<string> ();
+                               plugins = new Dictionary<AddinDescription, List<ConfigurablePlugin>> ();
+
+                               foreach (Addin addin in AddinManager.Registry.GetAddins ()) {
+                                       foreach (Extension ext in addin.Description.MainModule.Extensions) {
+                                               paths.Add (ext.Path);
+                                       }
+                                       plugins.Add (addin.Description, new List<ConfigurablePlugin> ());
+                               }
+
+                               foreach (string path in paths) {
+                                       foreach (TypeExtensionNode n  in AddinManager.GetExtensionNodes 
(path)) {
+                                               var list = plugins.FirstOrDefault (a => a.Key.LocalId == 
n.Addin.Id).Value;
+                                               var instance = n.GetInstance ();
+                                               if (instance is ConfigurablePlugin) {
+                                                       list.Add ((ConfigurablePlugin)instance);
+                                               }
+                                       }
+                               }
+                               return plugins;
+                       }
                }
        }
 }
diff --git a/LongoMatch.Addins/ConfigurablePlugin.cs b/LongoMatch.Addins/ConfigurablePlugin.cs
new file mode 100644
index 0000000..e7a3b57
--- /dev/null
+++ b/LongoMatch.Addins/ConfigurablePlugin.cs
@@ -0,0 +1,118 @@
+//
+//  Copyright (C) 2014 Andoni Morales Alastruey
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using LongoMatch.Core.Common;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+namespace LongoMatch.Addins
+{
+       public class ConfigurablePlugin
+       {
+               public ConfigurablePlugin ()
+               {
+                       Properties = new List<AttributeAndProperty> ();
+                       foreach (var p in GetType ().GetProperties ()) {
+                               var attr = p.GetCustomAttributes (typeof(PreferencesAttribute), true);
+                               if (attr.Length != 1) {
+                                       continue;
+                               }
+                               Properties.Add (new AttributeAndProperty { Property = p,
+                                       Attribute = attr.First () as PreferencesAttribute
+                               });
+                       }
+                       Load ();
+               }
+
+               public virtual string Name {
+                       get;
+                       set;
+               }
+
+               public List <AttributeAndProperty> Properties {
+                       get;
+                       set;
+               }
+
+               string ConfigFile {
+                       get {
+                               string filename = String.Format ("{0}.config", Name);
+                               filename = filename.Replace (" ", "_"); 
+                               foreach (char c in Path.GetInvalidFileNameChars()) {
+                                       filename = filename.Replace (c.ToString (), ""); 
+                               }
+                               return Path.Combine (Config.ConfigDir, filename);
+                       }
+               }
+
+               void Load ()
+               {
+                       if (File.Exists (ConfigFile)) {
+                               using (StreamReader reader = File.OpenText(ConfigFile)) {
+                                       JObject o;
+                                       try {
+                                               o = (JObject)JToken.ReadFrom (new JsonTextReader (reader));
+                                       } catch {
+                                               return;
+                                       }
+                                       foreach (AttributeAndProperty prop in Properties) {
+                                               PropertyInfo info = prop.Property;
+                                               try {
+                                                       var value = Convert.ChangeType (o [info.Name], 
info.PropertyType);
+                                                       info.SetValue (this, value, null);
+                                               } catch (Exception ex) {
+                                                       Log.Exception (ex);
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               protected void Save ()
+               {
+                       JObject o = new JObject ();
+                       foreach (AttributeAndProperty prop in Properties) {
+                               o [prop.Property.Name] = new JValue (prop.Property.GetValue (this, null));
+                       }
+                       try {
+                               Serializer.Save (o, ConfigFile);
+                       } catch (Exception ex) {
+                               Log.Exception (ex);
+                       }
+               }
+       }
+
+       public class AttributeAndProperty
+       {
+
+               public PreferencesAttribute Attribute {
+                       get;
+                       set;
+               }
+
+               public PropertyInfo Property {
+                       get;
+                       set;
+               }
+       }
+}
+
diff --git a/LongoMatch.Addins/ExtensionPoints/ILongoMatchPlugin.cs 
b/LongoMatch.Addins/ExtensionPoints/ILongoMatchPlugin.cs
index 47e16f9..f9b512a 100644
--- a/LongoMatch.Addins/ExtensionPoints/ILongoMatchPlugin.cs
+++ b/LongoMatch.Addins/ExtensionPoints/ILongoMatchPlugin.cs
@@ -15,6 +15,8 @@
 //  along with this program; if not, write to the Free Software
 //  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 //
+using Mono.Addins;
+
 namespace LongoMatch.Addins.ExtensionPoints
 {
        public interface ILongoMatchPlugin
diff --git a/LongoMatch.Addins/LongoMatch.Addins.csproj b/LongoMatch.Addins/LongoMatch.Addins.csproj
index fa723fc..351630c 100644
--- a/LongoMatch.Addins/LongoMatch.Addins.csproj
+++ b/LongoMatch.Addins/LongoMatch.Addins.csproj
@@ -35,11 +35,22 @@
     <Compile Include="ExtensionPoints\ILongoMatchPlugin.cs" />
     <Compile Include="ExtensionPoints\IGStreamerPluginsProvider.cs" />
     <Compile Include="ExtensionPoints\IAnalisysDashboardsProvider.cs" />
+    <Compile Include="PreferencesAttribute.cs" />
+    <Compile Include="ConfigurablePlugin.cs" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="Mono.Addins, Version=0.6.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756">
       <Package>mono-addins</Package>
+      <SpecificVersion>False</SpecificVersion>
+      <Private>False</Private>
     </Reference>
+    <Reference Include="Newtonsoft.Json, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b9a188c8922137c6">
+      <Private>False</Private>
+      <Package>newtonsoft-json</Package>
+      <SpecificVersion>False</SpecificVersion>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\LongoMatch.Core\LongoMatch.Core.csproj">
diff --git a/LongoMatch.Addins/Makefile.am b/LongoMatch.Addins/Makefile.am
index ddf449a..885df46 100644
--- a/LongoMatch.Addins/Makefile.am
+++ b/LongoMatch.Addins/Makefile.am
@@ -4,13 +4,15 @@ TARGET = library
 LINK = $(REF_DEP_LONGOMATCH_ADDINS)
 
 SOURCES = AddinsManager.cs \
+       ConfigurablePlugin.cs \
        ExtensionPoints/IAnalisysDashboardsProvider.cs \
        ExtensionPoints/IConfigModifier.cs \
        ExtensionPoints/IExportProject.cs \
        ExtensionPoints/IGStreamerPluginsProvider.cs \
        ExtensionPoints/IImportProject.cs \
        ExtensionPoints/ILongoMatchPlugin.cs \
-       ExtensionPoints/IMultimediaBackend.cs
+       ExtensionPoints/IMultimediaBackend.cs \
+       PreferencesAttribute.cs
 
 RESOURCES = 
 
diff --git a/LongoMatch.Addins/PreferencesAttribute.cs b/LongoMatch.Addins/PreferencesAttribute.cs
new file mode 100644
index 0000000..a9be06f
--- /dev/null
+++ b/LongoMatch.Addins/PreferencesAttribute.cs
@@ -0,0 +1,32 @@
+//
+//  Copyright (C) 2014 Andoni Morales Alastruey
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+
+namespace LongoMatch.Addins
+{
+       public class PreferencesAttribute: Attribute
+       {
+               public readonly string description;
+
+               public PreferencesAttribute (string description)
+               {
+                       this.description = description;
+               }
+       }
+}
+
diff --git a/LongoMatch.Core/LongoMatch.Core.csproj b/LongoMatch.Core/LongoMatch.Core.csproj
index 34650da..7481e1e 100644
--- a/LongoMatch.Core/LongoMatch.Core.csproj
+++ b/LongoMatch.Core/LongoMatch.Core.csproj
@@ -147,7 +147,6 @@
   <ItemGroup>
     <Reference Include="System" />
     <Reference Include="System.Core" />
-    <Reference Include="System.Xml" />
     <Reference Include="Mono.Posix" />
     <Reference Include="gdk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
       <Package>gtk-sharp-2.0</Package>
@@ -160,6 +159,7 @@
       <Package>newtonsoft-json</Package>
     </Reference>
     <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Xml" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
 </Project>
diff --git a/LongoMatch.GUI/Gui/Component/PluginsPreferences.cs 
b/LongoMatch.GUI/Gui/Component/PluginsPreferences.cs
new file mode 100644
index 0000000..320a450
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/PluginsPreferences.cs
@@ -0,0 +1,104 @@
+//
+//  Copyright (C) 2014 Andoni Morales Alastruey
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using Gtk;
+using LongoMatch.Addins.ExtensionPoints;
+using LongoMatch.Addins;
+using Mono.Addins.Description;
+using System.Collections.Generic;
+
+
+namespace LongoMatch.Gui.Component
+{
+       [System.ComponentModel.ToolboxItem(true)]
+       public partial class PluginsPreferences : Gtk.Bin
+       {
+               ListStore pluginsStore;
+
+               public PluginsPreferences ()
+               {
+                       this.Build ();
+                       pluginsStore = new ListStore (typeof(string), typeof(AddinDescription), typeof 
(ILongoMatchPlugin));
+                       treeview1.Model = pluginsStore;
+                       treeview1.HeadersVisible = false;
+                       treeview1.AppendColumn ("Text", new CellRendererText (), "text", 0); 
+                       treeview1.EnableGridLines = TreeViewGridLines.None;
+                       treeview1.CursorChanged += HandleCursorChanged;
+                       FillStore ();
+               }
+
+               void FillStore ()
+               {
+                       TreeIter first;
+
+                       foreach (var plugin in AddinsManager.Plugins) {
+                               pluginsStore.AppendValues (plugin.Key.Name, plugin.Key, plugin.Value);
+                       }
+                       if (pluginsStore.GetIterFirst (out first)) {
+                               treeview1.Selection.SelectIter (first);
+                       }
+               }
+
+               void LoadAddin (AddinDescription addin, List<ConfigurablePlugin> plugins)
+               {
+                       if (addin == null) {
+                               vbox1.Visible = false;
+                               return;
+                       }
+                       vbox1.Visible = true;
+                       namelabel.Text = addin.Name;
+                       desclabel.Text = addin.Description;
+                       authorlabel.Text = addin.Author;
+                       filelabel.Text = addin.AddinFile;
+                       
+                       if (plugins != null && plugins.Count > 0) {
+                               configframe.Visible = true;
+                               foreach (Widget w in configbox.Children) {
+                                       configbox.Remove (w);
+                                       w.Destroy ();
+                               }
+                               foreach (ConfigurablePlugin plugin in plugins) {
+                                       foreach (AttributeAndProperty attrprop in plugin.Properties) {
+                                               if (attrprop.Property.PropertyType == typeof(Boolean)) {
+                                                       CheckButton button = new CheckButton 
(attrprop.Attribute.description);
+                                                       button.Active = (bool) attrprop.Property.GetValue 
(plugin, null);
+                                                       button.Clicked += (sender, e) => {
+                                                               attrprop.Property.SetValue (plugin, 
button.Active, null);
+                                                       };
+                                                       button.Show ();
+                                                       configbox.PackStart (button, false, true, 0);
+                                               }
+                                       }
+                               }
+                       } else {
+                               configframe.Visible = false;
+                       }
+               }
+               
+               void HandleCursorChanged (object sender, EventArgs e)
+               {
+                       TreeIter iter;
+
+                       treeview1.Selection.GetSelected (out iter);
+                       LoadAddin (pluginsStore.GetValue (iter, 1) as AddinDescription,
+                                  pluginsStore.GetValue (iter, 2) as List<ConfigurablePlugin>);
+               }
+               
+       }
+}
+
diff --git a/LongoMatch.GUI/Gui/Panel/PreferencesPanel.cs b/LongoMatch.GUI/Gui/Panel/PreferencesPanel.cs
index cf51d7f..b909470 100644
--- a/LongoMatch.GUI/Gui/Panel/PreferencesPanel.cs
+++ b/LongoMatch.GUI/Gui/Panel/PreferencesPanel.cs
@@ -67,6 +67,9 @@ namespace LongoMatch.Gui.Panel
                        AddPane (Catalog.GetString ("Live analysis"),
                                 Helpers.Misc.LoadIcon ("longomatch-video-device", IconSize.Dialog, 0),
                                 new LiveAnalysisPreferences());
+                       AddPane (Catalog.GetString ("Plugins"),
+                                Helpers.Misc.LoadIcon ("longomatch-video-device", IconSize.Dialog, 0),
+                                new PluginsPreferences());
                }
                
                void AddPane (string desc, Pixbuf icon, Widget pane) {
diff --git a/LongoMatch.GUI/LongoMatch.GUI.csproj b/LongoMatch.GUI/LongoMatch.GUI.csproj
index 58090f4..6ba853f 100644
--- a/LongoMatch.GUI/LongoMatch.GUI.csproj
+++ b/LongoMatch.GUI/LongoMatch.GUI.csproj
@@ -192,6 +192,8 @@
     <Compile Include="gtk-gui\LongoMatch.Gui.Component.FakeAnalysisComponent.cs" />
     <Compile Include="Gui\Component\EventsListWidget.cs" />
     <Compile Include="gtk-gui\LongoMatch.Gui.Component.EventsListWidget.cs" />
+    <Compile Include="Gui\Component\PluginsPreferences.cs" />
+    <Compile Include="gtk-gui\LongoMatch.Gui.Component.PluginsPreferences.cs" />
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="gtk-gui\gui.stetic">
@@ -254,6 +256,10 @@
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Drawing" />
+    <Reference Include="Mono.Addins, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756">
+      <Private>False</Private>
+      <Package>mono-addins</Package>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\LongoMatch.GUI.Multimedia\LongoMatch.GUI.Multimedia.csproj">
@@ -284,6 +290,10 @@
       <Project>{AE98609B-353C-4CE4-A5B7-606BB4EE3576}</Project>
       <Name>LongoMatch.Drawing.Cairo</Name>
     </ProjectReference>
+    <ProjectReference Include="..\LongoMatch.Addins\LongoMatch.Addins.csproj">
+      <Project>{709CCDA6-CA95-4CBD-A986-B96EE0418905}</Project>
+      <Name>LongoMatch.Addins</Name>
+    </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
 </Project>
\ No newline at end of file
diff --git a/LongoMatch.GUI/Makefile.am b/LongoMatch.GUI/Makefile.am
index 699c40c..39c843a 100644
--- a/LongoMatch.GUI/Makefile.am
+++ b/LongoMatch.GUI/Makefile.am
@@ -25,6 +25,7 @@ SOURCES = Gui/Cairo.cs \
        Gui/Component/PlaysListTreeWidget.cs \
        Gui/Component/PlaysPositionViewer.cs \
        Gui/Component/PlaysSelectionWidget.cs \
+       Gui/Component/PluginsPreferences.cs \
        Gui/Component/ProjectListWidget.cs \
        Gui/Component/ProjectPeriods.cs \
        Gui/Component/RenderingStateBar.cs \
@@ -105,6 +106,7 @@ SOURCES = Gui/Cairo.cs \
        gtk-gui/LongoMatch.Gui.Component.PlaysListTreeWidget.cs \
        gtk-gui/LongoMatch.Gui.Component.PlaysPositionViewer.cs \
        gtk-gui/LongoMatch.Gui.Component.PlaysSelectionWidget.cs \
+       gtk-gui/LongoMatch.Gui.Component.PluginsPreferences.cs \
        gtk-gui/LongoMatch.Gui.Component.ProjectListWidget.cs \
        gtk-gui/LongoMatch.Gui.Component.ProjectPeriods.cs \
        gtk-gui/LongoMatch.Gui.Component.RenderingStateBar.cs \
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.PluginsPreferences.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.PluginsPreferences.cs
new file mode 100644
index 0000000..70ad4a9
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.PluginsPreferences.cs
@@ -0,0 +1,212 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace LongoMatch.Gui.Component
+{
+       public partial class PluginsPreferences
+       {
+               private global::Gtk.HBox hbox1;
+               private global::Gtk.ScrolledWindow GtkScrolledWindow;
+               private global::Gtk.TreeView treeview1;
+               private global::Gtk.VBox vbox1;
+               private global::Gtk.Frame frame1;
+               private global::Gtk.Alignment GtkAlignment;
+               private global::Gtk.Table table1;
+               private global::Gtk.Label authorlabel;
+               private global::Gtk.Label desclabel;
+               private global::Gtk.Label filelabel;
+               private global::Gtk.Label label1;
+               private global::Gtk.Label label2;
+               private global::Gtk.Label label3;
+               private global::Gtk.Label label4;
+               private global::Gtk.Label namelabel;
+               private global::Gtk.Label GtkLabel;
+               private global::Gtk.Frame configframe;
+               private global::Gtk.Alignment GtkAlignment1;
+               private global::Gtk.VBox configbox;
+               private global::Gtk.Label GtkLabel1;
+
+               protected virtual void Build ()
+               {
+                       global::Stetic.Gui.Initialize (this);
+                       // Widget LongoMatch.Gui.Component.PluginsPreferences
+                       global::Stetic.BinContainer.Attach (this);
+                       this.Name = "LongoMatch.Gui.Component.PluginsPreferences";
+                       // Container child 
LongoMatch.Gui.Component.PluginsPreferences.Gtk.Container+ContainerChild
+                       this.hbox1 = new global::Gtk.HBox ();
+                       this.hbox1.Name = "hbox1";
+                       this.hbox1.Spacing = 6;
+                       this.hbox1.BorderWidth = ((uint)(20));
+                       // Container child hbox1.Gtk.Box+BoxChild
+                       this.GtkScrolledWindow = new global::Gtk.ScrolledWindow ();
+                       this.GtkScrolledWindow.WidthRequest = 250;
+                       this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+                       this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+                       // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+                       this.treeview1 = new global::Gtk.TreeView ();
+                       this.treeview1.CanFocus = true;
+                       this.treeview1.Name = "treeview1";
+                       this.GtkScrolledWindow.Add (this.treeview1);
+                       this.hbox1.Add (this.GtkScrolledWindow);
+                       global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1 
[this.GtkScrolledWindow]));
+                       w2.Position = 0;
+                       w2.Expand = false;
+                       // Container child hbox1.Gtk.Box+BoxChild
+                       this.vbox1 = new global::Gtk.VBox ();
+                       this.vbox1.Name = "vbox1";
+                       this.vbox1.Spacing = 6;
+                       // Container child vbox1.Gtk.Box+BoxChild
+                       this.frame1 = new global::Gtk.Frame ();
+                       this.frame1.Name = "frame1";
+                       this.frame1.ShadowType = ((global::Gtk.ShadowType)(0));
+                       // Container child frame1.Gtk.Container+ContainerChild
+                       this.GtkAlignment = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+                       this.GtkAlignment.Name = "GtkAlignment";
+                       this.GtkAlignment.LeftPadding = ((uint)(12));
+                       // Container child GtkAlignment.Gtk.Container+ContainerChild
+                       this.table1 = new global::Gtk.Table (((uint)(4)), ((uint)(2)), false);
+                       this.table1.Name = "table1";
+                       this.table1.RowSpacing = ((uint)(6));
+                       this.table1.ColumnSpacing = ((uint)(6));
+                       this.table1.BorderWidth = ((uint)(6));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.authorlabel = new global::Gtk.Label ();
+                       this.authorlabel.Name = "authorlabel";
+                       this.authorlabel.Xalign = 0F;
+                       this.table1.Add (this.authorlabel);
+                       global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table1 
[this.authorlabel]));
+                       w3.TopAttach = ((uint)(2));
+                       w3.BottomAttach = ((uint)(3));
+                       w3.LeftAttach = ((uint)(1));
+                       w3.RightAttach = ((uint)(2));
+                       w3.XOptions = ((global::Gtk.AttachOptions)(4));
+                       w3.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.desclabel = new global::Gtk.Label ();
+                       this.desclabel.Name = "desclabel";
+                       this.desclabel.Xalign = 0F;
+                       this.desclabel.Wrap = true;
+                       this.desclabel.WidthChars = 70;
+                       this.desclabel.MaxWidthChars = 100;
+                       this.table1.Add (this.desclabel);
+                       global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table1 
[this.desclabel]));
+                       w4.TopAttach = ((uint)(1));
+                       w4.BottomAttach = ((uint)(2));
+                       w4.LeftAttach = ((uint)(1));
+                       w4.RightAttach = ((uint)(2));
+                       w4.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.filelabel = new global::Gtk.Label ();
+                       this.filelabel.Name = "filelabel";
+                       this.filelabel.Xalign = 0F;
+                       this.filelabel.Wrap = true;
+                       this.filelabel.Ellipsize = ((global::Pango.EllipsizeMode)(1));
+                       this.filelabel.SingleLineMode = true;
+                       this.table1.Add (this.filelabel);
+                       global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.table1 
[this.filelabel]));
+                       w5.TopAttach = ((uint)(3));
+                       w5.BottomAttach = ((uint)(4));
+                       w5.LeftAttach = ((uint)(1));
+                       w5.RightAttach = ((uint)(2));
+                       w5.XOptions = ((global::Gtk.AttachOptions)(4));
+                       w5.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.label1 = new global::Gtk.Label ();
+                       this.label1.Name = "label1";
+                       this.label1.Xalign = 0F;
+                       this.label1.LabelProp = global::Mono.Unix.Catalog.GetString ("Name:");
+                       this.table1.Add (this.label1);
+                       global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.table1 
[this.label1]));
+                       w6.XOptions = ((global::Gtk.AttachOptions)(4));
+                       w6.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.label2 = new global::Gtk.Label ();
+                       this.label2.Name = "label2";
+                       this.label2.Xalign = 0F;
+                       this.label2.LabelProp = global::Mono.Unix.Catalog.GetString ("Description:");
+                       this.table1.Add (this.label2);
+                       global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.table1 
[this.label2]));
+                       w7.TopAttach = ((uint)(1));
+                       w7.BottomAttach = ((uint)(2));
+                       w7.XOptions = ((global::Gtk.AttachOptions)(4));
+                       w7.YOptions = ((global::Gtk.AttachOptions)(1));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.label3 = new global::Gtk.Label ();
+                       this.label3.Name = "label3";
+                       this.label3.Xalign = 0F;
+                       this.label3.LabelProp = global::Mono.Unix.Catalog.GetString ("Author:");
+                       this.table1.Add (this.label3);
+                       global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.table1 
[this.label3]));
+                       w8.TopAttach = ((uint)(2));
+                       w8.BottomAttach = ((uint)(3));
+                       w8.XOptions = ((global::Gtk.AttachOptions)(4));
+                       w8.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.label4 = new global::Gtk.Label ();
+                       this.label4.Name = "label4";
+                       this.label4.Xalign = 0F;
+                       this.label4.LabelProp = global::Mono.Unix.Catalog.GetString ("File:");
+                       this.label4.Wrap = true;
+                       this.label4.Ellipsize = ((global::Pango.EllipsizeMode)(1));
+                       this.label4.SingleLineMode = true;
+                       this.table1.Add (this.label4);
+                       global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.table1 
[this.label4]));
+                       w9.TopAttach = ((uint)(3));
+                       w9.BottomAttach = ((uint)(4));
+                       w9.XOptions = ((global::Gtk.AttachOptions)(4));
+                       w9.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.namelabel = new global::Gtk.Label ();
+                       this.namelabel.Name = "namelabel";
+                       this.namelabel.Xalign = 0F;
+                       this.table1.Add (this.namelabel);
+                       global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.table1 
[this.namelabel]));
+                       w10.LeftAttach = ((uint)(1));
+                       w10.RightAttach = ((uint)(2));
+                       w10.YOptions = ((global::Gtk.AttachOptions)(4));
+                       this.GtkAlignment.Add (this.table1);
+                       this.frame1.Add (this.GtkAlignment);
+                       this.GtkLabel = new global::Gtk.Label ();
+                       this.GtkLabel.Name = "GtkLabel";
+                       this.GtkLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Description</b>");
+                       this.GtkLabel.UseMarkup = true;
+                       this.frame1.LabelWidget = this.GtkLabel;
+                       this.vbox1.Add (this.frame1);
+                       global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.frame1]));
+                       w13.Position = 0;
+                       w13.Expand = false;
+                       w13.Fill = false;
+                       // Container child vbox1.Gtk.Box+BoxChild
+                       this.configframe = new global::Gtk.Frame ();
+                       this.configframe.Name = "configframe";
+                       this.configframe.ShadowType = ((global::Gtk.ShadowType)(0));
+                       // Container child configframe.Gtk.Container+ContainerChild
+                       this.GtkAlignment1 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+                       this.GtkAlignment1.Name = "GtkAlignment1";
+                       this.GtkAlignment1.LeftPadding = ((uint)(12));
+                       // Container child GtkAlignment1.Gtk.Container+ContainerChild
+                       this.configbox = new global::Gtk.VBox ();
+                       this.configbox.Name = "configbox";
+                       this.configbox.Spacing = 6;
+                       this.configbox.BorderWidth = ((uint)(6));
+                       this.GtkAlignment1.Add (this.configbox);
+                       this.configframe.Add (this.GtkAlignment1);
+                       this.GtkLabel1 = new global::Gtk.Label ();
+                       this.GtkLabel1.Name = "GtkLabel1";
+                       this.GtkLabel1.LabelProp = global::Mono.Unix.Catalog.GetString 
("<b>Configuration</b>");
+                       this.GtkLabel1.UseMarkup = true;
+                       this.configframe.LabelWidget = this.GtkLabel1;
+                       this.vbox1.Add (this.configframe);
+                       global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.vbox1 
[this.configframe]));
+                       w16.Position = 1;
+                       this.hbox1.Add (this.vbox1);
+                       global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox1]));
+                       w17.Position = 1;
+                       this.Add (this.hbox1);
+                       if ((this.Child != null)) {
+                               this.Child.ShowAll ();
+                       }
+                       this.vbox1.Hide ();
+                       this.Hide ();
+               }
+       }
+}
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.TeamTemplateEditor.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.TeamTemplateEditor.cs
index 891e39f..72e90b2 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.TeamTemplateEditor.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.TeamTemplateEditor.cs
@@ -300,7 +300,6 @@ namespace LongoMatch.Gui.Component
                        this.playerpropertyhbox.Spacing = 6;
                        // Container child playerpropertyhbox.Gtk.Box+BoxChild
                        this.alignment1 = new global::Gtk.Alignment (0.5F, 0F, 0F, 0F);
-                       this.alignment1.Name = "alignment1";
                        // Container child alignment1.Gtk.Container+ContainerChild
                        this.playerimageframe = new global::Gtk.Frame ();
                        this.playerimageframe.Name = "playerimageframe";
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.NewProjectPanel.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.NewProjectPanel.cs
index 6cb850b..61d6b6c 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.NewProjectPanel.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.NewProjectPanel.cs
@@ -280,7 +280,6 @@ namespace LongoMatch.Gui.Panel
                        this.vbox5.Spacing = 6;
                        // Container child vbox5.Gtk.Box+BoxChild
                        this.alignment1 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
-                       this.alignment1.Name = "alignment1";
                        // Container child alignment1.Gtk.Container+ContainerChild
                        this.topbox = new global::Gtk.HBox ();
                        this.topbox.Name = "topbox";
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.ProjectsManagerPanel.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.ProjectsManagerPanel.cs
index 6c5f64b..2ad9183 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.ProjectsManagerPanel.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.ProjectsManagerPanel.cs
@@ -613,6 +613,7 @@ namespace LongoMatch.Gui.Panel
                        w60.Position = 0;
                        // Container child rbox.Gtk.Box+BoxChild
                        this.hbuttonbox1 = new global::Gtk.HButtonBox ();
+                       this.hbuttonbox1.Name = "hbuttonbox1";
                        // Container child hbuttonbox1.Gtk.ButtonBox+ButtonBoxChild
                        this.savebutton = new global::Gtk.Button ();
                        this.savebutton.TooltipMarkup = "Save";
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.WelcomePanel.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.WelcomePanel.cs
index a827fc3..7b8e979 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.WelcomePanel.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.WelcomePanel.cs
@@ -49,7 +49,6 @@ namespace LongoMatch.Gui.Panel
                        w3.Fill = false;
                        // Container child vbox1.Gtk.Box+BoxChild
                        this.alignment1 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
-                       this.alignment1.Name = "alignment1";
                        // Container child alignment1.Gtk.Container+ContainerChild
                        this.tablewidget = new global::Gtk.Table (((uint)(3)), ((uint)(3)), false);
                        this.tablewidget.Name = "tablewidget";
diff --git a/LongoMatch.GUI/gtk-gui/gui.stetic b/LongoMatch.GUI/gtk-gui/gui.stetic
index b7be441..cea7a53 100644
--- a/LongoMatch.GUI/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI/gtk-gui/gui.stetic
@@ -11600,4 +11600,299 @@ You can continue with the current capture, cancel it or save your project.
       </widget>
     </child>
   </widget>
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.PluginsPreferences" design-size="972 347">
+    <property name="MemberName" />
+    <property name="Visible">False</property>
+    <child>
+      <widget class="Gtk.HBox" id="hbox1">
+        <property name="MemberName" />
+        <property name="Spacing">6</property>
+        <property name="BorderWidth">20</property>
+        <child>
+          <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow">
+            <property name="MemberName" />
+            <property name="WidthRequest">250</property>
+            <property name="ShadowType">In</property>
+            <child>
+              <widget class="Gtk.TreeView" id="treeview1">
+                <property name="MemberName" />
+                <property name="CanFocus">True</property>
+                <property name="ShowScrollbars">True</property>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">0</property>
+            <property name="AutoSize">False</property>
+            <property name="Expand">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="Gtk.VBox" id="vbox1">
+            <property name="MemberName" />
+            <property name="Visible">False</property>
+            <property name="Spacing">6</property>
+            <child>
+              <widget class="Gtk.Frame" id="frame1">
+                <property name="MemberName" />
+                <property name="ShadowType">None</property>
+                <child>
+                  <widget class="Gtk.Alignment" id="GtkAlignment">
+                    <property name="MemberName" />
+                    <property name="Xalign">0</property>
+                    <property name="Yalign">0</property>
+                    <property name="LeftPadding">12</property>
+                    <child>
+                      <widget class="Gtk.Table" id="table1">
+                        <property name="MemberName" />
+                        <property name="NRows">4</property>
+                        <property name="NColumns">2</property>
+                        <property name="RowSpacing">6</property>
+                        <property name="ColumnSpacing">6</property>
+                        <property name="BorderWidth">6</property>
+                        <child>
+                          <widget class="Gtk.Label" id="authorlabel">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                          </widget>
+                          <packing>
+                            <property name="TopAttach">2</property>
+                            <property name="BottomAttach">3</property>
+                            <property name="LeftAttach">1</property>
+                            <property name="RightAttach">2</property>
+                            <property name="AutoSize">True</property>
+                            <property name="XOptions">Fill</property>
+                            <property name="YOptions">Fill</property>
+                            <property name="XExpand">False</property>
+                            <property name="XFill">True</property>
+                            <property name="XShrink">False</property>
+                            <property name="YExpand">False</property>
+                            <property name="YFill">True</property>
+                            <property name="YShrink">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Label" id="desclabel">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                            <property name="Wrap">True</property>
+                            <property name="WidthChars">70</property>
+                            <property name="MaxWidthChars">100</property>
+                          </widget>
+                          <packing>
+                            <property name="TopAttach">1</property>
+                            <property name="BottomAttach">2</property>
+                            <property name="LeftAttach">1</property>
+                            <property name="RightAttach">2</property>
+                            <property name="AutoSize">False</property>
+                            <property name="YOptions">Fill</property>
+                            <property name="XExpand">True</property>
+                            <property name="XFill">True</property>
+                            <property name="XShrink">False</property>
+                            <property name="YExpand">False</property>
+                            <property name="YFill">True</property>
+                            <property name="YShrink">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Label" id="filelabel">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                            <property name="Wrap">True</property>
+                            <property name="Ellipsize">Start</property>
+                            <property name="SingleLineMode">True</property>
+                          </widget>
+                          <packing>
+                            <property name="TopAttach">3</property>
+                            <property name="BottomAttach">4</property>
+                            <property name="LeftAttach">1</property>
+                            <property name="RightAttach">2</property>
+                            <property name="AutoSize">True</property>
+                            <property name="XOptions">Fill</property>
+                            <property name="YOptions">Fill</property>
+                            <property name="XExpand">False</property>
+                            <property name="XFill">True</property>
+                            <property name="XShrink">False</property>
+                            <property name="YExpand">False</property>
+                            <property name="YFill">True</property>
+                            <property name="YShrink">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Label" id="label1">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                            <property name="LabelProp" translatable="yes">Name:</property>
+                          </widget>
+                          <packing>
+                            <property name="AutoSize">True</property>
+                            <property name="XOptions">Fill</property>
+                            <property name="YOptions">Fill</property>
+                            <property name="XExpand">False</property>
+                            <property name="XFill">True</property>
+                            <property name="XShrink">False</property>
+                            <property name="YExpand">False</property>
+                            <property name="YFill">True</property>
+                            <property name="YShrink">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Label" id="label2">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                            <property name="LabelProp" translatable="yes">Description:</property>
+                          </widget>
+                          <packing>
+                            <property name="TopAttach">1</property>
+                            <property name="BottomAttach">2</property>
+                            <property name="AutoSize">False</property>
+                            <property name="XOptions">Fill</property>
+                            <property name="YOptions">Expand</property>
+                            <property name="XExpand">False</property>
+                            <property name="XFill">True</property>
+                            <property name="XShrink">False</property>
+                            <property name="YExpand">True</property>
+                            <property name="YFill">False</property>
+                            <property name="YShrink">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Label" id="label3">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                            <property name="LabelProp" translatable="yes">Author:</property>
+                          </widget>
+                          <packing>
+                            <property name="TopAttach">2</property>
+                            <property name="BottomAttach">3</property>
+                            <property name="AutoSize">True</property>
+                            <property name="XOptions">Fill</property>
+                            <property name="YOptions">Fill</property>
+                            <property name="XExpand">False</property>
+                            <property name="XFill">True</property>
+                            <property name="XShrink">False</property>
+                            <property name="YExpand">False</property>
+                            <property name="YFill">True</property>
+                            <property name="YShrink">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Label" id="label4">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                            <property name="LabelProp" translatable="yes">File:</property>
+                            <property name="Wrap">True</property>
+                            <property name="Ellipsize">Start</property>
+                            <property name="SingleLineMode">True</property>
+                          </widget>
+                          <packing>
+                            <property name="TopAttach">3</property>
+                            <property name="BottomAttach">4</property>
+                            <property name="AutoSize">True</property>
+                            <property name="XOptions">Fill</property>
+                            <property name="YOptions">Fill</property>
+                            <property name="XExpand">False</property>
+                            <property name="XFill">True</property>
+                            <property name="XShrink">False</property>
+                            <property name="YExpand">False</property>
+                            <property name="YFill">True</property>
+                            <property name="YShrink">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Label" id="namelabel">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                          </widget>
+                          <packing>
+                            <property name="LeftAttach">1</property>
+                            <property name="RightAttach">2</property>
+                            <property name="AutoSize">False</property>
+                            <property name="YOptions">Fill</property>
+                            <property name="XExpand">True</property>
+                            <property name="XFill">True</property>
+                            <property name="XShrink">False</property>
+                            <property name="YExpand">False</property>
+                            <property name="YFill">True</property>
+                            <property name="YShrink">False</property>
+                          </packing>
+                        </child>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="Gtk.Label" id="GtkLabel">
+                    <property name="MemberName" />
+                    <property name="LabelProp" translatable="yes">&lt;b&gt;Description&lt;/b&gt;</property>
+                    <property name="UseMarkup">True</property>
+                  </widget>
+                  <packing>
+                    <property name="type">label_item</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Position">0</property>
+                <property name="AutoSize">True</property>
+                <property name="Expand">False</property>
+                <property name="Fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.Frame" id="configframe">
+                <property name="MemberName" />
+                <property name="ShadowType">None</property>
+                <child>
+                  <widget class="Gtk.Alignment" id="GtkAlignment1">
+                    <property name="MemberName" />
+                    <property name="Xalign">0</property>
+                    <property name="Yalign">0</property>
+                    <property name="LeftPadding">12</property>
+                    <child>
+                      <widget class="Gtk.VBox" id="configbox">
+                        <property name="MemberName" />
+                        <property name="Spacing">6</property>
+                        <property name="BorderWidth">6</property>
+                        <child>
+                          <placeholder />
+                        </child>
+                        <child>
+                          <placeholder />
+                        </child>
+                        <child>
+                          <placeholder />
+                        </child>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="Gtk.Label" id="GtkLabel1">
+                    <property name="MemberName" />
+                    <property name="LabelProp" translatable="yes">&lt;b&gt;Configuration&lt;/b&gt;</property>
+                    <property name="UseMarkup">True</property>
+                  </widget>
+                  <packing>
+                    <property name="type">label_item</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Position">1</property>
+                <property name="AutoSize">True</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder />
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">1</property>
+            <property name="AutoSize">False</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
 </stetic-interface>
\ No newline at end of file
diff --git a/LongoMatch.GUI/gtk-gui/objects.xml b/LongoMatch.GUI/gtk-gui/objects.xml
index c43f9c0..2fc6805 100644
--- a/LongoMatch.GUI/gtk-gui/objects.xml
+++ b/LongoMatch.GUI/gtk-gui/objects.xml
@@ -368,4 +368,8 @@
     <itemgroups />
     <signals />
   </object>
+  <object type="LongoMatch.Gui.Component.PluginsPreferences" palette-category="General" 
allow-children="false" base-type="Gtk.Bin">
+    <itemgroups />
+    <signals />
+  </object>
 </objects>
\ No newline at end of file
diff --git a/LongoMatch.Plugins.GStreamer/Assembly.cs b/LongoMatch.Plugins.GStreamer/Assembly.cs
index 9f755b7..256fed3 100644
--- a/LongoMatch.Plugins.GStreamer/Assembly.cs
+++ b/LongoMatch.Plugins.GStreamer/Assembly.cs
@@ -19,5 +19,6 @@ using Mono.Addins;
 
 [assembly:Addin]
 [assembly:AddinAuthor ("LongoMatch Project")]
-[assembly:AddinName ("LongoMatch GStreamer restricted plugins")]
+[assembly:AddinName ("Free Codecs")]
+[assembly:AddinDescription ("Free Software codecs for audio/video encoding and decoding with patents and 
licence issues")]
 [assembly:AddinDependency ("LongoMatch", "1.1")]
diff --git a/LongoMatch.Plugins/Assembly.cs b/LongoMatch.Plugins/Assembly.cs
index 2523872..8a82f97 100644
--- a/LongoMatch.Plugins/Assembly.cs
+++ b/LongoMatch.Plugins/Assembly.cs
@@ -21,4 +21,5 @@ using Mono.Addins;
 [assembly:Addin]
 [assembly:AddinAuthor ("LongoMatch Project")]
 [assembly:AddinName ("LongoMatch plugins")]
+[assembly:AddinDescription ("LongoMatch default import and dashboard plugins")]
 [assembly:AddinDependency ("LongoMatch", "1.1")]
\ No newline at end of file
diff --git a/LongoMatch/Main.cs b/LongoMatch/Main.cs
index 6620fca..3043a7d 100644
--- a/LongoMatch/Main.cs
+++ b/LongoMatch/Main.cs
@@ -38,7 +38,6 @@ namespace LongoMatch
                
                public static void Main (string[] args)
                {
-                       AddinsManager manager = null;
                        CoreServices.Init ();
 
                        InitGtk ();
@@ -52,16 +51,16 @@ namespace LongoMatch
                        Version version = Assembly.GetExecutingAssembly ().GetName ().Version;
 
                        try {
-                               manager = new AddinsManager (Config.PluginsConfigDir, Config.PluginsDir);
-                               manager.LoadConfigModifierAddins ();
-                               manager.RegisterGStreamerPlugins ();
+                               AddinsManager.Initialize (Config.PluginsConfigDir, Config.PluginsDir);
+                               AddinsManager.LoadConfigModifierAddins ();
+                               AddinsManager.RegisterGStreamerPlugins ();
                                Config.DrawingToolkit = new CairoBackend ();
                                Config.EventsBroker = new EventsBroker ();
                                IMultimediaToolkit multimediaToolkit = new MultimediaToolkit ();
                                Config.MultimediaToolkit = multimediaToolkit;
                                GUIToolkit guiToolkit = new GUIToolkit (version);
-                               manager.LoadExportProjectAddins (guiToolkit.MainController);
-                               manager.LoadMultimediaBackendsAddins (multimediaToolkit);
+                               AddinsManager.LoadExportProjectAddins (guiToolkit.MainController);
+                               AddinsManager.LoadMultimediaBackendsAddins (multimediaToolkit);
                                try {
                                        CoreServices.Start (guiToolkit, multimediaToolkit);
                                } catch (DBLockedException locked) {
@@ -71,17 +70,15 @@ namespace LongoMatch
                                        Log.Exception (locked);
                                        return;
                                }
-                               manager.LoadDashboards (Config.CategoriesTemplatesProvider);
-                               manager.LoadImportProjectAddins (CoreServices.ProjectsImporter);
+                               AddinsManager.LoadDashboards (Config.CategoriesTemplatesProvider);
+                               AddinsManager.LoadImportProjectAddins (CoreServices.ProjectsImporter);
                                Application.Run ();
                        } catch (Exception ex) {
                                ProcessExecutionError (ex);
                        } finally {
-                               if (manager != null) {
-                                       try {
-                                               manager.ShutdownMultimediaBackends ();
-                                       } catch {
-                                       }
+                               try {
+                                       AddinsManager.ShutdownMultimediaBackends ();
+                               } catch {
                                }
                        }
                }
diff --git a/build/build.environment.mk b/build/build.environment.mk
index 941c765..295c233 100644
--- a/build/build.environment.mk
+++ b/build/build.environment.mk
@@ -79,9 +79,11 @@ REF_DEP_LONGOMATCH_GUI_HELPERS = \
 REF_DEP_LONGOMATCH_GUI = \
                      $(LINK_SYSTEM_DRAWING) \
                      $(LINK_MONO_POSIX) \
+                     $(LINK_MONO_ADDINS) \
                      $(LINK_GLIB) \
                      $(LINK_GTK) \
                      $(LINK_CAIRO) \
+                     $(LINK_LONGOMATCH_ADDINS) \
                      $(LINK_LONGOMATCH_CORE) \
                      $(LINK_LONGOMATCH_MULTIMEDIA) \
                      $(LINK_LONGOMATCH_GUI_MULTIMEDIA) \


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]