tasque r30 - in branches/cache: . src



Author: calvinrg
Date: Sat Mar 15 00:15:38 2008
New Revision: 30
URL: http://svn.gnome.org/viewvc/tasque?rev=30&view=rev

Log:
* tasque.mdp, src/TaskTreeView.cs, src/LocalCache.cs,
  src/AllCategory.cs, src/Category.cs, src/TaskModelNode.cs,
  src/TaskWindow.cs, src/Makefile.am: fixed up things so there is a
  single TreeView which currently sucks pond water

Added:
   branches/cache/src/TaskModelNode.cs
Modified:
   branches/cache/ChangeLog
   branches/cache/src/AllCategory.cs
   branches/cache/src/Category.cs
   branches/cache/src/LocalCache.cs
   branches/cache/src/Makefile.am
   branches/cache/src/TaskTreeView.cs
   branches/cache/src/TaskWindow.cs
   branches/cache/tasque.mdp

Modified: branches/cache/src/AllCategory.cs
==============================================================================
--- branches/cache/src/AllCategory.cs	(original)
+++ branches/cache/src/AllCategory.cs	Sat Mar 15 00:15:38 2008
@@ -15,7 +15,7 @@
 		// specified lists will be shown.
 		List<string> categoriesToHide;
 		
-		public AllCategory () : base(Application.LocalCache, Catalog.GetString ("All"))
+		public AllCategory () : base()
 		{
 			Preferences preferences = Application.Preferences;
 			categoriesToHide =
@@ -23,6 +23,13 @@
 			Application.Preferences.SettingChanged += OnSettingChanged;
 		}
 		
+		public override string Name
+		{
+			get {
+				return Catalog.GetString("All");
+			}
+		}
+		
 		public new bool ContainsTask(Task task)
 		{
 			// Filter out tasks based on the user's preferences of which

Modified: branches/cache/src/Category.cs
==============================================================================
--- branches/cache/src/Category.cs	(original)
+++ branches/cache/src/Category.cs	Sat Mar 15 00:15:38 2008
@@ -16,7 +16,7 @@
 			get { return id; }
 		}
 		
-		public string Name
+		public virtual string Name
 		{
 			get {
 				string command = String.Format("SELECT Name FROM Categories where ID='{0}'", id);
@@ -54,6 +54,11 @@
 			this.cache = cache;
 			this.id = id;
 		}
+
+		internal Category ()
+		{
+		}
+
 		
 		public bool ContainsTask(Task task)
 		{

Modified: branches/cache/src/LocalCache.cs
==============================================================================
--- branches/cache/src/LocalCache.cs	(original)
+++ branches/cache/src/LocalCache.cs	Sat Mar 15 00:15:38 2008
@@ -27,6 +27,22 @@
 		public event BackendSyncStartedHandler BackendSyncStarted;
 		public event BackendSyncFinishedHandler BackendSyncFinished;
 		
+		//private TaskGroup overdueGroup;
+		//private TaskGroup todayGroup;
+		//private TaskGroup tomorrowGroup;
+		//private TaskGroup nextSevenDaysGroup;
+		//private TaskGroup futureGroup;
+		//private CompletedTaskGroup completedTaskGroup;
+		
+		private Gtk.TreeIter overdueIter;
+		private Gtk.TreeIter todayIter;
+		private Gtk.TreeIter tomorrowIter;
+		private Gtk.TreeIter nextSevenDaysIter;
+		private Gtk.TreeIter futureIter;
+		private Gtk.TreeIter completedTaskIter;
+
+
+		
 		Category defaultCategory;
 		//Category workCategory;
 		//Category projectsCategory;
@@ -35,7 +51,7 @@
 		{
 			initialized = false;
 			taskIters = new Dictionary<int, Gtk.TreeIter> (); 
-			taskStore = new Gtk.TreeStore (typeof (Task));
+			taskStore = new Gtk.TreeStore (typeof (TaskModelNode));
 			
 			sortedTasksModel = new Gtk.TreeModelSort (taskStore);
 			sortedTasksModel.SetSortFunc (0, new Gtk.TreeIterCompareFunc (CompareTasksSortFunc));
@@ -265,7 +281,25 @@
 			Gtk.TreeIter iter;
 			Task newTask;
 			bool hasValues = false;
+
+			overdueIter = taskStore.AppendNode();
+			taskStore.SetValue(overdueIter, 0, new TaskModelNode(Catalog.GetString("Overdue")));
+			
+			todayIter = taskStore.AppendNode();
+			taskStore.SetValue(todayIter, 0, new TaskModelNode(Catalog.GetString("Today")));
 			
+			tomorrowIter = taskStore.AppendNode();
+			taskStore.SetValue(overdueIter, 0, new TaskModelNode(Catalog.GetString("Tomorrow")));
+			
+			nextSevenDaysIter = taskStore.AppendNode();
+			taskStore.SetValue(tomorrowIter, 0, new TaskModelNode(Catalog.GetString("Next 7 Days")));
+			
+			futureIter = taskStore.AppendNode();
+			taskStore.SetValue(futureIter, 0, new TaskModelNode(Catalog.GetString("Future")));
+			
+			completedTaskIter = taskStore.AppendNode();
+			taskStore.SetValue(completedTaskIter, 0, new TaskModelNode(Catalog.GetString("Completed")));
+
 			string command = "SELECT id FROM Tasks";
         	SqliteCommand cmd = db.Connection.CreateCommand();
         	cmd.CommandText = command;
@@ -275,8 +309,8 @@
 				hasValues = true;
 				
 				newTask = new Task(this, id);
-				iter = taskStore.AppendNode();
-				taskStore.SetValue (iter, 0, newTask);				
+				iter = taskStore.AppendNode(overdueIter);
+				taskStore.SetValue (iter, 0, new TaskModelNode(newTask));				
         	}
 
         	dataReader.Close();
@@ -289,7 +323,7 @@
 				newTask.DueDate = DateTime.Now;
 				newTask.Priority = TaskPriority.Medium;
 				iter = taskStore.AppendNode ();
-				taskStore.SetValue (iter, 0, newTask);	
+				taskStore.SetValue (iter, 0, new TaskModelNode(newTask));	
 				taskIters [newTask.Id] = iter;
 			}
 		}

