PageRenderTime 45ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/QuestTracker.QuestControls/QuestGroupControl.cs

#
C# | 474 lines | 380 code | 92 blank | 2 comment | 45 complexity | 5306bfd60c221b852f4874c5f118f542 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Windows.Forms;
  7. using QuestTracker.Data;
  8. namespace QuestTracker.QuestControls
  9. {
  10. public partial class QuestGroupControl : UserControl
  11. {
  12. private bool collapsed;
  13. private QuestGroup questGroup;
  14. private string currentName;
  15. public List<QuestControl> QuestControls { get; set; }
  16. public bool ShowCompleted { get; set; }
  17. public QuestGroup QuestGroup
  18. {
  19. get { return questGroup; }
  20. set
  21. {
  22. questGroup = value;
  23. SetQuestName(true);
  24. collapsed = questGroup.Collapsed;
  25. }
  26. }
  27. public QuestGroupControl()
  28. {
  29. InitializeComponent();
  30. collapsed = false;
  31. questGroup = new QuestGroup();
  32. QuestControls = new List<QuestControl>();
  33. }
  34. private void SetQuestName(bool showCount)
  35. {
  36. var completedQuests = from Quest quest in questGroup.Quests
  37. where quest.Completed
  38. select quest;
  39. var questCount = new StringBuilder();
  40. if (showCount)
  41. {
  42. questCount.Append(" (");
  43. questCount.Append(completedQuests.Count());
  44. questCount.Append(" completed of ");
  45. questCount.Append(questGroup.Quests.Count);
  46. questCount.Append(")");
  47. }
  48. name.Text = questGroup.Name + questCount;
  49. }
  50. public void RenderCollapseState()
  51. {
  52. if (collapsed)
  53. {
  54. RenderCollapsed();
  55. }
  56. else
  57. {
  58. RenderExpanded();
  59. }
  60. }
  61. public void RenderCollapsed()
  62. {
  63. Height = 24;
  64. addQuest.Visible = false; //otherwise addQuest will be the only visible control in the group.
  65. expand.Image = Properties.Resources.expand;
  66. }
  67. private void RenderExpanded()
  68. {
  69. addQuest.Visible = true;
  70. expand.Image = Properties.Resources.collapse;
  71. SetHeight();
  72. }
  73. private void SetHeight()
  74. {
  75. var newHeight = 48 + Controls.OfType<QuestControl>().Where(control => control.Visible).Sum(control => 24);
  76. Height = newHeight;
  77. }
  78. private void RenderCompletionBased()
  79. {
  80. foreach (var questControl in Controls.OfType<QuestControl>())
  81. {
  82. questControl.SetNormalBackcolor();
  83. if (questControl.Quest.Completed)
  84. {
  85. questControl.Visible = ShowCompleted;
  86. }
  87. }
  88. }
  89. private void AddQuestControl(QuestControl questControl)
  90. {
  91. var questLog = QuestTabControl.GetQuestTab(this);
  92. questControl.Dock = DockStyle.Top;
  93. questControl.SetNormalBackcolor();
  94. if (questControl.Quest.Completed)
  95. {
  96. questControl.Visible = ShowCompleted;
  97. }
  98. Controls.Add(questControl);
  99. QuestControls.Add(questControl);
  100. questLog.QuestControls.Add(questControl);
  101. questControl.BringToFront();
  102. }
  103. private void QuestGroupControl_Enter(object sender, EventArgs e)
  104. {
  105. SetHighlightedBackcolor();
  106. if (ParentForm == null)
  107. return;
  108. var questLog = QuestTabControl.GetQuestTab(this);
  109. questLog.RestoreAllGroups();
  110. if (questLog.LastSelectedQuestControl != null)
  111. questLog.LastSelectedQuestControl.SetNormalBackcolor();
  112. questLog.LastSelectedQuest = null;
  113. questLog.LastSelectedQuestControl = null;
  114. questLog.LastSelectedQuestGroup = questGroup;
  115. questLog.LastSelectedQuestGroupControl = this;
  116. questLog.ChangeSelectedQuest();
  117. }
  118. private void SetHighlightedBackcolor()
  119. {
  120. name.BackColor = SystemColors.Highlight;
  121. selected.BackColor = SystemColors.Highlight;
  122. expand.BackColor = SystemColors.Highlight;
  123. name.ForeColor = SystemColors.HighlightText;
  124. }
  125. public void QuestGroupControl_Leave(object sender, EventArgs e)
  126. {
  127. SetNormalBackcolor();
  128. rename.Visible = false;
  129. }
  130. public void SetNormalBackcolor()
  131. {
  132. name.BackColor = SystemColors.Control;
  133. selected.BackColor = SystemColors.Control;
  134. expand.BackColor = SystemColors.Control;
  135. name.ForeColor = SystemColors.ControlText;
  136. }
  137. private void name_Click(object sender, EventArgs e)
  138. {
  139. name.Focus();
  140. }
  141. private void panel_Resize(object sender, EventArgs e)
  142. {
  143. if (rename.Visible)
  144. rename.Width = Width - rename.Left - 2;
  145. }
  146. public void name_DoubleClick(object sender, EventArgs e)
  147. {
  148. StartRenameGroup();
  149. }
  150. private void StartRenameGroup()
  151. {
  152. rename.Width = Width - rename.Left - 2;
  153. rename.Text = questGroup.Name;
  154. currentName = questGroup.Name;
  155. rename.Visible = true;
  156. rename.SelectAll();
  157. rename.Focus();
  158. }
  159. private void selected_CheckedChanged(object sender, EventArgs e)
  160. {
  161. if (selected.Focused)
  162. {
  163. foreach (var questControl in Controls.OfType<QuestControl>())
  164. {
  165. questControl.selected.Checked = selected.Checked;
  166. }
  167. }
  168. var mainForm = QuestTabControl.GetQuestTab(this);
  169. mainForm.SetSelectionPlurality();
  170. }
  171. private void expand_Click(object sender, EventArgs e)
  172. {
  173. expand.Focus();
  174. collapsed = !collapsed;
  175. questGroup.Collapsed = collapsed;
  176. RenderCollapseState();
  177. }
  178. private void rename_TextChanged(object sender, EventArgs e)
  179. {
  180. questGroup.Name = rename.Text.Trim().Replace("\r", "").Replace("\n", "");
  181. }
  182. private void rename_KeyPress(object sender, KeyPressEventArgs e)
  183. {
  184. if (e.KeyChar != '\r')
  185. return;
  186. rename.SelectionLength = 0;
  187. rename.Visible = false;
  188. SetQuestName(true);
  189. name.Focus();
  190. }
  191. private void rename_KeyDown(object sender, KeyEventArgs e)
  192. {
  193. if (e.KeyCode != Keys.Escape)
  194. return;
  195. rename.Text = currentName;
  196. rename.Visible = false;
  197. name.Focus();
  198. }
  199. private void QuestGroupControl_DragEnter(object sender, DragEventArgs e)
  200. {
  201. if (e.Data.GetDataPresent(typeof(QuestControl)))
  202. e.Effect = DragDropEffects.Move;
  203. else if (e.Data.GetDataPresent(typeof(QuestGroupControl)))
  204. e.Effect = DragDropEffects.Move;
  205. }
  206. private void QuestGroupControl_DragDrop(object sender, DragEventArgs e)
  207. {
  208. if (e.Data.GetDataPresent(typeof(QuestControl)))
  209. {
  210. var data = (QuestControl)e.Data.GetData(typeof(QuestControl));
  211. var questTabControl = QuestTabControl.GetQuestTab(this);
  212. var questScrollOffset = questTabControl.quests.VerticalScroll.Value;
  213. if (data == null)
  214. return;
  215. var tempQuestControls = new List<QuestControl>();
  216. for (var i = Controls.Count - 1; i >= 0; i--)
  217. {
  218. if (!(Controls[i] is QuestControl))
  219. continue;
  220. var control = (QuestControl)Controls[i];
  221. if (control.PointToScreen(new Point(0, 0)).Y <= Cursor.Position.Y - 12)
  222. continue;
  223. if (control != data)
  224. tempQuestControls.Add(control);
  225. }
  226. var questLogControl = QuestLogControl.GetQuestLog(this);
  227. questLogControl.LastSelectedQuestGroup.Quests.Remove(data.Quest);
  228. foreach (var control in tempQuestControls)
  229. {
  230. questGroup.Quests.Remove(control.Quest);
  231. }
  232. questGroup.Quests.Add(data.Quest);
  233. foreach (var control in tempQuestControls)
  234. {
  235. questGroup.Quests.Add(control.Quest);
  236. }
  237. line.Visible = false;
  238. questLogControl.LastSelectedQuestGroupControl.RenderGroup();
  239. RenderGroup();
  240. questTabControl.LastSelectedQuest = data.Quest;
  241. var questControl = (from Control control in Controls.Cast<Control>()
  242. where control is QuestControl && ((QuestControl)control).Quest == data.Quest
  243. select (QuestControl)control).First();
  244. questControl.Focus();
  245. questControl.SetHighlightedBackcolor();
  246. questControl.selected.Checked = data.selected.Checked;
  247. questTabControl.quests.VerticalScroll.Value = Math.Min(questScrollOffset, questTabControl.quests.VerticalScroll.Maximum);
  248. }
  249. else if (e.Data.GetDataPresent(typeof(QuestGroupControl)))
  250. {
  251. var questTabControl = QuestTabControl.GetQuestTab(this);
  252. questTabControl.RestoreAllGroups();
  253. questTabControl.quests_DragDrop(sender, e);
  254. }
  255. }
  256. private void QuestGroupControl_DragOver(object sender, DragEventArgs e)
  257. {
  258. if (e.Data.GetDataPresent(typeof(QuestControl)))
  259. {
  260. var indicatorY = Cursor.Position.Y - PointToScreen(new Point(0, 0)).Y;
  261. line.Top = Math.Min(Math.Max((indicatorY + 12) / 24 * 24, 24), Height - 24) - 1;
  262. line.Width = Width;
  263. line.Visible = true;
  264. line.BringToFront();
  265. }
  266. QuestTabControl.GetQuestTab(this).quests_DragOver(sender, e);
  267. }
  268. private void QuestGroupControl_DragLeave(object sender, EventArgs e)
  269. {
  270. line.Visible = false;
  271. }
  272. public void RenderGroup()
  273. {
  274. SetQuestName(true);
  275. //remove controls that aren't in the group
  276. var controlsToDelete = (from Control questControl in Controls.Cast<Control>()
  277. where questControl is QuestControl && !questGroup.Quests.Contains(((QuestControl)questControl).Quest)
  278. select questControl).ToList();
  279. foreach (QuestControl questControl in controlsToDelete)
  280. {
  281. RemoveQuestControl(questControl);
  282. }
  283. //add new controls that are in the group
  284. var questsInControls = from Control questControl in Controls.Cast<Control>()
  285. where questControl is QuestControl
  286. select ((QuestControl)questControl).Quest;
  287. var questsToAdd = from Quest quest in questGroup.Quests
  288. where !questsInControls.Contains(quest)
  289. select quest;
  290. foreach (var questControl in questsToAdd.Select(quest => new QuestControl {Quest = quest, TabStop = false}))
  291. {
  292. AddQuestControl(questControl);
  293. }
  294. FixZOrder();
  295. RenderCompletionBased();
  296. RenderCollapseState();
  297. }
  298. private void FixZOrder()
  299. {
  300. var questControlsOrdered = (from QuestControl questControl in Controls.OfType<QuestControl>()
  301. orderby questGroup.Quests.IndexOf(questControl.Quest) descending
  302. select questControl).ToArray();
  303. var i = -1;
  304. foreach (var questControl in questControlsOrdered)
  305. {
  306. do
  307. {
  308. i++;
  309. } while (!(Controls[i] is QuestControl));
  310. if (Controls[i] != questControl)
  311. Controls.SetChildIndex(questControl, i);
  312. }
  313. }
  314. private void RemoveQuestControl(QuestControl questControl)
  315. {
  316. if (questControl.Visible)
  317. Height -= 24;
  318. Controls.Remove(questControl);
  319. QuestControls.Remove(questControl);
  320. var questLog = QuestTabControl.GetQuestTab(this);
  321. questLog.QuestControls.Remove(questControl);
  322. }
  323. private void QuestGroupControl_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
  324. {
  325. switch (e.KeyCode)
  326. {
  327. case Keys.F2:
  328. name_DoubleClick(sender, e);
  329. break;
  330. case Keys.Delete:
  331. {
  332. var questLog = QuestLogControl.GetQuestLog(this);
  333. selected.Checked = true;
  334. foreach (var questControl in QuestControls)
  335. questControl.selected.Checked = true;
  336. questLog.DeleteQuests();
  337. }
  338. break;
  339. case Keys.N:
  340. if (e.Control)
  341. {
  342. AddNewQuest(sender, e);
  343. }
  344. break;
  345. }
  346. }
  347. public void AddNewQuest(object sender, EventArgs e)
  348. {
  349. var newQuest = new Quest();
  350. questGroup.Quests.Add(newQuest);
  351. RenderGroup();
  352. var questLog = QuestTabControl.GetQuestTab(this);
  353. if (questLog.LastSelectedQuestControl != null)
  354. questLog.LastSelectedQuestControl.QuestControl_Leave(sender, e);
  355. questLog.LastSelectedQuest = newQuest;
  356. if (questLog.LastSelectedQuestControl != null)
  357. questLog.LastSelectedQuestControl.name_DoubleClick(sender, e);
  358. }
  359. private void rename_VisibleChanged(object sender, EventArgs e)
  360. {
  361. SetQuestName(true);
  362. }
  363. private void QuestGroupControl_MouseMove(object sender, MouseEventArgs e)
  364. {
  365. if ((Cursor.Position.Y >= PointToScreen(new Point(0, 0)).Y && Cursor.Position.Y <= PointToScreen(new Point(0, 23)).Y) || MouseButtons != MouseButtons.Left)
  366. return;
  367. Focus();
  368. QuestTabControl.GetQuestTab(this).CollapseAllGroups();
  369. SetHighlightedBackcolor();
  370. DoDragDrop(this, DragDropEffects.Move);
  371. }
  372. private void renameGroupToolStripMenuItem_Click(object sender, EventArgs e)
  373. {
  374. StartRenameGroup();
  375. }
  376. private void timeboxGroupToolStripMenuItem_Click(object sender, EventArgs e)
  377. {
  378. var timebox = new Timebox(questGroup);
  379. timebox.Show(ParentForm);
  380. }
  381. }
  382. }