1 | using System;
|
---|
2 | using System.Collections.Generic;
|
---|
3 | using System.ComponentModel;
|
---|
4 | using System.Drawing;
|
---|
5 | using System.Data;
|
---|
6 | using System.Linq;
|
---|
7 | using System.Text;
|
---|
8 | using System.Windows.Forms;
|
---|
9 |
|
---|
10 | namespace HeuristicLab.PluginInfrastructure.Advanced {
|
---|
11 | internal partial class MultiSelectListView : ListView {
|
---|
12 | public MultiSelectListView() {
|
---|
13 | InitializeComponent();
|
---|
14 | }
|
---|
15 |
|
---|
16 | private bool inhibitAutoCheck;
|
---|
17 | protected override void OnMouseDown(MouseEventArgs e) {
|
---|
18 | inhibitAutoCheck = true;
|
---|
19 | base.OnMouseDown(e);
|
---|
20 | }
|
---|
21 |
|
---|
22 | protected override void OnMouseUp(MouseEventArgs e) {
|
---|
23 | base.OnMouseUp(e);
|
---|
24 | inhibitAutoCheck = false;
|
---|
25 | }
|
---|
26 |
|
---|
27 | // item check is raised for each selected item that was not directly clicked (those should be ignored)
|
---|
28 | // and then one the item whose checkbox was clicked
|
---|
29 | protected override void OnItemCheck(ItemCheckEventArgs ice) {
|
---|
30 | // don't change the checked state of items that were not clicked directly
|
---|
31 | if (inhibitAutoCheck) {
|
---|
32 | ice.NewValue = ice.CurrentValue;
|
---|
33 | }
|
---|
34 | // if this item was directly clicked then check if it is selected as well
|
---|
35 | var item = Items[ice.Index];
|
---|
36 | if (!item.Selected) {
|
---|
37 | // when the item was not selected previously
|
---|
38 | // clear any selection
|
---|
39 | List<ListViewItem> selectedItems = new List<ListViewItem>(SelectedItems.OfType<ListViewItem>());
|
---|
40 | selectedItems.ForEach(x => x.Selected = false);
|
---|
41 | // select only the clicked item
|
---|
42 | item.Selected = true;
|
---|
43 | }
|
---|
44 | base.OnItemCheck(ice);
|
---|
45 | }
|
---|
46 |
|
---|
47 | private bool suppressItemCheckedEvents;
|
---|
48 | public bool SuppressItemCheckedEvents {
|
---|
49 | get {
|
---|
50 | return suppressItemCheckedEvents;
|
---|
51 | }
|
---|
52 | set {
|
---|
53 | suppressItemCheckedEvents = value;
|
---|
54 | }
|
---|
55 | }
|
---|
56 | protected override void OnItemChecked(ItemCheckedEventArgs e) {
|
---|
57 | if (!suppressItemCheckedEvents)
|
---|
58 | base.OnItemChecked(e);
|
---|
59 | }
|
---|
60 |
|
---|
61 | public void CheckItems(IEnumerable<ListViewItem> items) {
|
---|
62 | suppressItemCheckedEvents = true;
|
---|
63 |
|
---|
64 | foreach (var item in items)
|
---|
65 | item.Checked = true;
|
---|
66 | suppressItemCheckedEvents = false;
|
---|
67 | }
|
---|
68 |
|
---|
69 | public void UncheckItems(IEnumerable<ListViewItem> items) {
|
---|
70 | suppressItemCheckedEvents = true;
|
---|
71 |
|
---|
72 | foreach (var item in items)
|
---|
73 | item.Checked = false;
|
---|
74 | suppressItemCheckedEvents = false;
|
---|
75 | }
|
---|
76 |
|
---|
77 | }
|
---|
78 | }
|
---|