[longomatch/rework] WPI



commit c131900047c6148be213031d8b7d3fa28ec5e62b
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Sun Aug 18 15:38:14 2013 +0200

    WPI

 LongoMatch.Addins/AddinsManager.cs                 |    4 +-
 .../GUI/{IMainWindow.cs => IAnalysisWindow.cs}     |   30 +-
 LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs      |    2 +-
 LongoMatch.Core/Interfaces/GUI/IMainController.cs  |   42 ++
 .../Interfaces/GUI/IProjectOptionsController.cs    |   34 +
 LongoMatch.Core/LongoMatch.Core.mdp                |    4 +-
 LongoMatch.GUI/Gui/Component/AnalysisComponent.cs  |  594 +++++++++++++++++
 .../Gui/Component/SubcategoiesTagsEditor.cs        |  131 ++++
 LongoMatch.GUI/Gui/GUIToolkit.cs                   |    4 +-
 LongoMatch.GUI/Gui/MainWindow.cs                   |  668 +-------------------
 LongoMatch.GUI/LongoMatch.GUI.mdp                  |    2 +
 .../LongoMatch.Gui.Component.AnalysisComponent.cs  |    7 +
 ...goMatch.Gui.Component.SubcategoiesTagsEditor.cs |  197 ++++++
 LongoMatch.GUI/gtk-gui/gui.stetic                  |  379 ++++++------
 LongoMatch.GUI/gtk-gui/objects.xml                 |   29 +
 LongoMatch.Services/LongoMatch.Services.mdp        |    1 +
 LongoMatch.Services/Services/Core.cs               |    4 +-
 LongoMatch.Services/Services/EventsManager.cs      |    2 +-
 LongoMatch.Services/Services/GameUnitsManager.cs   |    4 +-
 LongoMatch.Services/Services/HotKeysManager.cs     |    2 +-
 LongoMatch.Services/Services/PlaylistManager.cs    |    2 +-
 .../Services/ProjectOptionsManager.cs              |   91 +++
 LongoMatch.Services/Services/ProjectsManager.cs    |   41 ++-
 23 files changed, 1410 insertions(+), 864 deletions(-)
---
diff --git a/LongoMatch.Addins/AddinsManager.cs b/LongoMatch.Addins/AddinsManager.cs
index 1be19be..a6be4f8 100644
--- a/LongoMatch.Addins/AddinsManager.cs
+++ b/LongoMatch.Addins/AddinsManager.cs
@@ -48,7 +48,7 @@ namespace LongoMatch.Addins
                        }
                }
                