Modified: branches/cache/src/Makefile.am
==============================================================================
--- branches/cache/src/Makefile.am	(original)
+++ branches/cache/src/Makefile.am	Sat Mar 15 00:15:38 2008
@@ -62,6 +62,7 @@
 	$(srcdir)/Task.cs \
 	$(srcdir)/TaskCalendar.cs \
 	$(srcdir)/TaskGroup.cs \
+	$(srcdir)/TaskModelNode.cs \
 	$(srcdir)/TaskPriority.cs \
 	$(srcdir)/TaskState.cs \
 	$(srcdir)/TaskWindow.cs \

Added: branches/cache/src/TaskModelNode.cs
==============================================================================
--- (empty file)
+++ branches/cache/src/TaskModelNode.cs	Sat Mar 15 00:15:38 2008
@@ -0,0 +1,51 @@
+// TaskModelNode.cs created with MonoDevelop
+// User: calvin at 4:29 PMÂ3/14/2008
+//
+// To change standard headers go to Edit->Preferences->Coding->Standard Headers
+//
+
+using System;
+using System.Collections.Generic;
+using Gtk;
+using Mono.Unix;
+
+namespace Tasque
+{	
+	public class TaskModelNode
+	{
+		private Task task;
+		private string name;
+		
+		public bool IsSeparator
+		{
+			get { return (task == null); }
+		}
+		
+		public Task Task
+		{
+			get { return task; }
+		}
+		
+		public string Name
+		{
+			get {
+				if(task == null)
+					return name;
+				else
+					return task.Name;
+			}
+		}
+	
+	
+		public TaskModelNode(Task task)
+		{
+			this.task = task;
+		}
+		
+		public TaskModelNode(string name)
+		{
+			this.task = null;
+			this.name = name;
+		}
+	}
+}

Modified: branches/cache/src/TaskTreeView.cs
==============================================================================
--- branches/cache/src/TaskTreeView.cs	(original)
+++ branches/cache/src/TaskTreeView.cs	Sat Mar 15 00:15:38 2008
@@ -63,11 +63,30 @@
 			// TODO: Figure out how to turn off selection highlight
 			
 			Gtk.CellRenderer renderer;
