//Ctrl押しながら100件一気にマージ private bool AddressList_KeyDownWithCtrl(object sender, KeyEventArgs e) { if (!e.Control) { return(false); } int index = this.AddressList.SelectedIndex; if (index < 0 || index >= this.ChangeDataList.Count) { return(false); } int limit = Math.Min(index + 100, this.ChangeDataList.Count); uint startaddr = this.ChangeDataList[index].addr; Undo.UndoData undodata = Program.Undo.NewUndoData("marge " + U.To0xHexString(startaddr) + " With Control"); for (; index < limit; index++) { ChangeDataSt code = this.ChangeDataList[index]; byte[] bin; if (e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1) { bin = U.subrange(this.AData, code.addr, code.addr + code.length); code.SetMargeMethod(MargeMethod.A); } else if (e.KeyCode == Keys.D2 || e.KeyCode == Keys.NumPad2) { bin = U.subrange(this.BData, code.addr, code.addr + code.length); code.SetMargeMethod(MargeMethod.B); } else if (e.KeyCode == Keys.D3 || e.KeyCode == Keys.NumPad3) { bin = U.subrange(this.CData, code.addr, code.addr + code.length); code.SetMargeMethod(MargeMethod.C); } else if (e.KeyCode == Keys.D0 || e.KeyCode == Keys.NumPad0) { bin = U.subrange(this.CData, code.addr, code.addr + code.length); code.SetMargeMethod(MargeMethod.NONE); } else { return(false); } if (Program.ROM.Data.Length < code.addr + bin.Length) { Program.ROM.write_resize_data(code.addr + (uint)bin.Length); } Program.ROM.write_range(code.addr, bin, undodata); } InputFormRef.ShowWriteNotifyAnimation(this, startaddr); Program.Undo.Push(undodata); if (!e.Shift) {//面倒なので操作を逆にする. Shiftが押されていなければ、次へ移動する. if (index < this.AddressList.Items.Count) { this.AddressList.SelectedIndex = index; } else { this.AddressList.SelectedIndex = this.AddressList.Items.Count - 1; } } this.AddressList.Invalidate(); UpdateTitle(); return(true); }
private void AddressList_KeyDown(object sender, KeyEventArgs e) { if (AddressList_KeyDownWithCtrl(sender, e)) { return; } int index = this.AddressList.SelectedIndex; if (index < 0 || index >= this.ChangeDataList.Count) { return; } ChangeDataSt code = this.ChangeDataList[index]; byte[] bin; if (e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1) { bin = U.subrange(this.AData, code.addr, code.addr + code.length); code.SetMargeMethod(MargeMethod.A); } else if (e.KeyCode == Keys.D2 || e.KeyCode == Keys.NumPad2) { bin = U.subrange(this.BData, code.addr, code.addr + code.length); code.SetMargeMethod(MargeMethod.B); } else if (e.KeyCode == Keys.D3 || e.KeyCode == Keys.NumPad3) { bin = U.subrange(this.CData, code.addr, code.addr + code.length); code.SetMargeMethod(MargeMethod.C); } else if (e.KeyCode == Keys.D0 || e.KeyCode == Keys.NumPad0) { bin = U.subrange(this.CData, code.addr, code.addr + code.length); code.SetMargeMethod(MargeMethod.NONE); } else if (e.KeyCode == Keys.M) { code.ToggleMark(); this.AddressList.InvalidateLine(); return; } else if (e.KeyCode == Keys.L) { MarkListButton_Click(sender, e); return; } else { return; } Program.Undo.Push("marge " + U.To0xHexString(code.addr), code.addr, (uint)bin.Length); if (Program.ROM.Data.Length < code.addr + bin.Length) { Program.ROM.write_resize_data(code.addr + (uint)bin.Length); } Program.ROM.write_range(code.addr, bin); InputFormRef.ShowWriteNotifyAnimation(this, code.addr); if (!e.Shift) {//面倒なので操作を逆にする. Shiftが押されていなければ、次へ移動する. if (this.AddressList.SelectedIndex + 1 < this.AddressList.Items.Count) { this.AddressList.SelectedIndex++; } else { this.AddressList.SelectedIndex = this.AddressList.Items.Count - 1; this.AddressList.InvalidateLine(); } } else { this.AddressList.InvalidateLine(); } UpdateTitle(); }