-               public void LoadExportProjectAddins(IMainWindow mainWindow) {
+               public void LoadExportProjectAddins(IAnalysisWindow mainWindow) {
                        foreach (IExportProject exportProject in 
AddinManager.GetExtensionObjects<IExportProject> ()) {
                                try {
                                        mainWindow.AddExportEntry(exportProject.GetMenuEntryName(), 
exportProject.GetMenuEntryShortName(),
@@ -60,7 +60,7 @@ namespace LongoMatch.Addins
                        }
                }
                
-               public void LoadImportProjectAddins(IMainWindow mainWindow) {
+               public void LoadImportProjectAddins(IAnalysisWindow mainWindow) {
                        foreach (IImportProject importProject in 
AddinManager.GetExtensionObjects<IImportProject> ()) {
                                try{
                                        mainWindow.AddImportEntry(importProject.GetMenuEntryName(), 
importProject.GetMenuEntryShortName(),
diff --git a/LongoMatch.Core/Interfaces/GUI/IMainWindow.cs b/LongoMatch.Core/Interfaces/GUI/IAnalysisWindow.cs
similarity index 78%
rename from LongoMatch.Core/Interfaces/GUI/IMainWindow.cs
rename to LongoMatch.Core/Interfaces/GUI/IAnalysisWindow.cs
index c6bc27e..6e7ab93 100644
--- a/LongoMatch.Core/Interfaces/GUI/IMainWindow.cs
+++ b/LongoMatch.Core/Interfaces/GUI/IAnalysisWindow.cs
@@ -25,7 +25,7 @@ using LongoMatch.Store.Templates;
 
 namespace LongoMatch.Interfaces.GUI
 {
-       public interface IMainWindow
+       public interface IAnalysisWindow
        {       
                /* Tags */
                event NewTagHandler NewTagEvent;
@@ -49,25 +49,6 @@ namespace LongoMatch.Interfaces.GUI
                /* Snapshots */
                event SnapshotSeriesHandler SnapshotSeriesEvent;
                
-               /* Projects */
-               event SaveProjectHandler SaveProjectEvent;
-               event NewProjectHandler NewProjectEvent;
-               event OpenProjectHandler OpenProjectEvent;
-               event CloseOpenendProjectHandler CloseOpenedProjectEvent;
-               event ImportProjectHandler ImportProjectEvent;
-               event ExportProjectHandler ExportProjectEvent;
-               
-               /* Managers */
-               event ManageJobsHandler ManageJobsEvent; 
-               event ManageTeamsHandler ManageTeamsEvent;
-               event ManageCategoriesHandler ManageCategoriesEvent;
-               event ManageProjects ManageProjectsEvent;
-               event ManageDatabases ManageDatabasesEvent;
-               event EditPreferences EditPreferencesEvent;
-               
-               /* Stats */
-               event ShowProjectStats ShowProjectStatsEvent;
-               
                /* Game Units events */
                event GameUnitHandler GameUnitEvent;
                event UnitChangedHandler UnitChanged;
@@ -77,16 +58,19 @@ namespace LongoMatch.Interfaces.GUI
                
                event KeyHandler KeyPressed;
                
-               /* Convert Video Files */
-               event ConvertVideoFilesHandler ConvertVideoFilesEvent;
-               
                void SetProject(Project project, ProjectType projectType, CaptureSettings props, PlaysFilter 
filter);
+               void CloseOpenedProject ();
                void AddPlay(Play play);
                void UpdateSelectedPlay (Play play);
                void UpdateCategories (Categories categories);
                void DeletePlays (List<Play> plays);
                void UpdateGameUnits (GameUnitsList gameUnits);
                
+               bool Fullscreen {set;}
+               bool WidgetsVisible {set;}
+               bool PlaylistVisible {set;}
+               VideoAnalysisMode AnalysisMode {set;}
+               
                IRenderingStateBar RenderingStateBar{get;}
                IPlayer Player{get;}
                ICapturer Capturer{get;}
diff --git a/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs b/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
index e6af4d1..10e4ee6 100644
--- a/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
+++ b/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
@@ -30,7 +30,7 @@ namespace LongoMatch.Interfaces.GUI
 {
        public interface IGUIToolkit
        {
-               IMainWindow MainWindow {get;}
+               IAnalysisWindow MainWindow {get;}
                Version Version {get;}
        
                /* Messages */
diff --git a/LongoMatch.Core/Interfaces/GUI/IMainController.cs 
b/LongoMatch.Core/Interfaces/GUI/IMainController.cs
new file mode 100644
index 0000000..e10a33f
--- /dev/null
+++ b/LongoMatch.Core/Interfaces/GUI/IMainController.cs
@@ -0,0 +1,42 @@
+//
+//  Copyright (C) 2013 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.Interfaces.GUI
+{
+       public interface IMainController
+       {
+               /* Projects */
+               event NewProjectHandler NewProjectEvent;
+               event OpenProjectHandler OpenProjectEvent;
+               event ImportProjectHandler ImportProjectEvent;
+               event ExportProjectHandler ExportProjectEvent;
+               
+               /* Managers */
+               event ManageJobsHandler ManageJobsEvent; 
+               event ManageTeamsHandler ManageTeamsEvent;
+               event ManageCategoriesHandler ManageCategoriesEvent;
+               event ManageProjects ManageProjectsEvent;
+               event ManageDatabases ManageDatabasesEvent;
+               event EditPreferences EditPreferencesEvent;
+               
+               /* Convert Video Files */
+               event ConvertVideoFilesHandler ConvertVideoFilesEvent;
+       }
+}
+
diff --git a/LongoMatch.Core/Interfaces/GUI/IProjectOptionsController.cs 
b/LongoMatch.Core/Interfaces/GUI/IProjectOptionsController.cs
new file mode 100644
index 0000000..e9b8582
--- /dev/null
+++ b/LongoMatch.Core/Interfaces/GUI/IProjectOptionsController.cs
@@ -0,0 +1,34 @@
+//
+//  Copyright (C) 2013 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.Interfaces.GUI
+{
+       public interface IProjectOptionsController
+       {
+               event SaveProjectHandler SaveProjectEvent;
+               event CloseOpenendProjectHandler CloseOpenedProjectEvent;
+               event ShowFullScreenHandler ShowFullScreenEvent;
+               event PlaylistVisibiltyHandler PlaylistVisibilityEvent;
+               event AnalysisWidgetsVisibilityHandler AnalysisWidgetsVisibilityEvent;
+               event AnalysisModeChangedHandler AnalysisModeChangedEvent;
+               event ShowProjectStats ShowProjectStatsEvent;
+               event TagSubcategoriesChangedHandler TagSubcategoriesChangedEvent;
+       }
+}
+
diff --git a/LongoMatch.Core/LongoMatch.Core.mdp b/LongoMatch.Core/LongoMatch.Core.mdp
index e2d0055..eb0276c 100644
--- a/LongoMatch.Core/LongoMatch.Core.mdp
+++ b/LongoMatch.Core/LongoMatch.Core.mdp
@@ -74,7 +74,7 @@
     <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IRenderingStateBar.cs" />
     <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IPlayer.cs" />
     <File subtype="Code" buildaction="Compile" name="Handlers/Multimedia.cs" />
-    <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IMainWindow.cs" />
+    <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IAnalysisWindow.cs" />
     <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/ICapturer.cs" />
     <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IPlaylistWidget.cs" />
     <File subtype="Directory" buildaction="Compile" name="Interfaces" />
@@ -107,6 +107,8 @@
     <File subtype="Code" buildaction="Compile" name="Common/EncodingQuality.cs" />
     <File subtype="Code" buildaction="Compile" name="Common/Gettext.cs" />
     <File subtype="Code" buildaction="Compile" name="Common/Exceptions.cs" />
+    <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IMainController.cs" />
+    <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IProjectOptionsController.cs" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089" />
diff --git a/LongoMatch.GUI/Gui/Component/AnalysisComponent.cs 
b/LongoMatch.GUI/Gui/Component/AnalysisComponent.cs
new file mode 100644
index 0000000..07e4690
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/AnalysisComponent.cs
@@ -0,0 +1,594 @@
+//
+//  Copyright (C) 2013 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 LongoMatch.Interfaces.GUI;
+
+namespace LongoMatch.Gui.Component
+{
+       [System.ComponentModel.ToolboxItem(true)]
+       public partial class AnalysisComponent : Gtk.Bin, IAnalysisWindow
+       {
+               /* Tags */
+               public event NewTagHandler NewTagEvent;
+               public event NewTagStartHandler NewTagStartEvent;
+               public event NewTagStopHandler NewTagStopEvent;
+               public event PlaySelectedHandler PlaySelectedEvent;
+               public event NewTagAtFrameHandler NewTagAtFrameEvent;
+               public event TagPlayHandler TagPlayEvent;
+               public event PlaysDeletedHandler PlaysDeletedEvent;
+               public event TimeNodeChangedHandler TimeNodeChanged;
+               public event PlayCategoryChangedHandler PlayCategoryChanged;
+               
+               /* Playlist */
+               public event RenderPlaylistHandler RenderPlaylistEvent;
+               public event PlayListNodeAddedHandler PlayListNodeAddedEvent;
+               public event PlayListNodeSelectedHandler PlayListNodeSelectedEvent;
+               public event OpenPlaylistHandler OpenPlaylistEvent;
+               public event NewPlaylistHandler NewPlaylistEvent;
+               public event SavePlaylistHandler SavePlaylistEvent; 
+               
+               /* Snapshots */
+               public event SnapshotSeriesHandler SnapshotSeriesEvent;
+               
+               /* Game Units events */
+               public event GameUnitHandler GameUnitEvent;
+               public event UnitChangedHandler UnitChanged;
+               public event UnitSelectedHandler UnitSelected;
+               public event UnitsDeletedHandler UnitDeleted;
+               public event UnitAddedHandler UnitAdded;
+               
+               public event KeyHandler KeyPressed;
+
+               static Project openedProject;
+               ProjectType projectType;
+               TimeNode selectedTimeNode;              
+               TimeLineWidget timeline;
+               bool gameUnitsActionVisible, detachedPlayer;
+               GameUnitsTimelineWidget guTimeline;
+               IGUIToolkit guiToolKit;
+               Gtk.Window playerWindow;
+               
+               public AnalysisComponent ()
+               {
+                       this.Build ();
+                       projectType = ProjectType.None;
+
+                       timeline = new TimeLineWidget();
+                       downbox.PackStart(timeline, true, true, 0);
+                       
+                       guTimeline = new GameUnitsTimelineWidget ();
+                       downbox.PackStart(guTimeline, true, true, 0);
+                       
+                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
+                       playercapturer.SetLogo(System.IO.Path.Combine(Config.ImagesDir,"background.png"));
+                       playercapturer.LogoMode = true;
+                       playercapturer.Tick += OnTick;
+                       playercapturer.Detach += DetachPlayer;
+                       playercapturer.Logo = System.IO.Path.Combine(Config.ImagesDir,"background.png");
+                       playercapturer.CaptureFinished += (sender, e) => {CloseCaptureProject();};
+                       
+                       buttonswidget.Mode = TagMode.Predifined;
+                       ConnectSignals();
+                       ConnectMenuSignals();
+                       
+                       postagger.SetMode (false);
+               }
+               
+               public IPlayer Player{
+                       get {
+                               return playercapturer;
+                       }
+               }
+               
+               public ICapturer Capturer{
+                       get {
+                               return playercapturer;
+                       }
+               }
+               
+               public IPlaylistWidget Playlist{
+                       get {
+                               return playlist;
+                       }
+               }
+               
+               public ITemplatesService TemplatesService {
+                       set {
+                               playsSelection.TemplatesService = value;
+                       }
+               }
+               
+               public void AddPlay(Play play) {
+                       playsSelection.AddPlay(play);
+                       timeline.AddPlay(play);
+                       timeline.QueueDraw();
+               }
+               
+               public void UpdateSelectedPlay (Play play) {
+                       selectedTimeNode = play;
+                       timeline.SelectedTimeNode = play;
+                       postagger.LoadPlay (play, false);
+                       SetTagsBoxVisibility (true);
+                       notes.Play= play;
+               }
+
+               public void UpdateCategories (Categories categories) {
+                       buttonswidget.Categories = openedProject.Categories;
+               }
+               
+               public void DeletePlays (List<Play> plays) {
+                       playsSelection.RemovePlays(plays);
+                       timeline.RemovePlays(plays);
+                       timeline.QueueDraw();
+               }
+               
+               public void UpdateGameUnits (GameUnitsList gameUnits) {
+                       gameUnitsActionVisible = gameUnits != null && gameUnits.Count > 0;
+                       GameUnitsViewAction.Sensitive = gameUnitsActionVisible;
+                       if (gameUnits == null) {
+                               gameunitstaggerwidget1.Visible = false;
+                               return;
+                       }
+                       gameunitstaggerwidget1.Visible = true;
+                       gameunitstaggerwidget1.GameUnits = gameUnits;
+               }
+               
+               private void ConnectSignals() {
+                       /* Adding Handlers for each event */
+
+                       /* Connect new mark event */
+                       buttonswidget.NewMarkEvent += EmitNewTag;;
+                       buttonswidget.NewMarkStartEvent += EmitNewTagStart;
+                       buttonswidget.NewMarkStopEvent += EmitNewTagStop;
+                       timeline.NewMarkEvent += EmitNewTagAtFrame;
+
+                       /* Connect TimeNodeChanged events */
+                       timeline.TimeNodeChanged += EmitTimeNodeChanged;
+                       notes.TimeNodeChanged += EmitTimeNodeChanged;
+
+                       /* Connect TimeNodeDeleted events */
+                       playsSelection.PlaysDeleted += EmitPlaysDeleted;
+                       timeline.TimeNodeDeleted += EmitPlaysDeleted;
+
+                       /* Connect TimeNodeSelected events */
+                       playsSelection.PlaySelected += OnTimeNodeSelected;
+                       timeline.TimeNodeSelected += OnTimeNodeSelected;
+                       
+                       /* Connect TimeNodeChangedEvent */
+                       playsSelection.TimeNodeChanged += EmitTimeNodeChanged;
+
+                       /* Connect PlayCategoryChanged events */
+                       playsSelection.PlayCategoryChanged += EmitPlayCategoryChanged;
+
+                       /* Connect playlist events */
+                       playlist.PlayListNodeSelected += EmitPlayListNodeSelected;
+                       playlist.NewPlaylistEvent += EmitNewPlaylist;
+                       playlist.OpenPlaylistEvent += EmitOpenPlaylist;
+                       playlist.SavePlaylistEvent += EmitSavePlaylist;
+
+                       /* Connect PlayListNodeAdded events */
+                       playsSelection.PlayListNodeAdded += OnPlayListNodeAdded;
+                       timeline.PlayListNodeAdded += OnPlayListNodeAdded;
+
+                       /* Connect tags events */
+                       playsSelection.TagPlay += EmitTagPlay;
+                       timeline.TagPlay += EmitTagPlay;
+
+                       /* Connect SnapshotSeries events */
+                       playsSelection.SnapshotSeries += EmitSnapshotSeries;
+                       timeline.SnapshotSeries += EmitSnapshotSeries;
+
+                       playlist.RenderPlaylistEvent += EmitRenderPlaylist;
+                       playsSelection.RenderPlaylist += EmitRenderPlaylist;
+                       timeline.RenderPlaylist += EmitRenderPlaylist;
+                       
+                       /* Game Units event */
+                       gameunitstaggerwidget1.GameUnitEvent += EmitGameUnitEvent;
+                       guTimeline.UnitAdded += EmitUnitAdded;;
+                       guTimeline.UnitDeleted += EmitUnitDeleted;
+                       guTimeline.UnitSelected += EmitUnitSelected;
+                       guTimeline.UnitChanged += EmitUnitChanged;
+                       
+                       playercapturer.Error += OnMultimediaError;
+                       playercapturer.SegmentClosedEvent += OnSegmentClosedEvent;
+                       
+                       KeyPressEvent += (o, args) => (EmitKeyPressed(o, (int)args.Event.Key, 
(int)args.Event.State));
+               }
+               
+                               void DetachPlayer (bool detach) {
+                       if (detach == detachedPlayer)
+                               return;
+                               
+                       detachedPlayer = detach;
+                       
+                       if (detach) {
+                               EventBox box;
+                               Log.Debug("Detaching player");
+                               
+                               playerWindow = new Gtk.Window(Constants.SOFTWARE_NAME);
+                               playerWindow.Icon = Stetic.IconLoader.LoadIcon(this, "longomatch", 
IconSize.Button);
+                               playerWindow.DeleteEvent += (o, args) => DetachPlayer(false);
+                               box = new EventBox();
+                               
+                               box.KeyPressEvent += (o, args) => OnKeyPressEvent(args.Event);
+                               playerWindow.Add(box);
+                               
+                               box.Show();
+                               playerWindow.Show();
+                               
+                               playercapturer.Reparent(box);
+                               buttonswidget.Visible = true;
+                               timeline.Visible = true;
+                               if (Config.UseGameUnits) {
+                                       guTimeline.Visible = true;
+                                       gameunitstaggerwidget1.Visible = true;
+                               }
+                               videowidgetsbox.Visible = false;
+                       } else {
+                               ToggleAction action;
+                               
+                               Log.Debug("Attaching player again");
+                               videowidgetsbox.Visible = true;
+                               playercapturer.Reparent(this.videowidgetsbox);
+                               playerWindow.Destroy();
+                               
+                               if (ManualTaggingViewAction.Active)
+                                       action = ManualTaggingViewAction;
+                               else if (TimelineViewAction.Active)
+                                       action = TimelineViewAction;
+                               else if (GameUnitsViewAction.Active)
+                                       action = GameUnitsViewAction;
+                               else
+                                       action = TaggingViewAction;
+                               OnViewToggled(action, new EventArgs());
+                       }
+                       playercapturer.Detached = detach;
+               }
+               
+               public void SetProject(Project project, ProjectType projectType, CaptureSettings props, 
PlaysFilter filter)
+               {
+                       bool isLive = false;
+                       
+                       /* Update tabs labels */
+                       var desc = project.Description;
+                       
+                       ExportProjectAction1.Sensitive = true;
+                       
+                       if(projectType == ProjectType.FileProject) {
+                               playercapturer.LogoMode = false;
+                               timeline.SetProject (project, filter);
+                               guTimeline.Project = project;
+
+                       } else {
+                               isLive = true;
+                               if(projectType == ProjectType.FakeCaptureProject) {
+                                       playercapturer.Type = CapturerType.Fake;
+                                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Capturer;
+                               } else {
+                                       playercapturer.Mode = 
PlayerCapturerBin.PlayerOperationMode.PreviewCapturer;
+                               }
+                       }
+                       
+                       openedProject = project;
+                       this.projectType = projectType;
+                       
+                       filter.FilterUpdated += OnFilterUpdated;
+                       playsSelection.SetProject(project, isLive, filter);
+                       buttonswidget.Categories = project.Categories;
+                       postagger.LoadBackgrounds (openedProject.Categories.FieldBackground,
+                                                  openedProject.Categories.HalfFieldBackground,
+                                                  openedProject.Categories.GoalBackground);
+                       ShowWidgets();
+               }
+               
+               void SetPlaylistVisibility (bool visible) {
+                       if (visible) {
+                               righthbox.Visible = true;
+                               playlist.Visible = true;
+                       } else {
+                               playlist.Visible = false;
+                               if (!tagsvbox.Visible)
+                                       righthbox.Visible = false;
+                       }
+               }
+               
+               void SetTagsBoxVisibility (bool visible) {
+                       if (visible) {
+                               righthbox.Visible = true;
+                               tagsvbox.Visible = true;
+                       } else {
+                               tagsvbox.Visible = false;
+                               if (!playlist.Visible)
+                                       righthbox.Visible = false;
+                       }
+               }
+               
+               private void CloseCaptureProject() {
+                       if(projectType == ProjectType.CaptureProject ||
+                          projectType == ProjectType.URICaptureProject) {
+                               playercapturer.Close();
+                               playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
+                               EmitSaveProject();
+                       } else if(projectType == ProjectType.FakeCaptureProject) {
+                               EmitCloseOpenedProject(true);
+                       }
+               }
+
+               private void ResetGUI() {
+                       bool playlistVisible = playlist.Visible;
+                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
+                       playercapturer.LogoMode = true;
+                       ClearWidgets();
+                       HideWidgets();
+                       SetPlaylistVisibility (playlistVisible);
+                       SetTagsBoxVisibility (false);
+                       selectedTimeNode = null;
+                       if (detachedPlayer)
+                               DetachPlayer(false);
+               }
+               
+               private void ShowWidgets() {
+                       leftbox.Show();
+                       if(TaggingViewAction.Active || ManualTaggingViewAction.Active) {
+                               buttonswidget.Show();
+                               gameunitstaggerwidget1.Show();
+                       } else if (TimelineViewAction.Active) {
+                               timeline.Show();
+                       } else if (GameUnitsViewAction.Active) {
+                               gameunitstaggerwidget1.Show();
+                               guTimeline.Show();
+                       }
+               }
+
+               private void HideWidgets() {
+                       leftbox.Hide();
+                       SetTagsBoxVisibility (false);
+                       buttonswidget.Hide();
+                       timeline.Hide();
+                       gameunitstaggerwidget1.Hide();
+                       guTimeline.Hide();
+               }
+
+               private void ClearWidgets() {
+                       buttonswidget.Categories = null;
+                       playsSelection.Clear();
+               }
+               
+               protected override bool OnKeyPressEvent(EventKey evnt)
+               {
+                       Gdk.Key key = evnt.Key;
+                       Gdk.ModifierType modifier = evnt.State;
+                       bool ret;
+
+                       ret = base.OnKeyPressEvent(evnt);
+
+                       if(openedProject == null && !playercapturer.Opened)
+                               return ret;
+
+                       if(projectType != ProjectType.CaptureProject &&
+                          projectType != ProjectType.URICaptureProject &&
+                          projectType != ProjectType.FakeCaptureProject) {
+                               switch(key) {
+                               case Constants.SEEK_FORWARD:
+                                       if(modifier == Constants.STEP)
+                                               playercapturer.StepForward();
+                                       else
+                                               playercapturer.SeekToNextFrame(selectedTimeNode != null);
+                                       break;
+                               case Constants.SEEK_BACKWARD:
+                                       if(modifier == Constants.STEP)
+                                               playercapturer.StepBackward();
+                                       else
+                                               playercapturer.SeekToPreviousFrame(selectedTimeNode != null);
+                                       break;
+                               case Constants.FRAMERATE_UP:
+                                       playercapturer.FramerateUp();
+                                       break;
+                               case Constants.FRAMERATE_DOWN:
+                                       playercapturer.FramerateDown();
+                                       break;
+                               case Constants.TOGGLE_PLAY:
+                                       playercapturer.TogglePlay();
+                                       break;
+                               }
+                       } else {
+                               switch(key) {
+                               case Constants.TOGGLE_PLAY:
+                                       playercapturer.TogglePause();
+                                       break;
+                               }
+                       }
+                       return ret;
+               }
+
+               protected virtual void OnTimeNodeSelected(Play play)
+               {
+                       SetTagsBoxVisibility (true);
+                       if (PlaySelectedEvent != null)
+                               PlaySelectedEvent(play);
+               }
+
+               protected virtual void OnSegmentClosedEvent()
+               {
+                       SetTagsBoxVisibility (false);
+                       timeline.SelectedTimeNode = null;
+                       selectedTimeNode = null;
+               }
+               
+               protected virtual void OnTick(object o, long currentTime, long streamLength,
+                       float currentPosition, bool seekable)
+               {
+                       if(currentTime != 0 && timeline != null && openedProject != null) {
+                               uint frame = (uint)(currentTime * openedProject.Description.File.Fps / 1000);
+                               timeline.CurrentFrame = frame;
+                               guTimeline.CurrentFrame = frame;
+                       }
+                       gameunitstaggerwidget1.CurrentTime = new Time{MSeconds = (int)currentTime};
+               }
+               
+               protected virtual void OnUpdate(Version version, string URL) {
+                       LongoMatch.Gui.Dialog.UpdateDialog updater = new LongoMatch.Gui.Dialog.UpdateDialog();
+                       updater.Fill(version, URL);
+                       updater.TransientFor = this;
+                       updater.Run();
+                       updater.Destroy();
+               }
+
+               protected virtual void OnDrawingToolActionToggled(object sender, System.EventArgs e)
+               {
+                       drawingtoolbox1.Visible = DrawingToolAction.Active;
+                       drawingtoolbox1.DrawingVisibility = DrawingToolAction.Active;
+               }
+
+               protected override bool OnDeleteEvent(Gdk.Event evnt)
+               {
+                       CloseAndQuit();
+                       return true;
+               }
+
+               protected virtual void OnMultimediaError(object o, string message)
+               {
+                       MessagesHelpers.ErrorMessage (this,
+                               Catalog.GetString("The following error happened and" +
+                               " the current project will be closed:")+"\n" + message);
+                       EmitCloseOpenedProject(true);
+               }
+               
+               protected virtual void OnFilterUpdated()
+               {
+               }
+               
+               
+                               private void EmitPlaySelected(Play play)
+               {
+                       if (PlaySelectedEvent != null)
+                               PlaySelectedEvent(play);
+               }
+
+               private void EmitTimeNodeChanged(TimeNode tNode, object val)
+               {
+                       if (TimeNodeChanged != null)
+                               TimeNodeChanged(tNode, val);
+               }
+
+               private void EmitPlaysDeleted(List<Play> plays)
+               {
+                       if (PlaysDeletedEvent != null)
+                               PlaysDeletedEvent(plays);
+               }
+               
+               protected virtual void EmitPlayCategoryChanged(Play play, Category cat)
+               {
+                       if(PlayCategoryChanged != null)
+                               PlayCategoryChanged(play, cat);
+               }
+
+               private void OnPlayListNodeAdded(Play play)
+               {
+                       if (PlayListNodeAddedEvent != null)
+                               PlayListNodeAddedEvent(play);
+               }
+
+               private void EmitPlayListNodeSelected(PlayListPlay plNode)
+               {
+                       if (PlayListNodeSelectedEvent != null)
+                               PlayListNodeSelectedEvent(plNode);
+               }
+
+               private void EmitSnapshotSeries(Play play) {
+                       if (SnapshotSeriesEvent != null)
+                               SnapshotSeriesEvent (play);
+               }
+
+               private void EmitNewTagAtFrame(Category category, int frame) {
+                       if (NewTagAtFrameEvent != null)
+                               NewTagAtFrameEvent(category, frame);
+               }
+
+               private void EmitNewTag(Category category) {
+                       if (NewTagEvent != null)
+                               NewTagEvent(category);
+               }
+
+               private void EmitNewTagStart() {
+                       if (NewTagStartEvent != null)
+                               NewTagStartEvent ();
+               }
+
+               private void EmitNewTagStop(Category category) {
+                       if (NewTagStopEvent != null)
+                               NewTagStopEvent (category);
+               }
+               
+               private void EmitRenderPlaylist(IPlayList playlist) {
+                       if (RenderPlaylistEvent != null)
+                               RenderPlaylistEvent(playlist);
+               }
+               
+               private void EmitTagPlay(Play play) {
+                       if (TagPlayEvent != null)
+                               TagPlayEvent (play);
+               }
+               
+               private void EmitNewPlaylist() {
+                       if (NewPlaylistEvent != null)
+                               NewPlaylistEvent();
+               }
+               
+               private void EmitOpenPlaylist() {
+                       if (OpenPlaylistEvent != null)
+                               OpenPlaylistEvent();
+               }
+               
+               private void EmitSavePlaylist() {
+                       if (SavePlaylistEvent != null)
+                               SavePlaylistEvent();
+               }
+               
+               private void EmitGameUnitEvent(GameUnit gameUnit, GameUnitEventType eType) {
+                       if (GameUnitEvent != null)
+                               GameUnitEvent(gameUnit, eType);
+               }
+               
+               private void EmitUnitAdded(GameUnit gameUnit, int frame) {
+                       if (UnitAdded != null)
+                               UnitAdded(gameUnit, frame);
+               }
+               
+               private void EmitUnitDeleted(GameUnit gameUnit, List<TimelineNode> units) {
+                       if (UnitDeleted != null)
+                               UnitDeleted(gameUnit, units);
+               }
+               
+               private void EmitUnitSelected(GameUnit gameUnit, TimelineNode unit) {
+                       if (UnitSelected != null)
+                               UnitSelected(gameUnit, unit);
+               }
+               
+               private void EmitUnitChanged(GameUnit gameUnit, TimelineNode unit, Time time) {
+                       if (UnitChanged != null)
+                               UnitChanged(gameUnit, unit, time);
+               }
+               
+               private void EmitKeyPressed(object sender, int key, int modifier) {
+                       if (KeyPressed != null)
+                               KeyPressed(sender, key, modifier);
+               }
+       }
+}
+
diff --git a/LongoMatch.GUI/Gui/Component/SubcategoiesTagsEditor.cs 
b/LongoMatch.GUI/Gui/Component/SubcategoiesTagsEditor.cs
new file mode 100644
index 0000000..47374f6
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/SubcategoiesTagsEditor.cs
@@ -0,0 +1,131 @@
+//
+//  Copyright (C) 2013 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 LongoMatch.Store;
+using System.Collections.Generic;
+using Gdk;
+using Gtk;
+
+namespace LongoMatch.Gui.Component
+{
+       [System.ComponentModel.ToolboxItem(true)]
+       public partial class SubcategoiesTagsEditor : Gtk.Bin
+       {
+               TagSubCategory template;
+               Dictionary<string, Widget>  tagsDict;
+               Color templateExistsColor;
+               
+               public SubcategoiesTagsEditor ()
+               {
+                       this.Build ();
+                       Gdk.Color.Parse("red", ref templateExistsColor);
+                       tagsDict = new Dictionary<string, Widget>();
+                       addtagbutton.Clicked += OnAddTag;
+                       tagentry.Activated += OnAddTag;
+                       nameentry.Changed += OnNameChanged;
+                       multicheckbutton.Toggled += OnMultiToggled;
+                       fastcheckbutton.Toggled += OnFastToggled;
+                       TemplatesNames = new List<string>();
+               }
+               
+               public List<string> TemplatesNames {
+                       get;
+                       set;
+               }
+               
+               public TagSubCategory Template {
+                       set{
+                               template = value;
+                               nameentry.Text = template.Name;
+                               fastcheckbutton.Active = template.FastTag;
+                               multicheckbutton.Active = template.AllowMultiple;
+                               
+                               foreach (string tag in template)
+                                       AddTag(tag, false);
+                       }
+                       get {
+                               return template;
+                       }
+               }
+               
+               public bool CheckName {
+                       set;
+                       get;
+               }
+               
+               private void RemoveTag (string tag) {
+                       tagsbox.Remove(tagsDict[tag]);
+                       tagsDict.Remove(tag);
+                       template.Remove(tag);
+               }
+               
+               private void AddTag(string tag, bool update) {
+                       HBox box;
+                       Label label;
+                       Button button;
+                       
+                       if (tagsDict.ContainsKey(tag))
+                               return;
+                       
+                       box = new HBox();
+                       label = new Label(tag);
+                       label.Justify = Justification.Left;
+                       button = new Button("gtk-delete");
+                       button.Clicked += delegate {
+                               RemoveTag(tag);
+                       };
+                       box.PackStart(label, true, false, 0);
+                       box.PackStart(button, false, false, 0);
+                       
+                       tagsbox.PackStart(box, false, false, 0);
+                       box.ShowAll();
+                       
+                       tagsDict.Add(tag, box);
+                       if (update)
+                               template.Add(tag);
+               }
+               
+               protected virtual void OnNameChanged (object sender, EventArgs e)
+               {
+                       if ((CheckName && TemplatesNames.Contains(nameentry.Text)) ||
+                           nameentry.Text == "") {
+                               nameentry.ModifyText(StateType.Normal, templateExistsColor);
+                       } else { 
+                               nameentry.ModifyText(StateType.Normal);
+                               template.Name = nameentry.Text;
+                       }
+               }
+               
+               protected virtual void OnMultiToggled (object sender, System.EventArgs e)
+               {
+                       template.AllowMultiple = multicheckbutton.Active;
+               }
+               
+               protected virtual void OnFastToggled (object sender, System.EventArgs e)
+               {
+                       template.FastTag = fastcheckbutton.Active;
+                       
+               }
+               
+               protected virtual void OnAddTag (object sender, System.EventArgs e)
+               {
+                       AddTag(tagentry.Text, true);
+               }
+       }
+}
+
diff --git a/LongoMatch.GUI/Gui/GUIToolkit.cs b/LongoMatch.GUI/Gui/GUIToolkit.cs
index ebb7800..d37594c 100644
--- a/LongoMatch.GUI/Gui/GUIToolkit.cs
+++ b/LongoMatch.GUI/Gui/GUIToolkit.cs
@@ -40,7 +40,7 @@ namespace LongoMatch.Gui
        public class GUIToolkit: IGUIToolkit
        {
                static GUIToolkit instance;
-               IMainWindow mainWindow;
+               IAnalysisWindow mainWindow;
                
                public GUIToolkit (Version version)
                {
@@ -56,7 +56,7 @@ namespace LongoMatch.Gui
                        }
                }
                
-               public IMainWindow MainWindow{
+               public IAnalysisWindow MainWindow{
                        get {
                                return mainWindow;
                        }
diff --git a/LongoMatch.GUI/Gui/MainWindow.cs b/LongoMatch.GUI/Gui/MainWindow.cs
index 330682d..24195b1 100644
--- a/LongoMatch.GUI/Gui/MainWindow.cs
+++ b/LongoMatch.GUI/Gui/MainWindow.cs
@@ -42,70 +42,34 @@ namespace LongoMatch.Gui
 {
        [System.ComponentModel.Category("LongoMatch")]
        [System.ComponentModel.ToolboxItem(false)]
-       public partial class MainWindow : Gtk.Window, IMainWindow
+       public partial class MainWindow : Gtk.Window, IMainController, IProjectOptionsController
        {
-       
-               /* Tags */
-               public event NewTagHandler NewTagEvent;
-               public event NewTagStartHandler NewTagStartEvent;
-               public event NewTagStopHandler NewTagStopEvent;
-               public event PlaySelectedHandler PlaySelectedEvent;
-               public event NewTagAtFrameHandler NewTagAtFrameEvent;
-               public event TagPlayHandler TagPlayEvent;
-               public event PlaysDeletedHandler PlaysDeletedEvent;
-               public event TimeNodeChangedHandler TimeNodeChanged;
-               public event PlayCategoryChangedHandler PlayCategoryChanged;
-               
-               /* Playlist */
-               public event RenderPlaylistHandler RenderPlaylistEvent;
-               public event PlayListNodeAddedHandler PlayListNodeAddedEvent;
-               public event PlayListNodeSelectedHandler PlayListNodeSelectedEvent;
-               public event OpenPlaylistHandler OpenPlaylistEvent;
-               public event NewPlaylistHandler NewPlaylistEvent;
-               public event SavePlaylistHandler SavePlaylistEvent; 
-               
-               /* Video Converter */
-               public event ConvertVideoFilesHandler ConvertVideoFilesEvent;
-               
-               /* Snapshots */
-               public event SnapshotSeriesHandler SnapshotSeriesEvent;
-               
-               /* Projects */
-               public event SaveProjectHandler SaveProjectEvent;
+               /* IMainController */
                public event NewProjectHandler NewProjectEvent;
                public event OpenProjectHandler OpenProjectEvent;
-               public event CloseOpenendProjectHandler CloseOpenedProjectEvent;
                public event ImportProjectHandler ImportProjectEvent;
                public event ExportProjectHandler ExportProjectEvent;
-               public event ShowProjectStats ShowProjectStatsEvent;
+               public event QuitApplicationHandler QuitApplicationEvent;
                
-               /* Managers */
                public event ManageJobsHandler ManageJobsEvent; 
                public event ManageTeamsHandler ManageTeamsEvent;
                public event ManageCategoriesHandler ManageCategoriesEvent;
                public event ManageProjects ManageProjectsEvent;
                public event ManageDatabases ManageDatabasesEvent;
                public event EditPreferences EditPreferencesEvent;
+               public event ConvertVideoFilesHandler ConvertVideoFilesEvent;
                
-               /* Game Units events */
-               public event GameUnitHandler GameUnitEvent;
-               public event UnitChangedHandler UnitChanged;
-               public event UnitSelectedHandler UnitSelected;
-               public event UnitsDeletedHandler UnitDeleted;
-               public event UnitAddedHandler UnitAdded;
+               /* IProjectOptionsController */
+               public event SaveProjectHandler SaveProjectEvent;
+               public event CloseOpenendProjectHandler CloseOpenedProjectEvent;
+               public event ShowProjectStats ShowProjectStatsEvent;
+               public event ShowFullScreenHandler ShowFullScreenEvent;
+               public event PlaylistVisibiltyHandler PlaylistVisibilityEvent;
+               public event AnalysisWidgetsVisibilityHandler AnalysisWidgetsVisibilityEvent;
+               public event AnalysisModeChangedHandler AnalysisModeChangedEvent;
+               public event TagSubcategoriesChangedHandler TagSubcategoriesChangedEvent;
                
-               public event KeyHandler KeyPressed;
-
-               private static Project openedProject;
-               private ProjectType projectType;
-               private TimeNode selectedTimeNode;              
-
-               TimeLineWidget timeline;
-               bool gameUnitsActionVisible;
-               GameUnitsTimelineWidget guTimeline;
                IGUIToolkit guiToolKit;
-               Gtk.Window playerWindow;
-               bool detachedPlayer;
 
                #region Constructors
                public MainWindow(IGUIToolkit guiToolkit) :
@@ -114,30 +78,11 @@ namespace LongoMatch.Gui
                        Screen screen;
                        
                        this.Build();
-                       Title = Constants.SOFTWARE_NAME;
-
                        this.guiToolKit = guiToolkit;
-                       
-                       projectType = ProjectType.None;
-
-                       timeline = new TimeLineWidget();
-                       downbox.PackStart(timeline, true, true, 0);
-                       
-                       guTimeline = new GameUnitsTimelineWidget ();
-                       downbox.PackStart(guTimeline, true, true, 0);
-                       
+                       Title = Constants.SOFTWARE_NAME;
                        TagSubcategoriesAction.Active = !Config.FastTagging;
+                       projectType = ProjectType.None;
                        
-                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
-                       playercapturer.SetLogo(System.IO.Path.Combine(Config.ImagesDir,"background.png"));
-                       playercapturer.LogoMode = true;
-                       playercapturer.Tick += OnTick;
-                       playercapturer.Detach += DetachPlayer;
-
-                       playercapturer.Logo = System.IO.Path.Combine(Config.ImagesDir,"background.png");
-                       playercapturer.CaptureFinished += (sender, e) => {CloseCaptureProject();};
-                       
-                       buttonswidget.Mode = TagMode.Predifined;
                        ConnectSignals();
                        ConnectMenuSignals();
                        
@@ -152,77 +97,17 @@ namespace LongoMatch.Gui
                                       false);
                        screen = Display.Default.DefaultScreen;
                        this.Resize(screen.Width * 80 / 100, screen.Height * 80 / 100);
-                       postagger.SetMode (false);
                }
 
                #endregion
                
                #region Plubic Methods
-               public void AddPlay(Play play) {
-                       playsSelection.AddPlay(play);
-                       timeline.AddPlay(play);
-                       timeline.QueueDraw();
-               }
-               
-               public void UpdateSelectedPlay (Play play) {
-                       selectedTimeNode = play;
-                       timeline.SelectedTimeNode = play;
-                       postagger.LoadPlay (play, false);
-                       SetTagsBoxVisibility (true);
-                       notes.Play= play;
-               }
-
-               public void UpdateCategories (Categories categories) {
-                       buttonswidget.Categories = openedProject.Categories;
-               }
-               
-               public void DeletePlays (List<Play> plays) {
-                       playsSelection.RemovePlays(plays);
-                       timeline.RemovePlays(plays);
-                       timeline.QueueDraw();
-               }
-               
                public IRenderingStateBar RenderingStateBar{
                        get {
                                return renderingstatebar1;
                        }
                }
                
-               public IPlayer Player{
-                       get {
-                               return playercapturer;
-                       }
-               }
-               
-               public ICapturer Capturer{
-                       get {
-                               return playercapturer;
-                       }
-               }
-               
-               public IPlaylistWidget Playlist{
-                       get {
-                               return playlist;
-                       }
-               }
-               
-               public ITemplatesService TemplatesService {
-                       set {
-                               playsSelection.TemplatesService = value;
-                       }
-               }
-               
-               public void UpdateGameUnits (GameUnitsList gameUnits) {
-                       gameUnitsActionVisible = gameUnits != null && gameUnits.Count > 0;
-                       GameUnitsViewAction.Sensitive = gameUnitsActionVisible;
-                       if (gameUnits == null) {
-                               gameunitstaggerwidget1.Visible = false;
-                               return;
-                       }
-                       gameunitstaggerwidget1.Visible = true;
-                       gameunitstaggerwidget1.GameUnits = gameUnits;
-               }
-               
                public void AddExportEntry (string name, string shortName, Action<Project, IGUIToolkit> 
exportAction) {
                        MenuItem parent = (MenuItem) 
this.UIManager.GetWidget("/menubar1/ToolsAction/ExportProjectAction1");
                        
@@ -253,68 +138,8 @@ namespace LongoMatch.Gui
                
                private void ConnectSignals() {
                        /* Adding Handlers for each event */
-
-                       /* Connect new mark event */
-                       buttonswidget.NewMarkEvent += EmitNewTag;;
-                       buttonswidget.NewMarkStartEvent += EmitNewTagStart;
-                       buttonswidget.NewMarkStopEvent += EmitNewTagStop;
-                       timeline.NewMarkEvent += EmitNewTagAtFrame;
-
-                       /* Connect TimeNodeChanged events */
-                       timeline.TimeNodeChanged += EmitTimeNodeChanged;
-                       notes.TimeNodeChanged += EmitTimeNodeChanged;
-
-                       /* Connect TimeNodeDeleted events */
-                       playsSelection.PlaysDeleted += EmitPlaysDeleted;
-                       timeline.TimeNodeDeleted += EmitPlaysDeleted;
-
-                       /* Connect TimeNodeSelected events */
-                       playsSelection.PlaySelected += OnTimeNodeSelected;
-                       timeline.TimeNodeSelected += OnTimeNodeSelected;
-                       
-                       /* Connect TimeNodeChangedEvent */
-                       playsSelection.TimeNodeChanged += EmitTimeNodeChanged;
-
-                       /* Connect PlayCategoryChanged events */
-                       playsSelection.PlayCategoryChanged += EmitPlayCategoryChanged;
-
-                       /* Connect playlist events */
-                       playlist.PlayListNodeSelected += EmitPlayListNodeSelected;
-                       playlist.NewPlaylistEvent += EmitNewPlaylist;
-                       playlist.OpenPlaylistEvent += EmitOpenPlaylist;
-                       playlist.SavePlaylistEvent += EmitSavePlaylist;
-
-                       /* Connect PlayListNodeAdded events */
-                       playsSelection.PlayListNodeAdded += OnPlayListNodeAdded;
-                       timeline.PlayListNodeAdded += OnPlayListNodeAdded;
-
-                       /* Connect tags events */
-                       playsSelection.TagPlay += EmitTagPlay;
-                       timeline.TagPlay += EmitTagPlay;
-
-                       /* Connect SnapshotSeries events */
-                       playsSelection.SnapshotSeries += EmitSnapshotSeries;
-                       timeline.SnapshotSeries += EmitSnapshotSeries;
-
-                       playlist.RenderPlaylistEvent += EmitRenderPlaylist;
-                       playsSelection.RenderPlaylist += EmitRenderPlaylist;
-                       timeline.RenderPlaylist += EmitRenderPlaylist;
-                       
                        renderingstatebar1.ManageJobs += (e, o) => {EmitManageJobs();};
-                       
                        openAction.Activated += (sender, e) => {EmitSaveProject();};
-                       
-                       /* Game Units event */
-                       gameunitstaggerwidget1.GameUnitEvent += EmitGameUnitEvent;
-                       guTimeline.UnitAdded += EmitUnitAdded;;
-                       guTimeline.UnitDeleted += EmitUnitDeleted;
-                       guTimeline.UnitSelected += EmitUnitSelected;
-                       guTimeline.UnitChanged += EmitUnitChanged;
-                       
-                       playercapturer.Error += OnMultimediaError;
-                       playercapturer.SegmentClosedEvent += OnSegmentClosedEvent;
-                       
-                       KeyPressEvent += (o, args) => (EmitKeyPressed(o, (int)args.Event.Key, 
(int)args.Event.State));
                }
                
                private void ConnectMenuSignals() {
@@ -330,142 +155,22 @@ namespace LongoMatch.Gui
                        ShowProjectStatsAction.Activated += (sender, e) => {EmitShowProjectStats();}; 
                }
                
-               void DetachPlayer (bool detach) {
-                       if (detach == detachedPlayer)
-                               return;
-                               
-                       detachedPlayer = detach;
-                       
-                       if (detach) {
-                               EventBox box;
-                               Log.Debug("Detaching player");
-                               
-                               playerWindow = new Gtk.Window(Constants.SOFTWARE_NAME);
-                               playerWindow.Icon = Stetic.IconLoader.LoadIcon(this, "longomatch", 
IconSize.Button);
-                               playerWindow.DeleteEvent += (o, args) => DetachPlayer(false);
-                               box = new EventBox();
-                               
-                               box.KeyPressEvent += (o, args) => OnKeyPressEvent(args.Event);
-                               playerWindow.Add(box);
-                               
-                               box.Show();
-                               playerWindow.Show();
-                               
-                               playercapturer.Reparent(box);
-                               buttonswidget.Visible = true;
-                               timeline.Visible = true;
-                               if (Config.UseGameUnits) {
-                                       guTimeline.Visible = true;
-                                       gameunitstaggerwidget1.Visible = true;
-                               }
-                               videowidgetsbox.Visible = false;
-                       } else {
-                               ToggleAction action;
-                               
-                               Log.Debug("Attaching player again");
-                               videowidgetsbox.Visible = true;
-                               playercapturer.Reparent(this.videowidgetsbox);
-                               playerWindow.Destroy();
-                               
-                               if (ManualTaggingViewAction.Active)
-                                       action = ManualTaggingViewAction;
-                               else if (TimelineViewAction.Active)
-                                       action = TimelineViewAction;
-                               else if (GameUnitsViewAction.Active)
-                                       action = GameUnitsViewAction;
-                               else
-                                       action = TaggingViewAction;
-                               OnViewToggled(action, new EventArgs());
-                       }
-                       playercapturer.Detached = detach;
-               }
-
                public void SetProject(Project project, ProjectType projectType, CaptureSettings props, 
PlaysFilter filter)
                {
-                       bool isLive = false;
-                       
-                       /* Update tabs labels */
-                       var desc = project.Description;
-                       
                        ExportProjectAction1.Sensitive = true;
                        
                        if(projectType == ProjectType.FileProject) {
                                Title = System.IO.Path.GetFileNameWithoutExtension(desc.File.FilePath) +
                                        " - " + Constants.SOFTWARE_NAME;
-                               playercapturer.LogoMode = false;
-                               timeline.SetProject (project, filter);
-                               guTimeline.Project = project;
-
                        } else {
                                Title = Constants.SOFTWARE_NAME;
-                               isLive = true;
-                               if(projectType == ProjectType.FakeCaptureProject) {
-                                       playercapturer.Type = CapturerType.Fake;
-                                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Capturer;
-                               } else {
-                                       playercapturer.Mode = 
PlayerCapturerBin.PlayerOperationMode.PreviewCapturer;
-                               }
                        }
-                       
-                       openedProject = project;
-                       this.projectType = projectType;
-                       
-                       filter.FilterUpdated += OnFilterUpdated;
-                       playsSelection.SetProject(project, isLive, filter);
-                       buttonswidget.Categories = project.Categories;
-                       MakeActionsSensitive(true,projectType);
-                       postagger.LoadBackgrounds (openedProject.Categories.FieldBackground,
-                                                  openedProject.Categories.HalfFieldBackground,
-                                                  openedProject.Categories.GoalBackground);
-                       ShowWidgets();
+                       MakeActionsSensitive(true, projectType);
                }
                
-               void SetPlaylistVisibility (bool visible) {
-                       if (visible) {
-                               righthbox.Visible = true;
-                               playlist.Visible = true;
-                       } else {
-                               playlist.Visible = false;
-                               if (!tagsvbox.Visible)
-                                       righthbox.Visible = false;
-                       }
-               }
-               
-               void SetTagsBoxVisibility (bool visible) {
-                       if (visible) {
-                               righthbox.Visible = true;
-                               tagsvbox.Visible = true;
-                       } else {
-                               tagsvbox.Visible = false;
-                               if (!playlist.Visible)
-                                       righthbox.Visible = false;
-                       }
-               }
-               
-               private void CloseCaptureProject() {
-                       if(projectType == ProjectType.CaptureProject ||
-                          projectType == ProjectType.URICaptureProject) {
-                               playercapturer.Close();
-                               playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
-                               EmitSaveProject();
-                       } else if(projectType == ProjectType.FakeCaptureProject) {
-                               EmitCloseOpenedProject(true);
-                       }
-               }
-
                private void ResetGUI() {
-                       bool playlistVisible = playlist.Visible;
                        Title = Constants.SOFTWARE_NAME;
-                       playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
-                       playercapturer.LogoMode = true;
-                       ClearWidgets();
-                       HideWidgets();
-                       SetPlaylistVisibility (playlistVisible);
-                       SetTagsBoxVisibility (false);
-                       selectedTimeNode = null;
                        MakeActionsSensitive(false, projectType);
-                       if (detachedPlayer)
-                               DetachPlayer(false);
                }
 
                private void MakeActionsSensitive(bool sensitive, ProjectType projectType) {
@@ -481,72 +186,6 @@ namespace LongoMatch.Gui
                        SaveProjectAction.Sensitive = sensitive2;
                }
 
-               private void ShowWidgets() {
-                       leftbox.Show();
-                       if(TaggingViewAction.Active || ManualTaggingViewAction.Active) {
-                               buttonswidget.Show();
-                               gameunitstaggerwidget1.Show();
-                       } else if (TimelineViewAction.Active) {
-                               timeline.Show();
-                       } else if (GameUnitsViewAction.Active) {
-                               gameunitstaggerwidget1.Show();
-                               guTimeline.Show();
-                       }
-               }
-
-               private void HideWidgets() {
-                       leftbox.Hide();
-                       SetTagsBoxVisibility (false);
-                       buttonswidget.Hide();
-                       timeline.Hide();
-                       gameunitstaggerwidget1.Hide();
-                       guTimeline.Hide();
-               }
-
-               private void ClearWidgets() {
-                       buttonswidget.Categories = null;
-                       playsSelection.Clear();
-               }
-
-               private bool PromptCloseProject() {
-                       int res;
-                       EndCaptureDialog dialog;
-
-                       if(openedProject == null)
-                               return true;
-
-                       if(projectType == ProjectType.FileProject) {
-                               MessageDialog md = new MessageDialog(this, DialogFlags.Modal,
-                                                                    MessageType.Question, 
ButtonsType.OkCancel,
-                                                                    Catalog.GetString("Do you want to close 
the current project?"));
-                               res = md.Run();
-                               md.Destroy();
-                               if(res == (int)ResponseType.Ok) {
-                                       EmitCloseOpenedProject(true);
-                                       return true;
-                               }
-                               return false;
-                       }
-
-                       /* Capture project */
-                       dialog = new EndCaptureDialog();
-                       dialog.TransientFor = (Gtk.Window)this.Toplevel;
-                       res = dialog.Run();
-                       dialog.Destroy();
-
-                       /* Close project wihtout saving */
-                       if(res == (int)EndCaptureResponse.Quit) {
-                               EmitCloseOpenedProject(false);
-                               return true;
-                       } else if(res == (int)EndCaptureResponse.Save) {
-                               /* Close and save project */
-                               EmitCloseOpenedProject(true);
-                               return true;
-                       } else
-                               /* Continue with the current project */
-                               return false;
-               }
-
                private void CloseAndQuit() {
                        if(!PromptCloseProject())
                                return;
@@ -561,16 +200,14 @@ namespace LongoMatch.Gui
                #region File
                protected virtual void OnNewActivated(object sender, System.EventArgs e)
                {
-                       if(!PromptCloseProject())
-                               return;
-                       EmitNewProject();
+                       if (NewProjectEvent != null)
+                               NewProjectEvent();
                }
 
                protected virtual void OnOpenActivated(object sender, System.EventArgs e)
                {
-                       if(!PromptCloseProject())
-                               return;
-                       EmitOpenProject();
+                       if(OpenProjectEvent != null)
+                               OpenProjectEvent();
                }
                #endregion
                
@@ -597,42 +234,26 @@ namespace LongoMatch.Gui
                #region View
                protected void OnTagSubcategoriesActionToggled (object sender, System.EventArgs e)
                {
-                       Config.FastTagging = !TagSubcategoriesAction.Active;
+                       if (TagSubcategoriesChangedEvent != null)
+                               TagSubcategoriesChangedEvent (!TagSubcategoriesAction.Active);
                }
 
                protected virtual void OnFullScreenActionToggled(object sender, System.EventArgs e)
                {
-                       playercapturer.FullScreen = (sender as Gtk.ToggleAction).Active;
+                       if (ShowFullScreenEvent != null)
+                               ShowFullScreenEvent ((sender as Gtk.ToggleAction).Active);
                }
 
                protected virtual void OnPlaylistActionToggled(object sender, System.EventArgs e)
                {
-                       bool visible = (sender as Gtk.ToggleAction).Active;
-                       SetPlaylistVisibility (visible);
-                       playsSelection.PlayListLoaded=visible;
+                       if (PlaylistVisibilityEvent != null)
+                               PlaylistVisibilityEvent ((sender as Gtk.ToggleAction).Active);
                }
 
                protected virtual void OnHideAllWidgetsActionToggled(object sender, System.EventArgs e)
                {
-                       ToggleAction action = sender as ToggleAction;
-                       
-                       if(openedProject == null)
-                               return;
-                       
-                       leftbox.Visible = !action.Active;
-                       timeline.Visible = !action.Active && TimelineViewAction.Active;
-                       buttonswidget.Visible = !action.Active &&
-                               (TaggingViewAction.Active || ManualTaggingViewAction.Active);
-                       if (Config.UseGameUnits) {
-                               guTimeline.Visible = !action.Visible && GameUnitsViewAction.Active;
-                               gameunitstaggerwidget1.Visible = !action.Active && 
(GameUnitsViewAction.Active || 
-                                       TaggingViewAction.Active || ManualTaggingViewAction.Active);
-                       }
-                       if(action.Active) {
-                               SetTagsBoxVisibility (false);
-                       } else {
-                               if (selectedTimeNode != null)
-                                       SetTagsBoxVisibility (true);
+                       if (AnalysisWidgetsVisibilityEvent != null) {
+                               AnalysisWidgetsVisibilityEvent ((sender as ToggleAction).Active);
                        }
                }
 
@@ -655,6 +276,7 @@ namespace LongoMatch.Gui
                                buttonswidget.Mode = TagMode.Predifined;
                }
                #endregion
+               
                #region Help
                protected virtual void OnHelpAction1Activated(object sender, System.EventArgs e)
                {
@@ -681,109 +303,6 @@ namespace LongoMatch.Gui
                
                #endregion
 
-               protected override bool OnKeyPressEvent(EventKey evnt)
-               {
-                       Gdk.Key key = evnt.Key;
-                       Gdk.ModifierType modifier = evnt.State;
-                       bool ret;
-
-                       ret = base.OnKeyPressEvent(evnt);
-
-                       if(openedProject == null && !playercapturer.Opened)
-                               return ret;
-
-                       if(projectType != ProjectType.CaptureProject &&
-                          projectType != ProjectType.URICaptureProject &&
-                          projectType != ProjectType.FakeCaptureProject) {
-                               switch(key) {
-                               case Constants.SEEK_FORWARD:
-                                       if(modifier == Constants.STEP)
-                                               playercapturer.StepForward();
-                                       else
-                                               playercapturer.SeekToNextFrame(selectedTimeNode != null);
-                                       break;
-                               case Constants.SEEK_BACKWARD:
-                                       if(modifier == Constants.STEP)
-                                               playercapturer.StepBackward();
-                                       else
-                                               playercapturer.SeekToPreviousFrame(selectedTimeNode != null);
-                                       break;
-                               case Constants.FRAMERATE_UP:
-                                       playercapturer.FramerateUp();
-                                       break;
-                               case Constants.FRAMERATE_DOWN:
-                                       playercapturer.FramerateDown();
-                                       break;
-                               case Constants.TOGGLE_PLAY:
-                                       playercapturer.TogglePlay();
-                                       break;
-                               }
-                       } else {
-                               switch(key) {
-                               case Constants.TOGGLE_PLAY:
-                                       playercapturer.TogglePause();
-                                       break;
-                               }
-                       }
-                       return ret;
-               }
-
-               protected virtual void OnTimeNodeSelected(Play play)
-               {
-                       SetTagsBoxVisibility (true);
-                       if (PlaySelectedEvent != null)
-                               PlaySelectedEvent(play);
-               }
-
-               protected virtual void OnSegmentClosedEvent()
-               {
-                       SetTagsBoxVisibility (false);
-                       timeline.SelectedTimeNode = null;
-                       selectedTimeNode = null;
-               }
-               
-               protected virtual void OnTick(object o, long currentTime, long streamLength,
-                       float currentPosition, bool seekable)
-               {
-                       if(currentTime != 0 && timeline != null && openedProject != null) {
-                               uint frame = (uint)(currentTime * openedProject.Description.File.Fps / 1000);
-                               timeline.CurrentFrame = frame;
-                               guTimeline.CurrentFrame = frame;
-                       }
-                       gameunitstaggerwidget1.CurrentTime = new Time{MSeconds = (int)currentTime};
-               }
-               
-               protected virtual void OnUpdate(Version version, string URL) {
-                       LongoMatch.Gui.Dialog.UpdateDialog updater = new LongoMatch.Gui.Dialog.UpdateDialog();
-                       updater.Fill(version, URL);
-                       updater.TransientFor = this;
-                       updater.Run();
-                       updater.Destroy();
-               }
-
-               protected virtual void OnDrawingToolActionToggled(object sender, System.EventArgs e)
-               {
-                       drawingtoolbox1.Visible = DrawingToolAction.Active;
-                       drawingtoolbox1.DrawingVisibility = DrawingToolAction.Active;
-               }
-
-               protected override bool OnDeleteEvent(Gdk.Event evnt)
-               {
-                       CloseAndQuit();
-                       return true;
-               }
-
-               protected virtual void OnMultimediaError(object o, string message)
-               {
-                       MessagesHelpers.ErrorMessage (this,
-                               Catalog.GetString("The following error happened and" +
-                               " the current project will be closed:")+"\n" + message);
-                       EmitCloseOpenedProject(true);
-               }
-               
-               protected virtual void OnFilterUpdated()
-               {
-               }
                #endregion
                
                #region Events
@@ -794,93 +313,14 @@ namespace LongoMatch.Gui
                                EditPreferencesEvent();
                }
                
-               private void EmitPlaySelected(Play play)
-               {
-                       if (PlaySelectedEvent != null)
-                               PlaySelectedEvent(play);
-               }
-
-               private void EmitTimeNodeChanged(TimeNode tNode, object val)
-               {
-                       if (TimeNodeChanged != null)
-                               TimeNodeChanged(tNode, val);
-               }
-
-               private void EmitPlaysDeleted(List<Play> plays)
-               {
-                       if (PlaysDeletedEvent != null)
-                               PlaysDeletedEvent(plays);
-               }
-               
-               protected virtual void EmitPlayCategoryChanged(Play play, Category cat)
-               {
-                       if(PlayCategoryChanged != null)
-                               PlayCategoryChanged(play, cat);
-               }
-
-               private void OnPlayListNodeAdded(Play play)
-               {
-                       if (PlayListNodeAddedEvent != null)
-                               PlayListNodeAddedEvent(play);
-               }
-
-               private void EmitPlayListNodeSelected(PlayListPlay plNode)
-               {
-                       if (PlayListNodeSelectedEvent != null)
-                               PlayListNodeSelectedEvent(plNode);
-               }
-
-               private void EmitSnapshotSeries(Play play) {
-                       if (SnapshotSeriesEvent != null)
-                               SnapshotSeriesEvent (play);
-               }
-
-               private void EmitNewTagAtFrame(Category category, int frame) {
-                       if (NewTagAtFrameEvent != null)
-                               NewTagAtFrameEvent(category, frame);
-               }
-
-               private void EmitNewTag(Category category) {
-                       if (NewTagEvent != null)
-                               NewTagEvent(category);
-               }
-
-               private void EmitNewTagStart() {
-                       if (NewTagStartEvent != null)
-                               NewTagStartEvent ();
-               }
-
-               private void EmitNewTagStop(Category category) {
-                       if (NewTagStopEvent != null)
-                               NewTagStopEvent (category);
-               }
-               
-               private void EmitRenderPlaylist(IPlayList playlist) {
-                       if (RenderPlaylistEvent != null)
-                               RenderPlaylistEvent(playlist);
-               }
-               
-               private void EmitTagPlay(Play play) {
-                       if (TagPlayEvent != null)
-                               TagPlayEvent (play);
-               }
-               
                private void EmitSaveProject() {
                        if (SaveProjectEvent != null)
                                SaveProjectEvent(openedProject, projectType);
                }
                
-               private void EmitNewProject() {
-                       if (NewProjectEvent != null)
-                               NewProjectEvent();
-               }
-
                private void EmitCloseOpenedProject(bool save) {
                        if (CloseOpenedProjectEvent != null)
                                CloseOpenedProjectEvent(save);
-                       openedProject = null;
-                       projectType = ProjectType.None;
-                       ResetGUI();
                }
                
                private void EmitImportProject(string name, string filterName, string filter,
@@ -889,11 +329,6 @@ namespace LongoMatch.Gui
                                ImportProjectEvent(name, filterName, filter, func, requiresNewFile);
                }
                
-               private void EmitOpenProject() {
-                       if(OpenProjectEvent != null)
-                               OpenProjectEvent();
-               }
-               
                private void EmitExportProject() {
                        if(ExportProjectEvent != null)
                                ExportProjectEvent();
@@ -925,51 +360,6 @@ namespace LongoMatch.Gui
                        if (ManageDatabasesEvent != null)
                                ManageDatabasesEvent();
                }
-               
-               private void EmitNewPlaylist() {
-                       if (NewPlaylistEvent != null)
-                               NewPlaylistEvent();
-               }
-               
-               private void EmitOpenPlaylist() {
-                       if (OpenPlaylistEvent != null)
-                               OpenPlaylistEvent();
-               }
-               
-               private void EmitSavePlaylist() {
-                       if (SavePlaylistEvent != null)
-                               SavePlaylistEvent();
-               }
-               
-               private void EmitGameUnitEvent(GameUnit gameUnit, GameUnitEventType eType) {
-                       if (GameUnitEvent != null)
-                               GameUnitEvent(gameUnit, eType);
-               }
-               
-               private void EmitUnitAdded(GameUnit gameUnit, int frame) {
-                       if (UnitAdded != null)
-                               UnitAdded(gameUnit, frame);
-               }
-               
-               private void EmitUnitDeleted(GameUnit gameUnit, List<TimelineNode> units) {
-                       if (UnitDeleted != null)
-                               UnitDeleted(gameUnit, units);
-               }
-               
-               private void EmitUnitSelected(GameUnit gameUnit, TimelineNode unit) {
-                       if (UnitSelected != null)
-                               UnitSelected(gameUnit, unit);
-               }
-               
-               private void EmitUnitChanged(GameUnit gameUnit, TimelineNode unit, Time time) {
-                       if (UnitChanged != null)
-                               UnitChanged(gameUnit, unit, time);
-               }
-               
-               private void EmitKeyPressed(object sender, int key, int modifier) {
-                       if (KeyPressed != null)
-                               KeyPressed(sender, key, modifier);
-               }
                #endregion
        }
 }
diff --git a/LongoMatch.GUI/LongoMatch.GUI.mdp b/LongoMatch.GUI/LongoMatch.GUI.mdp
index b51c721..d3441b4 100644
--- a/LongoMatch.GUI/LongoMatch.GUI.mdp
+++ b/LongoMatch.GUI/LongoMatch.GUI.mdp
@@ -193,6 +193,8 @@
     <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.StatsViewer.cs" />
     <File subtype="Code" buildaction="Compile" name="Gui/Component/Stats/GameViewer.cs" />
     <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.GameViewer.cs" />
+    <File subtype="Code" buildaction="Compile" name="Gui/Component/AnalysisComponent.cs" />
+    <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs" 
/>
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="atk-sharp, Version=2.12.0.0, Culture=neutral, 
PublicKeyToken=35e10195dab3c99f" />
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs
new file mode 100644
index 0000000..af1ac72
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs
@@ -0,0 +1,7 @@
+
+namespace LongoMatch.Gui.Component
+{
+       public partial class AnalysisComponent
+       {
+       }
+}
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.SubcategoiesTagsEditor.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.SubcategoiesTagsEditor.cs
new file mode 100644
index 0000000..01e9e0a
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.SubcategoiesTagsEditor.cs
@@ -0,0 +1,197 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace LongoMatch.Gui.Component
+{
+       public partial class SubcategoiesTagsEditor
+       {
+               private global::Gtk.VBox vbox2;
+               private global::Gtk.Table table1;
+               private global::Gtk.CheckButton fastcheckbutton;
+               private global::Gtk.Label label1;
+               private global::Gtk.CheckButton multicheckbutton;
+               private global::Gtk.Entry nameentry;
+               private global::Gtk.Frame frame1;
+               private global::Gtk.Alignment GtkAlignment2;
+               private global::Gtk.VBox vbox3;
+               private global::Gtk.ScrolledWindow scrolledwindow1;
+               private global::Gtk.VBox tagsbox;
+               private global::Gtk.HBox hbox1;
+               private global::Gtk.Entry tagentry;
+               private global::Gtk.Button addtagbutton;
+               private global::Gtk.Button deletebutton;
+               private global::Gtk.Label GtkLabel4;
+               
+               protected virtual void Build ()
+               {
+                       global::Stetic.Gui.Initialize (this);
+                       // Widget LongoMatch.Gui.Component.SubcategoiesTagsEditor
+                       global::Stetic.BinContainer.Attach (this);
+                       this.Name = "LongoMatch.Gui.Component.SubcategoiesTagsEditor";
+                       // Container child 
LongoMatch.Gui.Component.SubcategoiesTagsEditor.Gtk.Container+ContainerChild
+                       this.vbox2 = new global::Gtk.VBox ();
+                       this.vbox2.Name = "vbox2";
+                       this.vbox2.Spacing = 6;
+                       // Container child vbox2.Gtk.Box+BoxChild
+                       this.table1 = new global::Gtk.Table (((uint)(2)), ((uint)(2)), false);
+                       this.table1.Name = "table1";
+                       this.table1.RowSpacing = ((uint)(6));
+                       this.table1.ColumnSpacing = ((uint)(6));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.fastcheckbutton = new global::Gtk.CheckButton ();
+                       this.fastcheckbutton.TooltipMarkup = "When this option is selected, the subcategory 
can be tagged right after creating a new play";
+                       this.fastcheckbutton.CanFocus = true;
+                       this.fastcheckbutton.Name = "fastcheckbutton";
+                       this.fastcheckbutton.Label = global::Mono.Unix.Catalog.GetString ("Quick tag");
+                       this.fastcheckbutton.Active = true;
+                       this.fastcheckbutton.DrawIndicator = true;
+                       this.fastcheckbutton.UseUnderline = true;
+                       this.table1.Add (this.fastcheckbutton);
+                       global::Gtk.Table.TableChild w1 = ((global::Gtk.Table.TableChild)(this.table1 
[this.fastcheckbutton]));
+                       w1.TopAttach = ((uint)(1));
+                       w1.BottomAttach = ((uint)(2));
+                       w1.LeftAttach = ((uint)(1));
+                       w1.RightAttach = ((uint)(2));
+                       w1.XOptions = ((global::Gtk.AttachOptions)(4));
+                       w1.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.label1 = new global::Gtk.Label ();
+                       this.label1.Name = "label1";
+                       this.label1.LabelProp = global::Mono.Unix.Catalog.GetString ("Subcategory name:");
+                       this.table1.Add (this.label1);
+                       global::Gtk.Table.TableChild w2 = ((global::Gtk.Table.TableChild)(this.table1 
[this.label1]));
+                       w2.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.multicheckbutton = new global::Gtk.CheckButton ();
+                       this.multicheckbutton.TooltipMarkup = "This options allows you to select multiple 
tags instead of just one";
+                       this.multicheckbutton.CanFocus = true;
+                       this.multicheckbutton.Name = "multicheckbutton";
+                       this.multicheckbutton.Label = global::Mono.Unix.Catalog.GetString ("Allow multiple 
selections");
+                       this.multicheckbutton.Active = true;
+                       this.multicheckbutton.DrawIndicator = true;
+                       this.multicheckbutton.UseUnderline = true;
+                       this.table1.Add (this.multicheckbutton);
+                       global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table1 
[this.multicheckbutton]));
+                       w3.TopAttach = ((uint)(1));
+                       w3.BottomAttach = ((uint)(2));
+                       w3.XOptions = ((global::Gtk.AttachOptions)(4));
+                       w3.YOptions = ((global::Gtk.AttachOptions)(4));
+                       // Container child table1.Gtk.Table+TableChild
+                       this.nameentry = new global::Gtk.Entry ();
+                       this.nameentry.CanFocus = true;
+                       this.nameentry.Name = "nameentry";
+                       this.nameentry.Text = global::Mono.Unix.Catalog.GetString ("Goal type");
+                       this.nameentry.IsEditable = true;
+                       this.nameentry.InvisibleChar = '•';
+                       this.table1.Add (this.nameentry);
+                       global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table1 
[this.nameentry]));
+                       w4.LeftAttach = ((uint)(1));
+                       w4.RightAttach = ((uint)(2));
+                       w4.YOptions = ((global::Gtk.AttachOptions)(4));
+                       this.vbox2.Add (this.table1);
+                       global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.table1]));
+                       w5.Position = 0;
+                       w5.Expand = false;
+                       w5.Fill = false;
+                       // Container child vbox2.Gtk.Box+BoxChild
+                       this.frame1 = new global::Gtk.Frame ();
+                       this.frame1.Name = "frame1";
+                       this.frame1.ShadowType = ((global::Gtk.ShadowType)(1));
+                       // Container child frame1.Gtk.Container+ContainerChild
+                       this.GtkAlignment2 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+                       this.GtkAlignment2.Name = "GtkAlignment2";
+                       this.GtkAlignment2.LeftPadding = ((uint)(12));
+                       // Container child GtkAlignment2.Gtk.Container+ContainerChild
+                       this.vbox3 = new global::Gtk.VBox ();
+                       this.vbox3.Name = "vbox3";
+                       this.vbox3.Spacing = 6;
+                       // Container child vbox3.Gtk.Box+BoxChild
+                       this.scrolledwindow1 = new global::Gtk.ScrolledWindow ();
+                       this.scrolledwindow1.CanFocus = true;
+                       this.scrolledwindow1.Name = "scrolledwindow1";
+                       // Container child scrolledwindow1.Gtk.Container+ContainerChild
+                       global::Gtk.Viewport w6 = new global::Gtk.Viewport ();
+                       w6.ShadowType = ((global::Gtk.ShadowType)(0));
+                       // Container child GtkViewport.Gtk.Container+ContainerChild
+                       this.tagsbox = new global::Gtk.VBox ();
+                       this.tagsbox.Name = "tagsbox";
+                       this.tagsbox.Spacing = 6;
+                       w6.Add (this.tagsbox);
+                       this.scrolledwindow1.Add (w6);
+                       this.vbox3.Add (this.scrolledwindow1);
+                       global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox3 
[this.scrolledwindow1]));
+                       w9.Position = 0;
+                       // Container child vbox3.Gtk.Box+BoxChild
+                       this.hbox1 = new global::Gtk.HBox ();
+                       this.hbox1.Name = "hbox1";
+                       this.hbox1.Spacing = 6;
+                       // Container child hbox1.Gtk.Box+BoxChild
+                       this.tagentry = new global::Gtk.Entry ();
+                       this.tagentry.CanFocus = true;
+                       this.tagentry.Name = "tagentry";
+                       this.tagentry.Text = global::Mono.Unix.Catalog.GetString ("Penalty");
+                       this.tagentry.IsEditable = true;
+                       this.tagentry.InvisibleChar = '•';
+                       this.hbox1.Add (this.tagentry);
+                       global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.hbox1 
[this.tagentry]));
+                       w10.Position = 0;
+                       // Container child hbox1.Gtk.Box+BoxChild
+                       this.addtagbutton = new global::Gtk.Button ();
+                       this.addtagbutton.CanFocus = true;
+                       this.addtagbutton.Name = "addtagbutton";
+                       this.addtagbutton.UseUnderline = true;
+                       // Container child addtagbutton.Gtk.Container+ContainerChild
+                       global::Gtk.Alignment w11 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
+                       // Container child GtkAlignment.Gtk.Container+ContainerChild
+                       global::Gtk.HBox w12 = new global::Gtk.HBox ();
+                       w12.Spacing = 2;
+                       // Container child GtkHBox.Gtk.Container+ContainerChild
+                       global::Gtk.Image w13 = new global::Gtk.Image ();
+                       w13.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-add", 
global::Gtk.IconSize.Menu);
+                       w12.Add (w13);
+                       // Container child GtkHBox.Gtk.Container+ContainerChild
+                       global::Gtk.Label w15 = new global::Gtk.Label ();
+                       w15.LabelProp = global::Mono.Unix.Catalog.GetString ("Add tag");
+                       w15.UseUnderline = true;
+                       w12.Add (w15);
+                       w11.Add (w12);
+                       this.addtagbutton.Add (w11);
+                       this.hbox1.Add (this.addtagbutton);
+                       global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.hbox1 
[this.addtagbutton]));
+                       w19.Position = 1;
+                       w19.Expand = false;
+                       w19.Fill = false;
+                       this.vbox3.Add (this.hbox1);
+                       global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.hbox1]));
+                       w20.Position = 1;
+                       w20.Expand = false;
+                       w20.Fill = false;
+                       // Container child vbox3.Gtk.Box+BoxChild
+                       this.deletebutton = new global::Gtk.Button ();
+                       this.deletebutton.CanFocus = true;
+                       this.deletebutton.Name = "deletebutton";
+                       this.deletebutton.UseStock = true;
+                       this.deletebutton.UseUnderline = true;
+                       this.deletebutton.Label = "gtk-remove";
+                       this.vbox3.Add (this.deletebutton);
+                       global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.vbox3 
[this.deletebutton]));
+                       w21.Position = 2;
+                       w21.Expand = false;
+                       w21.Fill = false;
+                       this.GtkAlignment2.Add (this.vbox3);
+                       this.frame1.Add (this.GtkAlignment2);
+                       this.GtkLabel4 = new global::Gtk.Label ();
+                       this.GtkLabel4.Name = "GtkLabel4";
+                       this.GtkLabel4.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Tags</b>");
+                       this.GtkLabel4.UseMarkup = true;
+                       this.frame1.LabelWidget = this.GtkLabel4;
+                       this.vbox2.Add (this.frame1);
+                       global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.frame1]));
+                       w24.Position = 1;
+                       this.Add (this.vbox2);
+                       if ((this.Child != null)) {
+                               this.Child.ShowAll ();
+                       }
+                       this.Hide ();
+               }
+       }
+}
diff --git a/LongoMatch.GUI/gtk-gui/gui.stetic b/LongoMatch.GUI/gtk-gui/gui.stetic
index 3d28dcf..ad3e5c2 100644
--- a/LongoMatch.GUI/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI/gtk-gui/gui.stetic
@@ -1915,194 +1915,7 @@
           </packing>
         </child>
         <child>