+
+			//
+			// Task Separator name Column
+			//
+			Gtk.TreeViewColumn column = new Gtk.TreeViewColumn ();
+			// Title for Task Name Column
+			column.Title = Catalog.GetString ("Separator Name");
+//			column.Sizing = Gtk.TreeViewColumnSizing.Fixed;
+			column.Sizing = Gtk.TreeViewColumnSizing.Autosize;
+			column.Expand = true;
+			column.Resizable = true;
+			
+			renderer = new Gtk.CellRendererText ();
+			column.PackStart (renderer, true);
+			column.SetCellDataFunc (renderer,
+				new Gtk.TreeCellDataFunc (TaskSeparatorTextCellDataFunc));
+			((Gtk.CellRendererText)renderer).Editable = false;
+			
+			AppendColumn (column);
 			
 			//
 			// Checkbox Column
 			//
-			Gtk.TreeViewColumn column = new Gtk.TreeViewColumn ();
+			column = new Gtk.TreeViewColumn ();
 			// Title for Completed/Checkbox Column
 			column.Title = Catalog.GetString ("Completed");
 			column.Sizing = Gtk.TreeViewColumnSizing.Autosize;
@@ -272,12 +291,13 @@
 											 Gtk.TreeIter iter)
 		{
 			Gtk.CellRendererToggle crt = cell as Gtk.CellRendererToggle;
-			Task task = model.GetValue (iter, 0) as Task;
-			if (task == null)
-				crt.Active = false;
+			TaskModelNode node = model.GetValue (iter, 0) as TaskModelNode;
+			if (node == null || node.IsSeparator)
+				crt.Visible = false;					
 			else {
+				crt.Visible = true;			
 				crt.Active =
-					task.State == TaskState.Active ? false : true;
+					node.Task.State == TaskState.Active ? false : true;
 			}
 		}
 
