//attempts to guess groupings for ans public void GuessGroup(ShAnswer ans) { string anstxt = System.Text.RegularExpressions.Regex.Replace(ans.Text, "\\W", "").ToLower(); foreach (ShGroup grp in ans.Group.Question.Groups) { if (grp == ans.Group) { continue; } if (System.Text.RegularExpressions.Regex.Replace(grp.Text, "\\W", "").ToLower() == anstxt) { ans.ChangeGroup(grp); return; } } //didn't find any but let's try individual answers foreach (ShGroup grp in ans.Group.Question.Groups) { if (grp == ans.Group) { continue; } foreach (ShAnswer ans2 in grp.Answers) { if (System.Text.RegularExpressions.Regex.Replace(ans2.Text, "\\W", "").ToLower() == anstxt) { ans.ChangeGroup(grp); return; } } } }
//right click menu - create a new group with this answer private void RCM_move_to_new_group_Click(object sender, EventArgs e) { TreeNode clicked_node = RCM_answer.Tag as TreeNode; if (clicked_node == null) { return; } ShAnswer ans = clicked_node.Tag as ShAnswer; if (ans == null) { return; } ShGroup newGroup = ans.Group.Question.StartNewGroup(ans.Text); ans.ChangeGroup(newGroup); TreeNode prevParent = clicked_node.Parent; TreeNode newParent = treeView1.Nodes.Add("b"); newParent.Tag = newGroup; prevParent.Nodes.Remove(clicked_node); newParent.Nodes.Add(clicked_node); newParent.Expand(); //if prevParent is empty, delete it if (prevParent.Nodes.Count == 0) { prevParent.Remove(); } sheep_modified = true; SetTextForAllTreenodes(); }
//main drag/drop function private void treeView1_DragDrop(object sender, DragEventArgs e) { //stop sorting while dragging treeView1.TreeViewNodeSorter = null; Point cp = treeView1.PointToClient(new Point(e.X, e.Y)); TreeNode destNode = treeView1.GetNodeAt(cp); //don't continue if not a valid node if (!e.Data.GetDataPresent(typeof(TreeNode))) { return; } // treeView1.BeginUpdate(); TreeNode movingNode = (TreeNode)e.Data.GetData(typeof(TreeNode)); TreeNode prevParent, newParent; ShQuestion curQuestion = sg.Questions[cur_q_index]; //different code depending on what type of thing we're dragging/dragging to if (movingNode.Tag.GetType() == typeof(ShAnswer) && destNode.Tag.GetType() == typeof(ShAnswer)) { //moving an answer to another answer ShAnswer ansToMove = (ShAnswer)movingNode.Tag; ShAnswer destAnswer = (ShAnswer)destNode.Tag; ansToMove.ChangeGroup(destAnswer.Group); prevParent = movingNode.Parent; newParent = destNode.Parent; prevParent.Nodes.Remove(movingNode); newParent.Nodes.Add(movingNode); } else if (movingNode.Tag.GetType() == typeof(ShAnswer) && destNode.Tag.GetType() == typeof(ShGroup)) { //moving an answer to another group ShAnswer ansToMove = (ShAnswer)movingNode.Tag; ShGroup destGroup = (ShGroup)destNode.Tag; ansToMove.ChangeGroup(destGroup); prevParent = movingNode.Parent; newParent = destNode; prevParent.Nodes.Remove(movingNode); newParent.Nodes.Add(movingNode); } else if (movingNode.Tag.GetType() == typeof(ShGroup) && destNode.Tag.GetType() == typeof(ShAnswer)) { //moving a group to an answer ShGroup grpToMove = (ShGroup)movingNode.Tag; ShAnswer destAnswer = (ShAnswer)destNode.Tag; grpToMove.MergeToGroup(destAnswer.Group); prevParent = movingNode; newParent = destNode.Parent; List <TreeNode> ansNodes = new List <TreeNode>(prevParent.Nodes.Cast <TreeNode>()); foreach (TreeNode nod in ansNodes) { prevParent.Nodes.Remove(nod); newParent.Nodes.Add(nod); } } else if (movingNode.Tag.GetType() == typeof(ShGroup) && destNode.Tag.GetType() == typeof(ShGroup)) { //moving a group to a group ShGroup grpToMove = (ShGroup)movingNode.Tag; ShGroup destGroup = (ShGroup)destNode.Tag; grpToMove.MergeToGroup(destGroup); prevParent = movingNode; newParent = destNode; List <TreeNode> ansNodes = new List <TreeNode>(prevParent.Nodes.Cast <TreeNode>()); foreach (TreeNode nod in ansNodes) { prevParent.Nodes.Remove(nod); newParent.Nodes.Add(nod); } } else { treeView1.EndUpdate(); return; } //if prevParent is empty, delete it if (prevParent.Nodes.Count == 0) { prevParent.Remove(); } SetTextForAllTreenodes(); sheep_modified = true; treeView1.EndUpdate(); }