-          <widget class="Gtk.HPaned" id="hpaned">
-            <property name="MemberName" />
-            <property name="CanFocus">True</property>
-            <property name="Position">243</property>
-            <child>
-              <widget class="Gtk.VBox" id="leftbox">
-                <property name="MemberName" />
-                <property name="Visible">False</property>
-                <property name="Spacing">6</property>
-                <child>
-                  <widget class="LongoMatch.Gui.Component.PlaysSelectionWidget" id="playsSelection">
-                    <property name="MemberName" />
-                    <property name="Events">ButtonPressMask</property>
-                  </widget>
-                  <packing>
-                    <property name="Position">0</property>
-                    <property name="AutoSize">True</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="Resize">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="Gtk.HPaned" id="hpaned1">
-                <property name="MemberName" />
-                <property name="CanFocus">True</property>
-                <property name="Position">952</property>
-                <child>
-                  <widget class="Gtk.VBox" id="downbox">
-                    <property name="MemberName" />
-                    <property name="Spacing">6</property>
-                    <child>
-                      <widget class="Gtk.HBox" id="videowidgetsbox">
-                        <property name="MemberName" />
-                        <property name="Spacing">6</property>
-                        <child>
-                          <widget class="LongoMatch.Gui.Component.DrawingToolBox" id="drawingtoolbox1">
-                            <property name="MemberName" />
-                            <property name="Visible">False</property>
-                            <property name="Events">ButtonPressMask</property>
-                          </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="LongoMatch.Gui.PlayerCapturerBin" id="playercapturer">
-                            <property name="MemberName" />
-                            <property name="Events">ButtonPressMask</property>
-                            <property name="Detached">False</property>
-                            <property name="ExpandLogo">False</property>
-                            <property name="Rate">0</property>
-                          </widget>
-                          <packing>
-                            <property name="Position">1</property>
-                            <property name="AutoSize">False</property>
-                          </packing>
-                        </child>
-                      </widget>
-                      <packing>
-                        <property name="Position">0</property>
-                        <property name="AutoSize">False</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="LongoMatch.Gui.Component.ButtonsWidget" id="buttonswidget">
-                        <property name="MemberName" />
-                        <property name="Visible">False</property>
-                        <property name="Events">ButtonPressMask</property>
-                      </widget>
-                      <packing>
-                        <property name="Position">1</property>
-                        <property name="AutoSize">False</property>
-                        <property name="Expand">False</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="LongoMatch.Gui.Component.GameUnitsTagger" id="gameunitstaggerwidget1">
-                        <property name="MemberName" />
-                        <property name="Events">ButtonPressMask</property>
-                      </widget>
-                      <packing>
-                        <property name="Position">2</property>
-                        <property name="AutoSize">False</property>
-                        <property name="Expand">False</property>
-                      </packing>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="Resize">False</property>
-                    <property name="Shrink">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="Gtk.HBox" id="righthbox">
-                    <property name="MemberName" />
-                    <property name="WidthRequest">100</property>
-                    <property name="Visible">False</property>
-                    <property name="Spacing">6</property>
-                    <child>
-                      <widget class="Gtk.VBox" id="tagsvbox">
-                        <property name="MemberName" />
-                        <property name="WidthRequest">100</property>
-                        <property name="Visible">False</property>
-                        <property name="Spacing">6</property>
-                        <child>
-                          <widget class="LongoMatch.Gui.Component.PlaysCoordinatesTagger" id="postagger">
-                            <property name="MemberName" />
-                            <property name="Events">ButtonPressMask</property>
-                          </widget>
-                          <packing>
-                            <property name="Position">0</property>
-                            <property name="AutoSize">True</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="Gtk.Frame" id="notesframe">
-                            <property name="MemberName" />
-                            <property name="ShadowType">None</property>
-                            <child>
-                              <widget class="Gtk.Alignment" id="GtkAlignment22">
-                                <property name="MemberName" />
-                                <property name="Xalign">0</property>
-                                <property name="Yalign">0</property>
-                                <property name="LeftPadding">12</property>
-                                <child>
-                                  <widget class="LongoMatch.Gui.Component.NotesWidget" id="notes">
-                                    <property name="MemberName" />
-                                    <property name="Events">ButtonPressMask</property>
-                                  </widget>
-                                </child>
-                              </widget>
-                            </child>
-                            <child>
-                              <widget class="Gtk.Label" id="GtkLabel31">
-                                <property name="MemberName" />
-                                <property name="LabelProp" 
translatable="yes">&lt;b&gt;Notes&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">False</property>
-                          </packing>
-                        </child>
-                      </widget>
-                      <packing>
-                        <property name="Position">0</property>
-                        <property name="AutoSize">False</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="LongoMatch.Gui.Component.PlayListWidget" id="playlist">
-                        <property name="MemberName" />
-                        <property name="WidthRequest">100</property>
-                        <property name="Visible">False</property>
-                        <property name="Events">ButtonPressMask</property>
-                      </widget>
-                      <packing>
-                        <property name="Position">1</property>
-                        <property name="AutoSize">False</property>
-                      </packing>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="Resize">False</property>
-                    <property name="Shrink">False</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="Shrink">False</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="Position">1</property>
-            <property name="AutoSize">False</property>
-          </packing>
+          <placeholder />
         </child>
         <child>
           <widget class="Gtk.Statusbar" id="statusbar1">
