Index: libi4uc/Makefile.am
===================================================================
--- libi4uc/Makefile.am	(revision b61fc026e7a6957c78c3af4e6b250ad8310431dd)
+++ libi4uc/Makefile.am	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -30,4 +30,5 @@
 	i4ucdocumentsview.vala \
 	i4ucdocumentsviewiface.vala \
+	i4ucfileslist.vala \
 	i4ucmainwindowpresenter.vala \
 	i4ucmainwindowview.vala \
@@ -38,6 +39,14 @@
 	i4ucpagespaneliface.vala \
 	i4ucprofilebuilder.vala \
+	i4ucprofileslist.vala \
 	i4ucproject.vala \
 	i4ucprojectprofile.vala \
+	i4ucprojectscombo.vala \
+	i4ucprojectssidepagepresenter.vala \
+	i4ucprojectssidepageview.vala \
+	i4ucprojectssidepageviewiface.vala \
+	i4ucprojectspresenter.vala \
+	i4ucprojectsview.vala \
+	i4ucprojectsviewiface.vala \
 	i4ucsearchbarpresenter.vala \
 	i4ucsearchbarview.vala \
Index: libi4uc/i4ucfileslist.vala
===================================================================
--- libi4uc/i4ucfileslist.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
+++ libi4uc/i4ucfileslist.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -0,0 +1,104 @@
+/* i4ucfileslist.vala
+ *
+ * Copyright (C) 2010  Matias De la Puente
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * 	Matias De la Puente <mfpuente.ar@gmail.com>
+ */
+using Gtk;
+using Gee;
+
+public class I4uc.FilesList : Gtk.VBox
+{
+	private ListStore _files_store;
+	private TreeView _files_view;
+	
+	private ArrayList<string> _files = new ArrayList<string> ();
+	
+	private enum FilesColumns
+	{
+		ICON,
+		FILE,
+		N_COLUMNS
+	}
+	
+	public string current_file
+	{
+		set
+		{
+			TreeIter iter;
+			_files_store.get_iter_from_string (out iter, _files.index_of (value).to_string ());
+			_files_view.get_selection ().select_iter (iter);
+		}
+		get
+		{
+			TreeIter iter;
+			unowned string file = null;
+			if (_files_view.get_selection ().get_selected (null, out iter))
+				_files_store.get (iter, FilesColumns.FILE, out file);
+			return file;
+		}
+	}
+
+	public signal void file_changed ();
+	public signal void file_activated ();
+	
+	public FilesList ()
+	{
+		_files_store = new ListStore (FilesColumns.N_COLUMNS, typeof (string), typeof (string));
+		_files_view = new TreeView.with_model (_files_store);
+		
+		var column = new TreeViewColumn ();
+		CellRenderer renderer = new CellRendererPixbuf ();
+ 		column.pack_start (renderer, false);
+		column.add_attribute (renderer, "stock-id", FilesColumns.ICON);
+		renderer = new CellRendererText ();
+ 		column.pack_start (renderer, false);
+		column.add_attribute (renderer, "text", FilesColumns.FILE);
+		_files_view.append_column (column);
+		_files_view.set_headers_visible (false);
+		
+		pack_start (_files_view, true, true, 0);
+		
+		_files_view.get_selection ().changed.connect (() => this.file_changed ());
+		_files_view.row_activated.connect (() => this.file_activated ());
+	}
+	
+	public void add_file (string file)
+	{
+		if (file in _files)
+			return;
+		TreeIter iter;
+		_files_store.append (out iter);
+		_files_store.set (iter, FilesColumns.ICON, STOCK_FILE, FilesColumns.FILE, file);
+		_files.add (file);
+	}
+	
+	public void remove_file (string file)
+	{
+		if (!(file in _files))
+			return;
+		TreeIter iter;
+		_files_store.get_iter_from_string (out iter, _files.index_of (file).to_string ());
+		_files_store.remove (iter);
+		_files.remove (file);
+	}
+	
+	public void clear_list ()
+	{
+		_files_store.clear ();
+	}
+}
Index: libi4uc/i4ucprofileslist.vala
===================================================================
--- libi4uc/i4ucprofileslist.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
+++ libi4uc/i4ucprofileslist.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -0,0 +1,205 @@
+/* i4ucprofileslist.vala
+ *
+ * Copyright (C) 2010  Matias De la Puente
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * 	Matias De la Puente <mfpuente.ar@gmail.com>
+ */
+using Gtk;
+using Gee;
+
+public class I4uc.ProfilesList : Gtk.VBox
+{
+	private TreeStore _profiles_store;
+	private TreeView _profiles_view;
+	
+	private enum ItemsColumns
+	{
+		ICON,
+		ITEM,
+		N_COLUMNS
+	}
+	
+	public string current_profile
+	{
+		set
+		{
+			TreeIter iter;
+			if (get_profile_iter_from_string (value, out iter))
+				_profiles_view.get_selection ().select_iter (iter);
+		}
+		get
+		{
+			unowned string profile = null;
+			TreeIter iter;
+			if (get_current_profile_iter (out iter))
+				_profiles_store.get (iter, ItemsColumns.ITEM, out profile);
+			return profile;
+		}
+	}
+	
+	public string current_file
+	{
+		set
+		{
+			TreeIter iter;
+			if (get_file_iter_from_string (this.current_profile, value, out iter))
+				_profiles_view.get_selection ().select_iter (iter);
+		}
+		get
+		{
+			unowned string file = null;
+			TreeIter iter;
+			if (get_current_file_iter (out iter))
+				_profiles_store.get (iter, ItemsColumns.ITEM, out file);
+			return file;
+		}
+	}
+
+	public signal void item_changed ();
+	public signal void item_activated ();
+	
+	public ProfilesList ()
+	{
+		_profiles_store = new TreeStore (ItemsColumns.N_COLUMNS, typeof (string), typeof (string));
+		_profiles_view = new TreeView.with_model (_profiles_store);
+		
+		var column = new TreeViewColumn ();
+		CellRenderer renderer = new CellRendererPixbuf ();
+ 		column.pack_start (renderer, false);
+		column.add_attribute (renderer, "stock-id", ItemsColumns.ICON);
+		renderer = new CellRendererText ();
+ 		column.pack_start (renderer, false);
+		column.add_attribute (renderer, "text", ItemsColumns.ITEM);
+		_profiles_view.append_column (column);
+		_profiles_view.set_headers_visible (false);
+		
+		pack_start (_profiles_view, true, true, 0);
+		
+		_profiles_view.get_selection ().changed.connect (() => this.item_changed ());
+		_profiles_view.row_activated.connect (() => this.item_activated ());
+	}
+	
+	public void add_profile (string profile)
+	{
+		if (get_profile_iter_from_string (profile, null))
+			return;
+		TreeIter iter;
+		_profiles_store.append (out iter, null);
+		_profiles_store.set (iter, ItemsColumns.ICON, STOCK_DIRECTORY, ItemsColumns.ITEM, profile);
+	}
+	
+	public void add_file (string profile, string file)
+	{
+		TreeIter profile_iter;
+		if (!get_profile_iter_from_string (profile, out profile_iter) ||
+		    get_file_iter_from_string (profile, file, null))
+			return;
+		TreeIter iter;
+		_profiles_store.append (out iter, profile_iter);
+		_profiles_store.set (iter, ItemsColumns.ICON, STOCK_FILE, ItemsColumns.ITEM, file);
+	}
+	
+	public void remove_profile (string profile)
+	{
+		TreeIter iter;
+		if (get_profile_iter_from_string (profile, out iter))
+			_profiles_store.remove (iter);
+	}
+	
+	public void remove_file (string profile, string file)
+	{
+		TreeIter iter;
+		if (get_file_iter_from_string (profile, file, out iter))
+			_profiles_store.remove (iter);
+	}
+	
+	public void clear_profile (string profile)
+	{
+		TreeIter profile_iter;
+		if (!get_profile_iter_from_string (profile, out profile_iter) ||
+		    !_profiles_store.iter_has_child (profile_iter))
+			return;
+		
+		TreeIter file_iter;
+		_profiles_store.iter_children (out file_iter, profile_iter);
+		while (_profiles_store.remove (file_iter));
+	}
+	
+	public void clear_list ()
+	{
+		_profiles_store.clear ();
+	}
+	
+	private bool get_current_profile_iter (out TreeIter iter)
+	{
+		TreeIter parent;
+		if (!_profiles_view.get_selection ().get_selected (null, out iter))
+			return false;
+		
+		if (_profiles_store.iter_depth (iter) == 1)
+		{
+			_profiles_store.iter_parent (out parent, iter);
+			iter = parent;
+		}
+		return true;
+	}
+	
+	private bool get_current_file_iter (out TreeIter iter)
+	{
+		return _profiles_view.get_selection ().get_selected (null, out iter) &&
+		       _profiles_store.iter_depth (iter) == 1;
+	}
+	
+	private bool get_profile_iter_from_string (string profile, out TreeIter iter)
+	{
+		TreeIter temp_iter;
+		if (_profiles_store.get_iter_first (out temp_iter))
+		{
+			do
+			{
+				string iter_profile;
+				_profiles_store.get (temp_iter, ItemsColumns.ITEM, out iter_profile);
+				if (iter_profile == profile)
+				{
+					iter = temp_iter;
+					return true;
+				}
+			} while (_profiles_store.iter_next (ref temp_iter));
+		}
+		return false;
+	}
+	
+	private bool get_file_iter_from_string (string profile, string file, out TreeIter iter)
+	{
+		TreeIter profile_iter, temp_iter;
+		if (!get_profile_iter_from_string (profile, out profile_iter))
+			return false;
+		
+		for (int i = 0; i < _profiles_store.iter_n_children (profile_iter); i++)
+		{
+			string iter_file;
+			_profiles_store.iter_nth_child (out temp_iter, profile_iter, i);
+			_profiles_store.get (temp_iter, ItemsColumns.ITEM, out iter_file);
+			if (iter_file == file)
+			{
+				iter = temp_iter;
+				return true;
+			}
+		}
+		return false;
+	}
+}
Index: libi4uc/i4ucprojectscombo.vala
===================================================================
--- libi4uc/i4ucprojectscombo.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
+++ libi4uc/i4ucprojectscombo.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -0,0 +1,96 @@
+/* i4ucprojectscombo.vala
+ *
+ * Copyright (C) 2010  Matias De la Puente
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * 	Matias De la Puente <mfpuente.ar@gmail.com>
+ */
+using Gtk;
+using Gee;
+
+public class I4uc.ProjectsCombo : Gtk.VBox
+{
+	private ListStore _projects_store;
+	private ComboBox _projects_view;
+
+	private ArrayList<string> _projects = new ArrayList<string> ();
+
+	private enum ProjectsColumns
+	{
+		PROJECT_NAME,
+		PROJECT_URI,
+		N_COLUMNS
+	}
+
+	public string current_project
+	{
+		set
+		{
+			TreeIter iter;
+			_projects_store.get_iter_from_string (out iter, _projects.index_of (value).to_string ());
+			_projects_view.set_active_iter (iter);
+		}
+		get
+		{
+			TreeIter iter;
+			unowned string project_uri = null;
+			if (_projects_view.get_active_iter (out iter))
+				_projects_store.get (iter, ProjectsColumns.PROJECT_URI, out project_uri);
+			return project_uri;
+		}
+	}
+
+	public signal void project_changed ();
+
+	public ProjectsCombo ()
+	{
+		_projects_store = new ListStore (ProjectsColumns.N_COLUMNS, typeof (string), typeof (string));
+		_projects_view = new ComboBox.with_model (_projects_store);
+
+		var renderer = new CellRendererText ();
+		_projects_view.pack_start (renderer, true);
+		_projects_view.add_attribute (renderer, "text", ProjectsColumns.PROJECT_NAME);
+
+		pack_start (_projects_view, true, true, 0);
+		
+		_projects_view.changed.connect (() => this.project_changed ());
+	}
+
+	public void add_project (string project_uri, string project_name)
+	{
+		if (project_uri in _projects)
+			return;
+		TreeIter iter;
+		_projects_store.append (out iter);
+		_projects_store.set (iter, ProjectsColumns.PROJECT_NAME, project_name, ProjectsColumns.PROJECT_URI, project_uri);
+		_projects.add (project_uri);
+	}
+
+	public void remove_project (string project_uri)
+	{
+		if (!(project_uri in _projects))
+			return;
+		TreeIter iter;
+		_projects_store.get_iter_from_string (out iter, _projects.index_of (project_uri).to_string ());
+		_projects_store.remove (iter);
+		_projects.remove (project_uri);
+	}
+
+	public void clear_list ()
+	{
+		_projects_store.clear ();
+	}
+}
Index: libi4uc/i4ucprojectspresenter.vala
===================================================================
--- libi4uc/i4ucprojectspresenter.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
+++ libi4uc/i4ucprojectspresenter.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -0,0 +1,33 @@
+/* i4ucprojectspresenter.vala
+ *
+ * Copyright (C) 2010  Matias De la Puente
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * 	Matias De la Puente <mfpuente.ar@gmail.com>
+ */
+
+public class I4uc.ProjectsPresenter : GLib.Object
+{
+	private ProjectsViewIface _view;
+	private ProjectsSidePagePresenter _projects_side_page_presenter;
+
+	public ProjectsPresenter (ProjectsViewIface view)
+	{
+		_view = view;
+
+		_projects_side_page_presenter = new ProjectsSidePagePresenter (_view.projects_side_page_view);
+	}
+}
Index: libi4uc/i4ucprojectssidepagepresenter.vala
===================================================================
--- libi4uc/i4ucprojectssidepagepresenter.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
+++ libi4uc/i4ucprojectssidepagepresenter.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -0,0 +1,94 @@
+/* i4ucprojectssidepagepresenter.vala
+ *
+ * Copyright (C) 2010  Matias De la Puente
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * 	Matias De la Puente <mfpuente.ar@gmail.com>
+ */
+using Gee;
+
+public class I4uc.ProjectsSidePagePresenter : GLib.Object
+{
+	private ProjectsSidePageViewIface _view;
+	private ArrayList<Project> _projects = new ArrayList<Project> ();
+
+	public Project current_project
+	{
+		set { _view.current_project = value.uri; }
+		owned get { return get_project_from_uri (_view.current_project); }
+	}
+
+	public Gee.List<Project> projects { owned get { return _projects.read_only_view; } }
+
+	public ProjectsSidePagePresenter (ProjectsSidePageViewIface view)
+	{
+		_view = view;
+
+		//Configure view
+		_view.tab_title = _("Projects");
+
+		//Connect view signals
+		_view.project_changed.connect (on_project_changed);
+	}
+
+	public void add_project (Project project)
+	{
+		if (!(project in _projects))
+		{
+			_view.add_project (project.uri, project.name);
+			_projects.add (project);
+		}
+		_view.current_project = project.uri;
+	}
+
+	public void remove_project (Project project)
+	{
+		if (!(project in _projects))
+			return;
+		_projects.remove (project);
+		_view.remove_project (project.uri);
+	}
+
+	private void on_project_changed ()
+	{
+		_view.clear_files_list ();
+		_view.clear_profiles_list ();
+
+		current_project = get_project_from_uri (_view.current_project);
+		if (current_project == null)
+			return;
+
+		//Load files list
+		foreach (var file in current_project.files)
+			_view.add_file (file);
+
+		//Load profiles list
+		foreach (var profile in current_project.profiles.values)
+		{
+			_view.add_profile (profile.name);
+			foreach (var file in profile.files)
+				_view.add_profile_file (profile.name, file);
+		}
+	}
+
+	private Project? get_project_from_uri (string project_uri)
+	{
+		foreach (var project in _projects)
+			if (project.uri == project_uri)
+				return project;
+		return null;
+	}
+}
Index: libi4uc/i4ucprojectssidepageview.vala
===================================================================
--- libi4uc/i4ucprojectssidepageview.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
+++ libi4uc/i4ucprojectssidepageview.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -0,0 +1,153 @@
+/* i4ucprojectssidepageview.vala
+ *
+ * Copyright (C) 2010  Matias De la Puente
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * 	Matias De la Puente <mfpuente.ar@gmail.com>
+ */
+using Gtk;
+using Gee;
+
+public class I4uc.ProjectsSidePageView : SidePage, ProjectsSidePageViewIface
+{
+	private Notebook _notebook = new Notebook ();
+	private ProjectsCombo _projects_combo = new ProjectsCombo ();
+	private FilesList _files_list = new FilesList ();
+	private ProfilesList _profiles_list = new ProfilesList ();
+	private string _current_profile;
+	private string _current_file;
+
+	public string current_project
+	{
+		set { _projects_combo.current_project = value; }
+		get { return _projects_combo.current_project; }
+	}
+
+	public string current_profile { get { return _current_profile; } }
+	public string current_file { get { return _current_file; } }
+	
+	public ProjectsSidePageView ()
+	{
+		_notebook.tab_pos = PositionType.BOTTOM;
+
+		var files_scrolled_window = new ScrolledWindow (null, null);
+		files_scrolled_window.add_with_viewport (_files_list);
+		files_scrolled_window.set_policy (PolicyType.NEVER, PolicyType.AUTOMATIC);
+		
+		var profiles_scrolled_window = new ScrolledWindow (null, null);
+		profiles_scrolled_window.add_with_viewport (_profiles_list);
+		profiles_scrolled_window.set_policy (PolicyType.NEVER, PolicyType.AUTOMATIC);
+		
+		_notebook.append_page (files_scrolled_window, new Image.from_stock (STOCK_FILE, IconSize.MENU));
+		_notebook.append_page (profiles_scrolled_window, new Image.from_stock (STOCK_DIRECTORY, IconSize.MENU));
+
+		pack_start (_projects_combo, false, false, 2);
+		pack_start (_notebook, true, true, 2);
+		show_all ();
+
+		//connect signals
+		_projects_combo.project_changed.connect (() => this.project_changed ());
+		_profiles_list.item_changed.connect (on_item_changed);
+		_profiles_list.item_activated.connect (on_item_activated);
+		_files_list.file_changed.connect (on_file_changed);
+		_files_list.file_activated.connect (() => this.file_activated ());
+	}
+
+	public void add_project (string project_uri, string project_name)
+	{
+		_projects_combo.add_project (project_uri, project_name);
+	}
+
+	public void add_profile (string profile)
+	{
+		_profiles_list.add_profile (profile);
+	}
+
+	public void add_profile_file (string profile, string file)
+	{
+		_profiles_list.add_file (profile, file);
+	}
+
+	public void add_file (string file)
+	{
+		_files_list.add_file (file);
+	}
+
+	public void remove_project (string project_uri)
+	{
+		_projects_combo.remove_project (project_uri);
+	}
+
+	public void remove_profile (string profile)
+	{
+		_profiles_list.remove_profile (profile);
+	}
+
+	public void remove_profile_file (string profile, string file)
+	{
+		_profiles_list.remove_file (profile, file);
+	}
+
+	public void remove_file (string file)
+	{
+		_files_list.remove_file (file);
+	}
+
+	public void clear_profile (string profile)
+	{
+		_profiles_list.clear_profile (profile);
+	}
+
+	public void clear_profiles_list ()
+	{
+		_profiles_list.clear_list ();
+	}
+
+	public void clear_files_list ()
+	{
+		_files_list.clear_list ();
+	}
+
+	private void on_item_changed ()
+	{
+		if (_current_profile != _profiles_list.current_profile)
+		{
+			_current_profile = _profiles_list.current_profile;
+			this.profile_selected ();
+		}
+		if (_current_file != _profiles_list.current_file)
+		{
+			_current_file = _profiles_list.current_file;
+			this.file_selected ();
+		}
+	}
+
+	private void on_item_activated ()
+	{
+		if (_profiles_list.current_file != null)
+			this.file_activated ();
+		else
+			this.profile_activated ();
+	}
+
+	private void on_file_changed ()
+	{
+		if (_current_file == _files_list.current_file)
+			return;
+		_current_file = _files_list.current_file;
+		this.file_selected ();
+	}
+}
Index: libi4uc/i4ucprojectssidepageviewiface.vala
===================================================================
--- libi4uc/i4ucprojectssidepageviewiface.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
+++ libi4uc/i4ucprojectssidepageviewiface.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -0,0 +1,45 @@
+/* i4ucprojectssidepageviewiface.vala
+ *
+ * Copyright (C) 2010  Matias De la Puente
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * 	Matias De la Puente <mfpuente.ar@gmail.com>
+ */
+
+public interface I4uc.ProjectsSidePageViewIface : GLib.Object, PageIface
+{
+	public abstract string current_project { set; get; }
+	public abstract string current_profile { get; }
+	public abstract string current_file { get; }
+
+	public signal void project_changed ();
+	public signal void profile_selected ();
+	public signal void profile_activated ();
+	public signal void file_selected ();
+	public signal void file_activated ();
+
+	public abstract void add_project (string project_uri, string project_name);
+	public abstract void add_profile (string profile);
+	public abstract void add_profile_file (string profile, string file);
+	public abstract void add_file (string file);
+	public abstract void remove_project (string project_uri);
+	public abstract void remove_profile (string profile);
+	public abstract void remove_profile_file (string profile, string file);
+	public abstract void remove_file (string file);
+	public abstract void clear_profile (string profile);
+	public abstract void clear_profiles_list ();
+	public abstract void clear_files_list ();
+}
Index: libi4uc/i4ucprojectsview.vala
===================================================================
--- libi4uc/i4ucprojectsview.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
+++ libi4uc/i4ucprojectsview.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -0,0 +1,38 @@
+/* i4ucprojectsview.vala
+ *
+ * Copyright (C) 2010  Matias De la Puente
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * 	Matias De la Puente <mfpuente.ar@gmail.com>
+ */
+using Gtk;
+
+public class I4uc.ProjectsView : GLib.Object, ProjectsViewIface
+{
+	private UIManager _ui_manager;
+	private SidePanel _side_panel;
+	private ProjectsSidePageView _projects_side_page_view = new ProjectsSidePageView ();
+
+	public ProjectsSidePageViewIface projects_side_page_view { get { return _projects_side_page_view; } }
+	
+	public ProjectsView (UIManager ui_manager, SidePanel side_panel)
+	{
+		_ui_manager = ui_manager;
+		_side_panel = side_panel;
+
+		_side_panel.add_page (_projects_side_page_view);
+	}
+}
Index: libi4uc/i4ucprojectsviewiface.vala
===================================================================
--- libi4uc/i4ucprojectsviewiface.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
+++ libi4uc/i4ucprojectsviewiface.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -0,0 +1,25 @@
+/* i4ucprojectsviewiface.vala
+ *
+ * Copyright (C) 2010  Matias De la Puente
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * 	Matias De la Puente <mfpuente.ar@gmail.com>
+ */
+
+public interface I4uc.ProjectsViewIface : GLib.Object
+{
+	public abstract ProjectsSidePageViewIface projects_side_page_view { get; }
+}
Index: src/main.vala
===================================================================
--- src/main.vala	(revision aee551b1748ebf23b97d4a239d7ec5b8fa64160f)
+++ src/main.vala	(revision 16031c0c0382e0dec3ff640ff27c96d69a9ff602)
@@ -32,7 +32,9 @@
 
 	var documents_view = new DocumentsView (main_window_view.ui_manager, main_window_view.pages_panel);
+	var projects_view = new ProjectsView (main_window_view.ui_manager, main_window_view.side_panel);
 	
 	var main_window_presenter = new MainWindowPresenter (main_window_view);
 	var documents_presenter = new DocumentsPresenter (documents_view);
+	var projects_presenter = new ProjectsPresenter (projects_view);
 	
 	main_window_view.exit_clicked.connect (() => {
