diff --git a/src/AddIns/DisplayBindings/HexEditor/Project/Src/Editor.Designer.cs b/src/AddIns/DisplayBindings/HexEditor/Project/Src/Editor.Designer.cs
index e3c1e6893d..a375b0f44a 100644
--- a/src/AddIns/DisplayBindings/HexEditor/Project/Src/Editor.Designer.cs
+++ b/src/AddIns/DisplayBindings/HexEditor/Project/Src/Editor.Designer.cs
@@ -112,11 +112,11 @@ namespace HexEditor
// Editor
//
this.BackColor = System.Drawing.Color.White;
+ this.Controls.Add(this.VScrollBar);
this.Controls.Add(this.header);
this.Controls.Add(this.textView);
this.Controls.Add(this.hexView);
this.Controls.Add(this.side);
- this.Controls.Add(this.VScrollBar);
this.DoubleBuffered = true;
this.MinimumSize = new System.Drawing.Size(1, 1);
this.Name = "Editor";
diff --git a/src/AddIns/DisplayBindings/HexEditor/Project/Src/Editor.cs b/src/AddIns/DisplayBindings/HexEditor/Project/Src/Editor.cs
index c5f7bfe230..58c8c56282 100644
--- a/src/AddIns/DisplayBindings/HexEditor/Project/Src/Editor.cs
+++ b/src/AddIns/DisplayBindings/HexEditor/Project/Src/Editor.cs
@@ -136,6 +136,12 @@ namespace HexEditor
void BufferChanged(object sender, EventArgs e)
{
+ if (!Focused) {
+ selection.ValidateSelection();
+ caret.Offset = Math.Max(0, Math.Min(caret.Offset, buffer.BufferSize));
+ Point pos = GetPositionForOffset(caret.Offset, charwidth);
+ caret.SetToPosition(pos);
+ }
Invalidate();
OnDocumentChanged(EventArgs.Empty);
}
@@ -1301,6 +1307,7 @@ namespace HexEditor
break;
case Keys.Back:
e.Handled = true;
+ e.SuppressKeyPress = true;
if (hexinputmode) return;
if (selection.HasSomethingSelected) {
byte[] bytes = selection.GetSelectionBytes();
@@ -1314,8 +1321,7 @@ namespace HexEditor
} else {
byte b = buffer.GetByte(caret.Offset - 1);
- if (buffer.RemoveByte(caret.Offset - 1))
- {
+ if (buffer.RemoveByte(caret.Offset - 1)) {
if (caret.Offset > -1) caret.Offset--;
if (GetLineForOffset(caret.Offset) < topline) topline = GetLineForOffset(caret.Offset);
if (GetLineForOffset(caret.Offset) > topline + GetMaxVisibleLines() - 2) topline = GetLineForOffset(caret.Offset) - GetMaxVisibleLines() + 2;
@@ -1328,6 +1334,7 @@ namespace HexEditor
break;
case Keys.Delete:
e.Handled = true;
+ e.SuppressKeyPress = true;
if (hexinputmode) return;
if (selection.HasSomethingSelected) {
byte[] old = selection.GetSelectionBytes();
@@ -1353,6 +1360,7 @@ namespace HexEditor
case Keys.CapsLock:
case Keys.ShiftKey:
case Keys.ControlKey:
+ case Keys.Enter:
break;
case Keys.Tab:
if (activeView == hexView) {
@@ -1405,6 +1413,7 @@ namespace HexEditor
if (activeView == hexView) {
ProcessHexInput(e);
e.Handled = true;
+ e.SuppressKeyPress = true;
return;
}
@@ -1773,7 +1782,6 @@ namespace HexEditor
///
/// Calculates the max possible bytes per line.
///
- /// Int32, containing the result
internal int CalculateMaxBytesPerLine()
{
int width = Width - side.Width - 90;
@@ -1836,6 +1844,8 @@ namespace HexEditor
if (offset < buffer.BufferSize) {
return offset;
} else {
+ hexinputmodepos = 0;
+ hexinputmode = false;
return buffer.BufferSize;
}
}
@@ -1852,7 +1862,8 @@ namespace HexEditor
int line = (int)(offset / BytesPerLine) - topline;
int pline = line * fontheight - 1 * (line - 1) - 1;
int col = (offset % BytesPerLine) * underscorewidth * charwidth + 4;
- if (hexinputmode && !selectionmode && !selection.HasSomethingSelected && insertmode) col += (hexinputmodepos * underscorewidth);
+ if (hexinputmode && !selectionmode && !selection.HasSomethingSelected && insertmode)
+ col += (hexinputmodepos * underscorewidth);
return new Point(col, pline);
}
diff --git a/src/AddIns/DisplayBindings/HexEditor/Project/Src/Util/BufferManager.cs b/src/AddIns/DisplayBindings/HexEditor/Project/Src/Util/BufferManager.cs
index 721f017e5b..0f8a421c38 100644
--- a/src/AddIns/DisplayBindings/HexEditor/Project/Src/Util/BufferManager.cs
+++ b/src/AddIns/DisplayBindings/HexEditor/Project/Src/Util/BufferManager.cs
@@ -153,6 +153,7 @@ namespace HexEditor.Util
if ((offset < buffer.Count) & (offset > -1)) {
buffer.RemoveAt(offset);
file.MakeDirty(HexEditFileModelProvider.Instance);
+ OnBufferChanged(EventArgs.Empty);
return true;
}
return false;
diff --git a/src/AddIns/DisplayBindings/HexEditor/Project/Src/Util/SelectionManager.cs b/src/AddIns/DisplayBindings/HexEditor/Project/Src/Util/SelectionManager.cs
index 98184243e2..2811cadda8 100644
--- a/src/AddIns/DisplayBindings/HexEditor/Project/Src/Util/SelectionManager.cs
+++ b/src/AddIns/DisplayBindings/HexEditor/Project/Src/Util/SelectionManager.cs
@@ -80,6 +80,16 @@ namespace HexEditor.Util
{
return buffer.GetBytes(Math.Min(Start, End), Math.Abs(End - Start));
}
+
+ public void ValidateSelection()
+ {
+ int start = Math.Min(this.start, this.end);
+ int end = Math.Max(this.start, this.end);
+ start = Math.Min(Math.Max(0, start), buffer.BufferSize);
+ end = Math.Min(Math.Max(0, end), buffer.BufferSize);
+ this.start = start;
+ this.end = end;
+ }
///
/// Cleares the selection (no text is altered)