@@ -9235,4 +9048,194 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
       </widget>
     </child>
   </widget>
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.AnalysisComponent" design-size="1524 648">
+    <property name="MemberName" />
+    <property name="Visible">False</property>
+    <child>
+      <widget class="Gtk.HPaned" id="hpaned">
+        <property name="MemberName" />
+        <property name="CanFocus">True</property>
+        <property name="Position">233</property>
+        <child>
+          <widget class="Gtk.VBox" id="leftbox">
+            <property name="MemberName" />
+            <property name="Visible">False</property>
+            <property name="Spacing">6</property>
+            <child>
+              <widget class="LongoMatch.Gui.Component.PlaysSelectionWidget" id="playsSelection">
+                <property name="MemberName" />
+                <property name="Events">ButtonPressMask</property>
+              </widget>
+              <packing>
+                <property name="Position">0</property>
+                <property name="AutoSize">True</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Resize">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="Gtk.HPaned" id="hpaned1">
+            <property name="MemberName" />
+            <property name="CanFocus">True</property>
+            <property name="Position">1160</property>
+            <child>
+              <widget class="Gtk.VBox" id="downbox">
+                <property name="MemberName" />
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.HBox" id="videowidgetsbox">
+                    <property name="MemberName" />
+                    <property name="Spacing">6</property>
+                    <child>
+                      <widget class="LongoMatch.Gui.Component.DrawingToolBox" id="drawingtoolbox1">
+                        <property name="MemberName" />
+                        <property name="Visible">False</property>
+                        <property name="Events">ButtonPressMask</property>
+                      </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="LongoMatch.Gui.PlayerCapturerBin" id="playercapturer">
+                        <property name="MemberName" />
+                        <property name="Events">ButtonPressMask</property>
+                        <property name="Detached">False</property>
+                        <property name="ExpandLogo">False</property>
+                        <property name="Rate">0</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">1</property>
+                        <property name="AutoSize">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="LongoMatch.Gui.Component.ButtonsWidget" id="buttonswidget">
+                    <property name="MemberName" />
+                    <property name="Visible">False</property>
+                    <property name="Events">ButtonPressMask</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="LongoMatch.Gui.Component.GameUnitsTagger" id="gameunitstaggerwidget1">
+                    <property name="MemberName" />
+                    <property name="Events">ButtonPressMask</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">2</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Expand">False</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Resize">False</property>
+                <property name="Shrink">False</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.HBox" id="righthbox">
+                <property name="MemberName" />
+                <property name="WidthRequest">100</property>
+                <property name="Visible">False</property>
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.VBox" id="tagsvbox">
+                    <property name="MemberName" />
+                    <property name="WidthRequest">100</property>
+                    <property name="Visible">False</property>
+                    <property name="Spacing">6</property>
+                    <child>
+                      <widget class="LongoMatch.Gui.Component.PlaysCoordinatesTagger" id="postagger">
+                        <property name="MemberName" />
+                        <property name="Events">ButtonPressMask</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">0</property>
+                        <property name="AutoSize">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.Frame" id="notesframe">
+                        <property name="MemberName" />
+                        <property name="ShadowType">None</property>
+                        <child>
+                          <widget class="Gtk.Alignment" id="GtkAlignment22">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                            <property name="Yalign">0</property>
+                            <property name="LeftPadding">12</property>
+                            <child>
+                              <widget class="LongoMatch.Gui.Component.NotesWidget" id="notes">
+                                <property name="MemberName" />
+                                <property name="Events">ButtonPressMask</property>
+                              </widget>
+                            </child>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Label" id="GtkLabel31">
+                            <property name="MemberName" />
+                            <property name="LabelProp" translatable="yes">&lt;b&gt;Notes&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">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="LongoMatch.Gui.Component.PlayListWidget" id="playlist">
+                    <property name="MemberName" />
+                    <property name="WidthRequest">100</property>
+                    <property name="Visible">False</property>
+                    <property name="Events">ButtonPressMask</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">False</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="Resize">False</property>
+                <property name="Shrink">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Shrink">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 c1e2f0b..d4204a3 100644
--- a/LongoMatch.GUI/gtk-gui/objects.xml
+++ b/LongoMatch.GUI/gtk-gui/objects.xml
@@ -419,4 +419,33 @@
     <itemgroups />
     <signals />
   </object>
