Index: src/ch/StatusDlg.cpp
===================================================================
diff -u -N -re8897f4f07ba4523376c2d6599d87428424a4772 -r68bbff6670ec7d7010ced69f600493a0ae0c687c
--- src/ch/StatusDlg.cpp	(.../StatusDlg.cpp)	(revision e8897f4f07ba4523376c2d6599d87428424a4772)
+++ src/ch/StatusDlg.cpp	(.../StatusDlg.cpp)	(revision 68bbff6670ec7d7010ced69f600493a0ae0c687c)
@@ -28,6 +28,7 @@
 #include "../libchengine/TTaskManager.h"
 #include "../libchengine/TLocalFilesystem.h"
 #include "GuiOptions.h"
+#include "RuleEditDlg.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -260,7 +261,7 @@
 		return;
 
 	int iCurrentBufferIndex = 0;
-	chengine::TTaskStatsSnapshotPtr spTaskStats = m_spTaskMgrStats->GetTaskStatsForTaskID(boost::numeric_cast<chengine::taskid_t>(GetSelectedItemSessionUniqueID()));
+	chengine::TTaskStatsSnapshotPtr spTaskStats = m_spTaskMgrStats->GetTaskStatsForTaskID(boost::numeric_cast<chengine::taskid_t>(GetSelectedItemTaskID()));
 	if(spTaskStats)
 	{
 		chengine::TSubTaskStatsSnapshotPtr spSubTaskStats = spTaskStats->GetSubTasksStats().GetCurrentSubTaskSnapshot();
@@ -278,28 +279,23 @@
 
 chengine::TTaskPtr CStatusDlg::GetSelectedItemPointer()
 {
-	// returns ptr to a TTask for a given element in listview
-	if(m_ctlStatusList.GetSelectedCount() == 1)
-	{
-		POSITION pos = m_ctlStatusList.GetFirstSelectedItemPosition();
-		int nPos = m_ctlStatusList.GetNextSelectedItem(pos);
-		return m_pTasks->GetTaskByTaskID(boost::numeric_cast<chengine::taskid_t>(m_ctlStatusList.GetItemData(nPos)));
-	}
+	taskid_t taskID = GetSelectedItemTaskID();
+	if(taskID != chengine::NoTaskID)
+		return m_pTasks->GetTaskByTaskID(taskID);
 
 	return chengine::TTaskPtr();
 }
 
-size_t CStatusDlg::GetSelectedItemSessionUniqueID()
+chengine::taskid_t CStatusDlg::GetSelectedItemTaskID()
 {
-	// returns ptr to a TTask for a given element in listview
 	if(m_ctlStatusList.GetSelectedCount() == 1)
 	{
 		POSITION pos = m_ctlStatusList.GetFirstSelectedItemPosition();
 		int nPos = m_ctlStatusList.GetNextSelectedItem(pos);
-		return m_ctlStatusList.GetItemData(nPos);
+		return boost::numeric_cast<chengine::taskid_t>(m_ctlStatusList.GetItemData(nPos));
 	}
 
-	return std::numeric_limits<size_t>::max();
+	return chengine::NoTaskID;
 }
 
 void CStatusDlg::StickDialogToScreenEdge()
@@ -408,6 +404,30 @@
 		spSelectedTask->RestoreFeedbackDefaults();
 }
 
+void CStatusDlg::OnEditUserFeedback()
+{
+	chengine::TTaskPtr spSelectedTask = GetSelectedItemPointer();
+
+	if(spSelectedTask)
+	{
+		taskid_t selectedTaskID = GetSelectedItemTaskID();
+
+		FeedbackRules rules = spSelectedTask->GetFeedbackRules();
+		spSelectedTask.reset();
+
+		RuleEditDlg dlg(rules);
+		if(dlg.DoModal() == IDOK)
+		{
+			rules = dlg.GetRules();
+
+			// re-try searching for specific task to ensure it was not deleted in the meantime
+			spSelectedTask = m_pTasks->GetTaskByTaskID(selectedTaskID);
+			if(spSelectedTask)
+				spSelectedTask->SetFeedbackRules(rules);
+		}
+	}
+}
+
 void CStatusDlg::OnPauseButton() 
 {
 	chengine::TTaskPtr spTask = GetSelectedItemPointer();
@@ -594,7 +614,7 @@
 void CStatusDlg::RefreshStatus()
 {
 	// remember address of a current selection
-	size_t stSelectedTaskID = GetSelectedItemSessionUniqueID();
+	size_t stSelectedTaskID = GetSelectedItemTaskID();
 
 	// get all the stats needed
 	m_pTasks->GetStatsSnapshot(m_spTaskMgrStats);
@@ -687,6 +707,9 @@
 	case ID_TASK_MENU_RESET_FEEDBACK:
 		OnResetUserFeedback();
 		break;
+	case ID_TASK_MENU_EDIT_FEEDBACK:
+		OnEditUserFeedback();
+		break;
 
 	case ID_TASK_MENU_PAUSE_ALL:
 		OnPauseAllButton();