private void ListFilters_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.A) { var itemCount = this.ListFilters.Items.Count; if (itemCount == 0) return; using (ControlTransaction.Update(this.ListFilters)) { if (itemCount > 1) { try { _multiSelState |= MultiSelectionState.SelectAll; for (int i = 1; i < itemCount; i++) { this.ListFilters.SetSelected(i, true); } } finally { _multiSelState &= ~MultiSelectionState.SelectAll; } } this.ListFilters.SetSelected(0, true); } } }
private void MoveSelectedRules(bool up) { var tabIdx = ListTabs.SelectedIndex; if (tabIdx == -1 || ListFilters.SelectedIndices.Count == 0) return; var indices = ListFilters.SelectedIndices.Cast<int>().ToArray(); int diff; if (up) { if (indices[0] <= 0) return; diff = -1; } else { if (indices[indices.Length - 1] >= ListFilters.Items.Count - 1) return; diff = +1; Array.Reverse(indices); // 逆順にして、下にある要素から処理する } var lastSelIdx = indices[0] + diff; var tab = _sts.Tabs[ListTabs.Items[tabIdx].ToString()]; try { _multiSelState |= MultiSelectionState.MoveSelected; using (ControlTransaction.Update(ListFilters)) { ListFilters.SelectedIndices.Clear(); foreach (var idx in indices) { var tidx = idx + diff; var target = (PostFilterRule)ListFilters.Items[tidx]; // 移動先にある要素と位置を入れ替える ListFilters.Items.RemoveAt(tidx); ListFilters.Items.Insert(idx, target); // 移動方向の先頭要素以外なら選択する if (tidx != lastSelIdx) ListFilters.SelectedIndex = tidx; } tab.FilterArray = ListFilters.Items.Cast<PostFilterRule>().ToArray(); // 移動方向の先頭要素は最後に選択する // ※移動方向への自動スクロール目的 ListFilters.SelectedIndex = lastSelIdx; } } finally { _multiSelState &= ~MultiSelectionState.MoveSelected; } }