+  <object type="LongoMatch.Gui.Component.AnalysisComponent" palette-category="General" 
allow-children="false" base-type="Gtk.Bin">
+    <itemgroups />
+    <signals>
+      <itemgroup label="IAnalysisWindow Signals">
+        <signal name="NewTagEvent" />
+        <signal name="NewTagStartEvent" />
+        <signal name="NewTagStopEvent" />
+        <signal name="PlaySelectedEvent" />
+        <signal name="NewTagAtFrameEvent" />
+        <signal name="TagPlayEvent" />
+        <signal name="PlaysDeletedEvent" />
+        <signal name="TimeNodeChanged" />
+        <signal name="PlayCategoryChanged" />
+        <signal name="RenderPlaylistEvent" />
+        <signal name="PlayListNodeAddedEvent" />
+        <signal name="PlayListNodeSelectedEvent" />
+        <signal name="OpenPlaylistEvent" />
+        <signal name="NewPlaylistEvent" />
+        <signal name="SavePlaylistEvent" />
+        <signal name="SnapshotSeriesEvent" />
+        <signal name="GameUnitEvent" />
+        <signal name="UnitChanged" />
+        <signal name="UnitSelected" />
+        <signal name="UnitDeleted" />
+        <signal name="UnitAdded" />
+        <signal name="KeyPressed" />
+      </itemgroup>
+    </signals>
+  </object>
 </objects>