@@ -288,8 +308,13 @@
 		{
 			// TODO: Add bold (for high), light (for None), and also colors to priority?
 			Gtk.CellRendererCombo crc = cell as Gtk.CellRendererCombo;
-			Task task = Model.GetValue (iter, 0) as Task;
-			switch (task.Priority) {
+			TaskModelNode node = Model.GetValue (iter, 0) as TaskModelNode;
+			if(node.IsSeparator) {
+				crc.Text = string.Empty;
+				return;
+			}
+			
+			switch (node.Task.Priority) {
 			case TaskPriority.Low:
 				crc.Text = Catalog.GetString ("3");
 				break;
@@ -305,20 +330,40 @@
 			}
 		}
 		
+
+		private void TaskSeparatorTextCellDataFunc (Gtk.TreeViewColumn treeColumn,
+				Gtk.CellRenderer renderer, Gtk.TreeModel model,
+				Gtk.TreeIter iter)
+		{
+			Gtk.CellRendererText crt = renderer as Gtk.CellRendererText;
+			TaskModelNode node = Model.GetValue (iter, 0) as TaskModelNode;
+			if( (node == null) || (!node.IsSeparator) ) {
+				crt.Text = string.Empty;
+				return;
+			}
+
+			string formatString = "<span weight=\"bold\">{0}</span>";
+
+			crt.Markup = string.Format (formatString,
+				GLib.Markup.EscapeText (node.Name));
+		}
+
+		
+		
 		private void TaskNameTextCellDataFunc (Gtk.TreeViewColumn treeColumn,
 				Gtk.CellRenderer renderer, Gtk.TreeModel model,
 				Gtk.TreeIter iter)
 		{
 			Gtk.CellRendererText crt = renderer as Gtk.CellRendererText;
 			crt.Ellipsize = Pango.EllipsizeMode.End;
-			Task task = model.GetValue (iter, 0) as Task;
-			if (task == null) {
+			TaskModelNode node = Model.GetValue (iter, 0) as TaskModelNode;
+			if (node == null || node.IsSeparator) {			
 				crt.Text = string.Empty;
 				return;
 			}
 			
 			string formatString = "{0}";
-			switch (task.State) {
+			switch (node.Task.State) {
 			case TaskState.Inactive:
 				// Strikeout the text
 				formatString = "<span strikethrough=\"true\">{0}</span>";
@@ -333,7 +378,7 @@
 			}
 			
 			crt.Markup = string.Format (formatString,
-				GLib.Markup.EscapeText (task.Name));
+				GLib.Markup.EscapeText (node.Task.Name));
 		}
 		
 		protected virtual void DueDateCellDataFunc (Gtk.TreeViewColumn treeColumn,
@@ -341,10 +386,14 @@
 				Gtk.TreeIter iter)
 		{
 			Gtk.CellRendererCombo crc = renderer as Gtk.CellRendererCombo;
-			Task task = Model.GetValue (iter, 0) as Task;
-			DateTime date = task.State == TaskState.Completed ?
-									task.CompletionDate :
-									task.DueDate;
+			TaskModelNode node = Model.GetValue (iter, 0) as TaskModelNode;
+			if(node == null || node.IsSeparator) {
+				crc.Text = string.Empty;
+				return;
+			}
+			DateTime date = node.Task.State == TaskState.Completed ?
+									node.Task.CompletionDate :
+									node.Task.DueDate;
 			if (date == DateTime.MinValue || date == DateTime.MaxValue) {
 				crc.Text = "-";
 				return;
@@ -362,13 +411,13 @@
 				Gtk.TreeIter iter)
 		{
 			Gtk.CellRendererPixbuf crp = renderer as Gtk.CellRendererPixbuf;
-			Task task = model.GetValue (iter, 0) as Task;
-			if (task == null) {
+			TaskModelNode node = Model.GetValue (iter, 0) as TaskModelNode;
+			if (node == null || node.IsSeparator) {
 				crp.Pixbuf = null;
 				return;
 			}
 			
-			crp.Pixbuf = task.HasNotes ? notePixbuf : null;
+			crp.Pixbuf = node.Task.HasNotes ? notePixbuf : null;
 		}
 		
 		private void TaskTimerCellDataFunc (Gtk.TreeViewColumn treeColumn,
@@ -376,11 +425,11 @@
 				Gtk.TreeIter iter)
 		{
 			Gtk.CellRendererPixbuf crp = renderer as Gtk.CellRendererPixbuf;
-			Task task = model.GetValue (iter, 0) as Task;
-			if (task == null)
+			TaskModelNode node = Model.GetValue (iter, 0) as TaskModelNode;
+			if (node == null || node.IsSeparator)
 				return;
 			
-			if (task.State != TaskState.Inactive) {
+			if (node.Task.State != TaskState.Inactive) {
 				// The task is not in the inactive state so don't show any icon
 				crp.Pixbuf = null;
 				return;
@@ -393,7 +442,7 @@
 			
 			//Logger.Debug ("TaskTimerCellDataFunc ()\n\tNow.Ticks: {0}\n\tCompletionDate.Ticks: {1}",
 			//				DateTime.Now.Ticks, task.CompletionDate.Ticks);
-			long elapsedTicks = DateTime.Now.Ticks - task.CompletionDate.Ticks;
+			long elapsedTicks = DateTime.Now.Ticks - node.Task.CompletionDate.Ticks;
 			//Logger.Debug ("\tElapsed Ticks: {0}", elapsedTicks);
 			long elapsedMillis = elapsedTicks / 10000;
 			//Logger.Debug ("\tElapsed Milliseconds: {0}", elapsedMillis);
@@ -453,17 +502,23 @@
 										   Gtk.TreeIter iter)
 		{
 			// Filter out deleted tasks
-			Task task = model.GetValue (iter, 0) as Task;
+			TaskModelNode node = model.GetValue (iter, 0) as TaskModelNode;
 			
-			if (task.State == TaskState.Deleted) {
+			if(node == null)
+				return false;
+				
+			if(node.IsSeparator)
+				return true;
+				
+			if (node.Task.State == TaskState.Deleted) {
 				//Logger.Debug ("TaskTreeView.FilterFunc:\n\t{0}\n\t{1}\n\tReturning false", task.Name, task.State);  
 				return false;
 			}
 			
 			if (filterCategory == null)
 				return true;
-			
-			return filterCategory.ContainsTask (task);
+				
+			return filterCategory.ContainsTask (node.Task);
 		}
 		#endregion // Private Methods
 		
@@ -475,15 +530,15 @@
 			Gtk.TreePath path = new Gtk.TreePath (args.Path);
 			if (Model.GetIter (out iter, path) == false)
 				return; // Do nothing
-			
-			Task task = Model.GetValue (iter, 0) as Task;
-			if (task == null)
+
+			TaskModelNode node = Model.GetValue (iter, 0) as TaskModelNode;			
+			if (node == null)
 				return;
 
 			// remove any timer set up on this task			
-			InactivateTimer.CancelTimer(task);
+			InactivateTimer.CancelTimer(node.Task);
 			
-			if (task.State == TaskState.Active) {
+			if (node.Task.State == TaskState.Active) {
 				bool showCompletedTasks =
 					Application.Preferences.GetBool (
 						Preferences.ShowCompletedTasksKey);
@@ -492,20 +547,20 @@
 				// away.  Otherwise, set a timer and show the timer animation
 				// before marking the task completed.
 				if (showCompletedTasks == true) {
-					task.Complete ();
+					node.Task.Complete ();
 				} else {
-					task.Inactivate ();
+					node.Task.Inactivate ();
 					
 					// Read the inactivate timeout from a preference
 					int timeout =
 						Application.Preferences.GetInt (Preferences.InactivateTimeoutKey);
 					Logger.Debug ("Read timeout from prefs: {0}", timeout);
 					InactivateTimer timer =
-						new InactivateTimer (this, iter, task, (uint) timeout);
+						new InactivateTimer (this, iter, node.Task, (uint) timeout);
 					timer.StartTimer ();
 				}
 			} else {
-				task.Activate ();
+				node.Task.Activate ();
 			}
 		}
 
@@ -527,9 +582,10 @@
 				newPriority = TaskPriority.None;
 
 			// Update the priority if it's different
-			Task task = Model.GetValue (iter, 0) as Task;
-			if (task.Priority != newPriority)
-				task.Priority = newPriority;
+			
+			TaskModelNode node = Model.GetValue (iter, 0) as TaskModelNode;
+			if (node.Task.Priority != newPriority)
+				node.Task.Priority = newPriority;
 		}
 		
 		void OnTaskNameEdited (object sender, Gtk.EditedArgs args)
@@ -539,27 +595,27 @@
 			if (Model.GetIter (out iter, path) == false)
 				return;
 			
-			Task task = Model.GetValue (iter, 0) as Task;
-			if (task == null)
+			TaskModelNode node = Model.GetValue (iter, 0) as TaskModelNode;
+			if (node == null)
 				return;
 			
 			string newText = args.NewText;
 			
 			// Attempt to derive due date information from text.
 			if (Application.Preferences.GetBool (Preferences.ParseDateEnabledKey) &&
-			    task.State == TaskState.Active &&
-			    task.DueDate == DateTime.MinValue) {
+			    node.Task.State == TaskState.Active &&
+			    node.Task.DueDate == DateTime.MinValue) {
 				
 				string parsedTaskText;
 				DateTime parsedDueDate;
 				Utilities.ParseTaskText (newText, out parsedTaskText, out parsedDueDate);
 				
 				if (parsedDueDate != DateTime.MinValue)
-					task.DueDate = parsedDueDate;
+					node.Task.DueDate = parsedDueDate;
 				newText = parsedTaskText;
 			}
 			
-			task.Name = newText;
+			node.Task.Name = newText;
 		}
 		
 		/// <summary>
@@ -595,7 +651,7 @@
 			
 			DateTime newDate = DateTime.MinValue;
 			DateTime today = DateTime.Now;
-			Task task = Model.GetValue (iter, 0) as Task;			
+			TaskModelNode node = Model.GetValue (iter, 0) as TaskModelNode;			
 			
 			if (args.NewText.CompareTo (
 							today.ToString(Catalog.GetString("M/d - ")) + Catalog.GetString("Today") ) == 0)
@@ -609,7 +665,7 @@
 				today.AddDays(7).ToString(Catalog.GetString("M/d - ")) + Catalog.GetString("In 1 Week")	) == 0)
 				newDate = today.AddDays (7);
 			else if (args.NewText.CompareTo (Catalog.GetString ("Choose Date...")) == 0) {
-				TaskCalendar tc = new TaskCalendar(task, this.Parent);
+				TaskCalendar tc = new TaskCalendar(node.Task, this.Parent);
 				tc.ShowCalendar();
 				return;
 			} else {
@@ -623,12 +679,12 @@
 				}
 			}
 			
-			if (task.State == TaskState.Completed) {
+			if (node.Task.State == TaskState.Completed) {
 				// Modify the completion date
-				task.CompletionDate = newDate;
+				node.Task.CompletionDate = newDate;
 			} else {
 				// Modify the due date
-				task.DueDate = newDate;
+				node.Task.DueDate = newDate;
 			}
 		}
 		

Modified: branches/cache/src/TaskWindow.cs
==============================================================================
--- branches/cache/src/TaskWindow.cs	(original)
+++ branches/cache/src/TaskWindow.cs	Sat Mar 15 00:15:38 2008
@@ -52,12 +52,12 @@
 		private Gtk.ComboBox categoryComboBox;
 		private Gtk.VBox targetVBox;
 		
-		private TaskGroup overdueGroup;
-		private TaskGroup todayGroup;
-		private TaskGroup tomorrowGroup;
-		private TaskGroup nextSevenDaysGroup;
-		private TaskGroup futureGroup;
-		private CompletedTaskGroup completedTaskGroup;
+		//private TaskGroup overdueGroup;
+		//private TaskGroup todayGroup;
+		//private TaskGroup tomorrowGroup;
+		//private TaskGroup nextSevenDaysGroup;
+		//private TaskGroup futureGroup;
+		//private CompletedTaskGroup completedTaskGroup;
 		
 		private List<TaskGroup> taskGroups;
 		
@@ -72,6 +72,8 @@
 		private Gtk.AccelGroup accelGroup;
 		private GlobalKeybinder globalKeys;
 		
+		private TaskTreeView taskTreeView;
+		
 		static TaskWindow ()
 		{
 			noteIcon = Utilities.GetIcon ("note", 16);
@@ -254,8 +256,16 @@
 			rangeEnd = DateTime.Now.AddDays (-1);
 			rangeEnd = new DateTime (rangeEnd.Year, rangeEnd.Month, rangeEnd.Day,
 									 23, 59, 59);
+
+			//
+			// Group TreeView
+			//
+			taskTreeView = new TaskTreeView (Application.LocalCache.Tasks);
+			taskTreeView.Show ();
+			targetVBox.PackStart (taskTreeView, true, true, 0);
+			
 			
-			overdueGroup = new TaskGroup (Catalog.GetString ("Overdue"),
+/*			overdueGroup = new TaskGroup (Catalog.GetString ("Overdue"),
 										  rangeStart, rangeEnd,
 										  Application.LocalCache.Tasks);
 			overdueGroup.RowActivated += OnRowActivated;
@@ -349,7 +359,7 @@
 			targetVBox.PackStart (completedTaskGroup, false, false, 0);
 			taskGroups.Add (completedTaskGroup);
 			
-
+*/
 			//manualTarget = new TargetService();
 			//manualTarget.Show ();
 			//mainVBox.PackStart(manualTarget, false, false, 0);
@@ -939,12 +949,12 @@
 				categoryComboBox.Model.GetValue (iter, 0) as Category;
 				
 			// Update the TaskGroups so they can filter accordingly
-			overdueGroup.Refilter (category);
-			todayGroup.Refilter (category);
-			tomorrowGroup.Refilter (category);
-			nextSevenDaysGroup.Refilter (category);
-			futureGroup.Refilter (category);
-			completedTaskGroup.Refilter (category);
+			//overdueGroup.Refilter (category);
+			//todayGroup.Refilter (category);
+			//tomorrowGroup.Refilter (category);
+			//nextSevenDaysGroup.Refilter (category);
+			//futureGroup.Refilter (category);
+			//completedTaskGroup.Refilter (category);
 			
 			// Save the selected category in preferences
 			Application.Preferences.Set (Preferences.SelectedCategoryKey,

Modified: branches/cache/tasque.mdp
==============================================================================
--- branches/cache/tasque.mdp	(original)
+++ branches/cache/tasque.mdp	Sat Mar 15 00:15:38 2008
@@ -62,6 +62,7 @@
     <File name="src/Category.cs" subtype="Code" buildaction="Compile" />
     <File name="src/LocalCache.cs" subtype="Code" buildaction="Compile" />
     <File name="src/Database.cs" subtype="Code" buildaction="Compile" />
+    <File name="src/TaskModelNode.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="glib-sharp, Version=2.10.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />



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