Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Ungureanu <marius.ungureanu@xamarin.com>2016-10-16 19:56:10 +0300
committerMarius Ungureanu <marius.ungureanu@xamarin.com>2016-10-16 19:56:10 +0300
commit21d85d91ecf382171f11ddb08aaf798231194cbb (patch)
tree939f87b2b6043b400a0a3bbe1ad50556aadc7511 /main/src/addins/MonoDevelop.HexEditor
parent02556513750dedc956574d2676a8f34dda7f2064 (diff)
[Ide] Optimize text editor drawing with selection
This avoid allocating a delegate for each time a render is issued when something is selected. (scroll, etc)
Diffstat (limited to 'main/src/addins/MonoDevelop.HexEditor')
-rw-r--r--main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/HexEditorMargin.cs12
-rw-r--r--main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/Margin.cs40
-rw-r--r--main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/TextEditorMargin.cs12
3 files changed, 56 insertions, 8 deletions
diff --git a/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/HexEditorMargin.cs b/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/HexEditorMargin.cs
index 9f5f74925d..d88c72b109 100644
--- a/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/HexEditorMargin.cs
+++ b/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/HexEditorMargin.cs
@@ -102,14 +102,18 @@ namespace Mono.MHex.Rendering
Margin.LayoutWrapper result = new LayoutWrapper (layout);
if (Data.IsSomethingSelected) {
ISegment selection = Data.MainSelection.Segment;
- HandleSelection (selection.Offset, selection.EndOffset, startOffset, endOffset, null, delegate(long start, long end) {
- result.Layout.SetForeground (Style.Selection, (int)(start - startOffset) * 3, (int)(end - start) * 3 - 1);
- result.Layout.SetBackground (Style.SelectionBg, (int)(start - startOffset) * 3, (int)(end - start) * 3 - 1);
- });
+ HandleSelection (selection.Offset, selection.EndOffset, startOffset, endOffset, this, new LayoutOffsetPair(startOffset, result.Layout), null, OnSelected);
}
return result;
}
+ static void OnSelected (long start, long end, Margin margin, LayoutOffsetPair arg)
+ {
+ var style = ((HexEditorMargin)margin).Style;
+ arg.Layout.SetForeground (style.Selection, (int)(start - arg.StartOffset) * 3, (int)(end - start) * 3 - 1);
+ arg.Layout.SetBackground (style.SelectionBg, (int)(start - arg.StartOffset) * 3, (int)(end - start) * 3 - 1);
+ }
+
uint TranslateColumn (long column)
{
return (uint)(column * 3);
diff --git a/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/Margin.cs b/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/Margin.cs
index d57aad8255..f0022c5803 100644
--- a/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/Margin.cs
+++ b/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/Margin.cs
@@ -192,6 +192,46 @@ namespace Mono.MHex.Rendering
handleNotSelected (startOffset, endOffset);
}
}
+
+ protected delegate void HandleSelectionArgsDelegate<T> (long start, long end, Margin margin, T arg);
+ protected struct LayoutOffsetPair
+ {
+ public readonly long StartOffset;
+ public readonly TextLayout Layout;
+
+ public LayoutOffsetPair (long startOffset, TextLayout layout)
+ {
+ StartOffset = startOffset;
+ Layout = layout;
+ }
+ }
+ protected static void HandleSelection<T> (long selectionStart, long selectionEnd, long startOffset, long endOffset, Margin margin, T args, HandleSelectionArgsDelegate<T> handleNotSelected, HandleSelectionArgsDelegate<T> handleSelected)
+ {
+ if (startOffset >= selectionStart && endOffset <= selectionEnd) {
+ if (handleSelected != null)
+ handleSelected (startOffset, endOffset, margin, args);
+ } else if (startOffset >= selectionStart && startOffset < selectionEnd && endOffset > selectionEnd) {
+ if (handleSelected != null)
+ handleSelected (startOffset, selectionEnd, margin, args);
+ if (handleNotSelected != null)
+ handleNotSelected (selectionEnd, endOffset, margin, args);
+ } else if (startOffset < selectionStart && endOffset > selectionStart && endOffset <= selectionEnd) {
+ if (handleNotSelected != null)
+ handleNotSelected (startOffset, selectionStart, margin, args);
+ if (handleSelected != null)
+ handleSelected (selectionStart, endOffset, margin, args);
+ } else if (startOffset < selectionStart && endOffset > selectionEnd) {
+ if (handleNotSelected != null)
+ handleNotSelected (startOffset, selectionStart, margin, args);
+ if (handleSelected != null)
+ handleSelected (selectionStart, selectionEnd, margin, args);
+ if (handleNotSelected != null)
+ handleNotSelected (selectionEnd, endOffset, margin, args);
+ } else {
+ if (handleNotSelected != null)
+ handleNotSelected (startOffset, endOffset, margin, args);
+ }
+ }
protected static uint TranslateToUTF8Index (char[] charArray, uint textIndex, ref uint curIndex, ref uint byteIndex)
{
diff --git a/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/TextEditorMargin.cs b/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/TextEditorMargin.cs
index 930a3a470b..ccdce7df99 100644
--- a/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/TextEditorMargin.cs
+++ b/main/src/addins/MonoDevelop.HexEditor/Mono.MHex.Rendering/TextEditorMargin.cs
@@ -105,14 +105,18 @@ namespace Mono.MHex.Rendering
Margin.LayoutWrapper result = new LayoutWrapper (layout);
if (Data.IsSomethingSelected) {
ISegment selection = Data.MainSelection.Segment;
- HandleSelection (selection.Offset, selection.EndOffset, startOffset, endOffset, null, delegate(long start, long end) {
- result.Layout.SetForeground (Style.Selection, (int)(start - startOffset)/2, (int)(end - start)/2);
- result.Layout.SetBackground (Style.SelectionBg, (int)(start - startOffset)/2, (int)(end - start)/2);
- });
+ HandleSelection (selection.Offset, selection.EndOffset, startOffset, endOffset, this, new LayoutOffsetPair (startOffset, result.Layout), null, OnSelected);
}
return result;
}
+ static void OnSelected (long start, long end, Margin margin, LayoutOffsetPair arg)
+ {
+ var style = ((TextEditorMargin)margin).Style;
+ arg.Layout.SetForeground (style.Selection, (int)(start - arg.StartOffset) / 2, (int)(end - start) / 2);
+ arg.Layout.SetBackground (style.SelectionBg, (int)(start - arg.StartOffset) / 2, (int)(end - start) / 2);
+ }
+
internal protected override void Draw (Context ctx, Rectangle area, long line, double x, double y)
{
ctx.Rectangle (x, y, Width, Editor.LineHeight);