\ No newline at end of file
diff --git a/LongoMatch.Services/LongoMatch.Services.mdp b/LongoMatch.Services/LongoMatch.Services.mdp
index aa92697..27e459d 100644
--- a/LongoMatch.Services/LongoMatch.Services.mdp
+++ b/LongoMatch.Services/LongoMatch.Services.mdp
@@ -31,6 +31,7 @@
     <File subtype="Directory" buildaction="Compile" name="Services" />
     <File subtype="Code" buildaction="Compile" name="Services/DataBaseManager.cs" />
     <File subtype="Code" buildaction="Compile" name="Services/MigrationsManager.cs" />
+    <File subtype="Code" buildaction="Compile" name="Services/ProjectOptionsManager.cs" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089" />
diff --git a/LongoMatch.Services/Services/Core.cs b/LongoMatch.Services/Services/Core.cs
index 6925b06..cc9d89d 100644
--- a/LongoMatch.Services/Services/Core.cs
+++ b/LongoMatch.Services/Services/Core.cs
@@ -39,7 +39,7 @@ namespace LongoMatch.Services
                static GameUnitsManager guManager;
                static PlaylistManager plManager;
                static RenderingJobsManager videoRenderer;
-               static IMainWindow mainWindow;
+               static IAnalysisWindow mainWindow;
                static IGUIToolkit guiToolkit;
 
                public static void Init()
@@ -107,7 +107,7 @@ namespace LongoMatch.Services
                        projectsManager.OpenedProjectChanged += OnOpenedProjectChanged;
                }
 
-               public static void BindEvents(IMainWindow mainWindow) {
+               public static void BindEvents(IAnalysisWindow mainWindow) {
                        mainWindow.EditPreferencesEvent += () => {guiToolkit.OpenPreferencesEditor();};
                }
 
diff --git a/LongoMatch.Services/Services/EventsManager.cs b/LongoMatch.Services/Services/EventsManager.cs
index 4d9acdc..e1ca37a 100644
--- a/LongoMatch.Services/Services/EventsManager.cs
+++ b/LongoMatch.Services/Services/EventsManager.cs
@@ -47,7 +47,7 @@ namespace LongoMatch.Services
                PlaysFilter filter;
                
                IGUIToolkit guiToolkit;
-               IMainWindow mainWindow;
+               IAnalysisWindow mainWindow;
                IPlayer player;
                ICapturer capturer;
                IRenderingJobsManager renderer;
diff --git a/LongoMatch.Services/Services/GameUnitsManager.cs 
b/LongoMatch.Services/Services/GameUnitsManager.cs
index 6969168..36c3840 100644
--- a/LongoMatch.Services/Services/GameUnitsManager.cs
+++ b/LongoMatch.Services/Services/GameUnitsManager.cs
@@ -26,14 +26,14 @@ namespace LongoMatch.Services
 {
        public class GameUnitsManager
        {
-               IMainWindow mainWindow;
+               IAnalysisWindow mainWindow;
                IPlayer player;
                Project openedProject;
                Dictionary<GameUnit, Time> gameUnitsStarted;
                ushort fps;
                
                
-               public GameUnitsManager (IMainWindow mainWindow, IPlayer player)
+               public GameUnitsManager (IAnalysisWindow mainWindow, IPlayer player)
                {
                        this.mainWindow = mainWindow;
                        this.player = player;
diff --git a/LongoMatch.Services/Services/HotKeysManager.cs b/LongoMatch.Services/Services/HotKeysManager.cs
index 7b3bc31..0010edb 100644
--- a/LongoMatch.Services/Services/HotKeysManager.cs
+++ b/LongoMatch.Services/Services/HotKeysManager.cs
@@ -40,7 +40,7 @@ namespace LongoMatch.Services
                Dictionary<HotKey, Category> dic;
                bool ignoreKeys;
                
-               public HotKeysManager(IMainWindow mainWindow)
+               public HotKeysManager(IAnalysisWindow mainWindow)
                {
                        dic = new Dictionary<HotKey,Category>();
                        mainWindow.KeyPressed += KeyListener;
diff --git a/LongoMatch.Services/Services/PlaylistManager.cs b/LongoMatch.Services/Services/PlaylistManager.cs
index d7760d0..e704194 100644
--- a/LongoMatch.Services/Services/PlaylistManager.cs
+++ b/LongoMatch.Services/Services/PlaylistManager.cs
@@ -70,7 +70,7 @@ namespace LongoMatch.Services
                        }
                }
                
-               private void BindEvents(IMainWindow mainWindow, IPlayer player) {
+               private void BindEvents(IAnalysisWindow mainWindow, IPlayer player) {
                        /* Track loaded element */
                        mainWindow.PlaySelectedEvent += (p) => {selectedTimeNode = p;};
                        player.SegmentClosedEvent += () => {selectedTimeNode = null;};
diff --git a/LongoMatch.Services/Services/ProjectOptionsManager.cs 
b/LongoMatch.Services/Services/ProjectOptionsManager.cs
new file mode 100644
index 0000000..851d272
--- /dev/null
+++ b/LongoMatch.Services/Services/ProjectOptionsManager.cs
@@ -0,0 +1,91 @@
+//
+//  Copyright (C) 2013 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.Services.Services
+{
+               public class ProjectOptionsManager
+               {
+                               public ProjectOptionsManager ()
+                               {
+                               }
+                               
+               protected void OnTagSubcategoriesActionToggled (object sender, System.EventArgs e)
+               {
+                       if (TagSubcategoriesChangedEvent != null)
+                               TagSubcategoriesChangedEvent (!TagSubcategoriesAction.Active);
+                       Config.FastTagging = !TagSubcategoriesAction.Active;
+               }
+
+               protected virtual void OnFullScreenActionToggled(object sender, System.EventArgs e)
+               {
+                       playercapturer.FullScreen = (sender as Gtk.ToggleAction).Active;
+               }
+
+               protected virtual void OnPlaylistActionToggled(object sender, System.EventArgs e)
+               {
+                       bool visible = (sender as Gtk.ToggleAction).Active;
+                       SetPlaylistVisibility (visible);
+                       playsSelection.PlayListLoaded=visible;
+               }
+
+               protected virtual void OnHideAllWidgetsActionToggled(object sender, System.EventArgs e)
+               {
+                       ToggleAction action = sender as ToggleAction;
+                       
+                       if(openedProject == null)
+                               return;
+                       
+                       leftbox.Visible = !action.Active;
+                       timeline.Visible = !action.Active && TimelineViewAction.Active;
+                       buttonswidget.Visible = !action.Active &&
+                               (TaggingViewAction.Active || ManualTaggingViewAction.Active);
+                       if (Config.UseGameUnits) {
+                               guTimeline.Visible = !action.Visible && GameUnitsViewAction.Active;
+                               gameunitstaggerwidget1.Visible = !action.Active && 
(GameUnitsViewAction.Active || 
+                                       TaggingViewAction.Active || ManualTaggingViewAction.Active);
+                       }
+                       if(action.Active) {
+                               SetTagsBoxVisibility (false);
+                       } else {
+                               if (selectedTimeNode != null)
+                                       SetTagsBoxVisibility (true);
+                       }
+               }
+
+               protected virtual void OnViewToggled(object sender, System.EventArgs e)
+               {
+                       ToggleAction action = sender as Gtk.ToggleAction;
+                       
+                       if (!action.Active)
+                               return;
+                       
+                       buttonswidget.Visible = action == ManualTaggingViewAction || sender == 
TaggingViewAction;
+                       timeline.Visible = action == TimelineViewAction;
+                       if (Config.UseGameUnits) {
+                               guTimeline.Visible = action == GameUnitsViewAction;
+                               gameunitstaggerwidget1.Visible = buttonswidget.Visible || guTimeline.Visible;
+                       }
+                       if(action == ManualTaggingViewAction)
+                               buttonswidget.Mode = TagMode.Free;
+                       else
+                               buttonswidget.Mode = TagMode.Predifined;
+               }
+               }
+}
+
diff --git a/LongoMatch.Services/Services/ProjectsManager.cs b/LongoMatch.Services/Services/ProjectsManager.cs
index e3f0ff8..1899d4e 100644
--- a/LongoMatch.Services/Services/ProjectsManager.cs
+++ b/LongoMatch.Services/Services/ProjectsManager.cs
@@ -38,7 +38,7 @@ namespace LongoMatch.Services
 
                IGUIToolkit guiToolkit;
                IMultimediaToolkit multimediaToolkit;
-               IMainWindow mainWindow;
+               IAnalysisWindow mainWindow;
                
                public ProjectsManager(IGUIToolkit guiToolkit, IMultimediaToolkit multimediaToolkit) {
                        this.multimediaToolkit = multimediaToolkit;
@@ -259,6 +259,45 @@ namespace LongoMatch.Services
                        fChooser.Destroy();
                }*/
 
+               private bool PromptCloseProject() {
+                       int res;
+                       EndCaptureDialog dialog;
+
+                       if(openedProject == null)
+                               return true;
+
+                       if(projectType == ProjectType.FileProject) {
+                               MessageDialog md = new MessageDialog(this, DialogFlags.Modal,
+                                                                    MessageType.Question, 
ButtonsType.OkCancel,
+                                                                    Catalog.GetString("Do you want to close 
the current project?"));
+                               res = md.Run();
+                               md.Destroy();
+                               if(res == (int)ResponseType.Ok) {
+                                       EmitCloseOpenedProject(true);
+                                       return true;
+                               }
+                               return false;
+                       }
+
+                       /* Capture project */
+                       dialog = new EndCaptureDialog();
+                       dialog.TransientFor = (Gtk.Window)this.Toplevel;
+                       res = dialog.Run();
+                       dialog.Destroy();
+
+                       /* Close project wihtout saving */
+                       if(res == (int)EndCaptureResponse.Quit) {
+                               EmitCloseOpenedProject(false);
+                               return true;
+                       } else if(res == (int)EndCaptureResponse.Save) {
+                               /* Close and save project */
+                               EmitCloseOpenedProject(true);
+                               return true;
+                       } else
+                               /* Continue with the current project */
+                               return false;
+               }
+
                private void CreateThumbnails(Project project) {
                        IFramesCapturer capturer;
                        IBusyDialog dialog;


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