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:
Diffstat (limited to 'main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/MonoTextEditor.cs')
-rw-r--r--main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/MonoTextEditor.cs1269
1 files changed, 1269 insertions, 0 deletions
diff --git a/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/MonoTextEditor.cs b/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/MonoTextEditor.cs
new file mode 100644
index 0000000000..29c4bde505
--- /dev/null
+++ b/main/src/core/Mono.Texteditor/Mono.TextEditor/Gui/MonoTextEditor.cs
@@ -0,0 +1,1269 @@
+//
+// TextEditor.cs
+//
+// Author:
+// Mike Krüger <mkrueger@xamarin.com>
+//
+// Copyright (c) 2012 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Linq;
+using System.Diagnostics;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading;
+using Mono.TextEditor.Highlighting;
+using Mono.TextEditor.PopupWindow;
+using Mono.TextEditor.Theatrics;
+
+using Gdk;
+using Gtk;
+
+namespace Mono.TextEditor
+{
+ [System.ComponentModel.Category("Mono.TextEditor")]
+ [System.ComponentModel.ToolboxItem(true)]
+ public class MonoTextEditor : Container
+ {
+ readonly TextArea textArea;
+
+ internal LayoutCache LayoutCache {
+ get;
+ private set;
+ }
+
+ internal bool IsInKeypress {
+ get { return textArea.IsInKeypress; }
+ }
+
+ public TextArea TextArea {
+ get {
+ return textArea;
+ }
+ }
+
+ public MonoTextEditor () : this(new TextDocument ())
+ {
+ }
+
+ public MonoTextEditor (TextDocument doc)
+ : this (doc, null)
+ {
+ }
+
+ public MonoTextEditor (TextDocument doc, ITextEditorOptions options)
+ : this (doc, options, new SimpleEditMode ())
+ {
+ }
+
+ public MonoTextEditor (TextDocument doc, ITextEditorOptions options, EditMode initialMode)
+ {
+ GtkWorkarounds.FixContainerLeak (this);
+ WidgetFlags |= WidgetFlags.NoWindow;
+ LayoutCache = new LayoutCache (this);
+ this.textArea = new TextArea (doc, options, initialMode);
+ this.textArea.Initialize (this, doc, options, initialMode);
+ this.textArea.EditorOptionsChanged += (sender, e) => OptionsChanged (sender, e);
+ AddTopLevelWidget (textArea, 0, 0);
+ ShowAll ();
+
+ stage.ActorStep += OnActorStep;
+ if (Platform.IsMac) {
+ VScroll += delegate {
+ for (int i = 1; i < containerChildren.Count; i++) {
+ containerChildren[i].Child.QueueDraw ();
+ }
+ };
+ HScroll += delegate {
+ for (int i = 1; i < containerChildren.Count; i++) {
+ containerChildren[i].Child.QueueDraw ();
+ }
+ };
+ }
+ }
+
+ public new void GrabFocus ()
+ {
+ TextArea.GrabFocus ();
+ }
+
+ protected override void OnDestroyed ()
+ {
+ base.OnDestroyed ();
+ UnregisterAdjustments ();
+ LayoutCache.Dispose ();
+ }
+
+ void UnregisterAdjustments ()
+ {
+ if (vAdjustement != null)
+ vAdjustement.ValueChanged -= HandleAdjustmentValueChange;
+ if (hAdjustement != null)
+ hAdjustement.ValueChanged -= HandleAdjustmentValueChange;
+ vAdjustement = null;
+ hAdjustement = null;
+ }
+
+ Adjustment hAdjustement;
+ Adjustment vAdjustement;
+ protected override void OnSetScrollAdjustments (Adjustment hAdjustement, Adjustment vAdjustement)
+ {
+ UnregisterAdjustments ();
+ this.vAdjustement = vAdjustement;
+ this.hAdjustement = hAdjustement;
+ base.OnSetScrollAdjustments (hAdjustement, vAdjustement);
+ textArea.SetTextEditorScrollAdjustments (hAdjustement, vAdjustement);
+ if (hAdjustement != null) {
+ hAdjustement.ValueChanged += HandleAdjustmentValueChange;
+ }
+
+ if (vAdjustement != null) {
+ vAdjustement.ValueChanged += HandleAdjustmentValueChange;
+ }
+ OnScrollAdjustmentsSet ();
+ }
+
+ void HandleAdjustmentValueChange (object sender, EventArgs e)
+ {
+ SetChildrenPositions (Allocation);
+ }
+
+ protected virtual void OnScrollAdjustmentsSet ()
+ {
+ }
+
+ protected override void OnSizeAllocated (Rectangle allocation)
+ {
+ base.OnSizeAllocated (allocation);
+ CurrentMode.AllocateTextArea (this, textArea, allocation);
+ SetChildrenPositions (allocation);
+ }
+
+ protected override void OnSizeRequested (ref Requisition requisition)
+ {
+ base.OnSizeRequested (ref requisition);
+ containerChildren.ForEach (c => c.Child.SizeRequest ());
+ }
+
+ #region Container
+ public override ContainerChild this [Widget w] {
+ get {
+ return containerChildren.FirstOrDefault (info => info.Child == w || (info.Child is AnimatedWidget && ((AnimatedWidget)info.Child).Widget == w));
+ }
+ }
+
+ public class EditorContainerChild : Container.ContainerChild
+ {
+ public int X { get; set; }
+ public int Y { get; set; }
+ public bool FixedPosition { get; set; }
+ public EditorContainerChild (Container parent, Widget child) : base (parent, child)
+ {
+ }
+ }
+
+ public override GLib.GType ChildType ()
+ {
+ return Gtk.Widget.GType;
+ }
+
+ internal List<EditorContainerChild> containerChildren = new List<EditorContainerChild> ();
+
+ public void AddTopLevelWidget (Gtk.Widget widget, int x, int y)
+ {
+ widget.Parent = this;
+ EditorContainerChild info = new EditorContainerChild (this, widget);
+ info.X = x;
+ info.Y = y;
+ containerChildren.Add (info);
+ SetAdjustments ();
+ }
+
+ public void MoveTopLevelWidget (Gtk.Widget widget, int x, int y)
+ {
+ foreach (EditorContainerChild info in containerChildren.ToArray ()) {
+ if (info.Child == widget || (info.Child is AnimatedWidget && ((AnimatedWidget)info.Child).Widget == widget)) {
+ if (info.X == x && info.Y == y)
+ break;
+ info.X = x;
+ info.Y = y;
+ if (widget.Visible)
+ ResizeChild (Allocation, info);
+ break;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Returns the position of an embedded widget
+ /// </summary>
+ public void GetTopLevelWidgetPosition (Gtk.Widget widget, out int x, out int y)
+ {
+ foreach (EditorContainerChild info in containerChildren.ToArray ()) {
+ if (info.Child == widget || (info.Child is AnimatedWidget && ((AnimatedWidget)info.Child).Widget == widget)) {
+ x = info.X;
+ y = info.Y;
+ return;
+ }
+ }
+ x = y = 0;
+ }
+
+ public void MoveToTop (Gtk.Widget widget)
+ {
+ EditorContainerChild editorContainerChild = containerChildren.FirstOrDefault (c => c.Child == widget);
+ if (editorContainerChild == null)
+ throw new Exception ("child " + widget + " not found.");
+ List<EditorContainerChild> newChilds = new List<EditorContainerChild> (containerChildren.Where (child => child != editorContainerChild));
+ newChilds.Add (editorContainerChild);
+ this.containerChildren = newChilds;
+ widget.GdkWindow.Raise ();
+ }
+
+ protected override void OnAdded (Widget widget)
+ {
+ AddTopLevelWidget (widget, 0, 0);
+ }
+
+ protected override void OnRemoved (Widget widget)
+ {
+ foreach (EditorContainerChild info in containerChildren.ToArray ()) {
+ if (info.Child == widget) {
+ widget.Unparent ();
+ containerChildren.Remove (info);
+ break;
+ }
+ }
+ }
+
+ protected override void ForAll (bool include_internals, Gtk.Callback callback)
+ {
+ foreach (var child in containerChildren.ToArray ()) {
+ callback (child.Child);
+ }
+ }
+
+ void ResizeChild (Rectangle allocation, EditorContainerChild child)
+ {
+ Requisition req = child.Child.SizeRequest ();
+ var childRectangle = new Gdk.Rectangle (Allocation.X + child.X, Allocation.Y + child.Y, req.Width, req.Height);
+ if (!child.FixedPosition) {
+ double zoom = Options.Zoom;
+ childRectangle.X = Allocation.X + (int)(child.X * zoom - HAdjustment.Value);
+ childRectangle.Y = Allocation.Y + (int)(child.Y * zoom - VAdjustment.Value);
+ }
+ // childRectangle.X += allocation.X;
+ // childRectangle.Y += allocation.Y;
+ child.Child.SizeAllocate (childRectangle);
+ }
+
+ void SetChildrenPositions (Rectangle allocation)
+ {
+ foreach (EditorContainerChild child in containerChildren.ToArray ()) {
+ if (child.Child == textArea || child.Child is Mono.TextEditor.Vi.ViStatusArea)
+ continue;
+ ResizeChild (allocation, child);
+ }
+ }
+ #endregion
+
+ #region Animated Widgets
+ Stage<AnimatedWidget> stage = new Stage<AnimatedWidget> ();
+
+ bool OnActorStep (Actor<AnimatedWidget> actor)
+ {
+ switch (actor.Target.AnimationState) {
+ case AnimationState.Coming:
+ actor.Target.QueueDraw ();
+ actor.Target.Percent = actor.Percent;
+ if (actor.Expired) {
+ actor.Target.AnimationState = AnimationState.Idle;
+ return false;
+ }
+ break;
+ case AnimationState.IntendingToGo:
+ actor.Target.AnimationState = AnimationState.Going;
+ actor.Target.Bias = actor.Percent;
+ actor.Reset ((uint)(actor.Target.Duration * actor.Percent));
+ break;
+ case AnimationState.Going:
+ if (actor.Expired) {
+ this.Remove (actor.Target);
+ return false;
+ }
+ actor.Target.Percent = 1.0 - actor.Percent;
+ break;
+ }
+ return true;
+ }
+
+ void OnWidgetDestroyed (object sender, EventArgs args)
+ {
+ RemoveCore ((AnimatedWidget)sender);
+ }
+
+ void RemoveCore (AnimatedWidget widget)
+ {
+ RemoveCore (widget, widget.Duration, 0, 0, false, false);
+ }
+
+ void RemoveCore (AnimatedWidget widget, uint duration, Easing easing, Blocking blocking, bool use_easing, bool use_blocking)
+ {
+ if (duration > 0)
+ widget.Duration = duration;
+
+ if (use_easing)
+ widget.Easing = easing;
+
+ if (use_blocking)
+ widget.Blocking = blocking;
+
+ if (widget.AnimationState == AnimationState.Coming) {
+ widget.AnimationState = AnimationState.IntendingToGo;
+ } else {
+ if (widget.Easing == Easing.QuadraticIn) {
+ widget.Easing = Easing.QuadraticOut;
+ } else if (widget.Easing == Easing.QuadraticOut) {
+ widget.Easing = Easing.QuadraticIn;
+ } else if (widget.Easing == Easing.ExponentialIn) {
+ widget.Easing = Easing.ExponentialOut;
+ } else if (widget.Easing == Easing.ExponentialOut) {
+ widget.Easing = Easing.ExponentialIn;
+ }
+ widget.AnimationState = AnimationState.Going;
+ stage.Add (widget, widget.Duration);
+ }
+ }
+
+ public void AddAnimatedWidget (Widget widget, uint duration, Easing easing, Blocking blocking, int x, int y)
+ {
+ AnimatedWidget animated_widget = new AnimatedWidget (widget, duration, easing, blocking, false);
+ animated_widget.Parent = this;
+ animated_widget.WidgetDestroyed += OnWidgetDestroyed;
+ stage.Add (animated_widget, duration);
+ animated_widget.StartPadding = 0;
+ animated_widget.EndPadding = widget.Allocation.Height;
+ // animated_widget.Node = animated_widget;
+
+ EditorContainerChild info = new EditorContainerChild (this, animated_widget);
+ info.X = x;
+ info.Y = y;
+ info.FixedPosition = true;
+ containerChildren.Add (info);
+ }
+ #endregion
+
+ #region TextArea delegation
+ public TextDocument Document {
+ get {
+ return textArea.Document;
+ }
+ set {
+ textArea.Document = value;
+ }
+ }
+
+ public bool IsDisposed {
+ get {
+ return textArea.IsDisposed;
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether this <see cref="Mono.TextEditor.TextEditor"/> converts tabs to spaces.
+ /// It is possible to overwrite the default options value for certain languages (like F#).
+ /// </summary>
+ /// <value>
+ /// <c>true</c> if tabs to spaces should be converted; otherwise, <c>false</c>.
+ /// </value>
+ public bool TabsToSpaces {
+ get {
+ return textArea.TabsToSpaces;
+ }
+ set {
+ textArea.TabsToSpaces = value;
+ }
+ }
+
+ public Mono.TextEditor.Caret Caret {
+ get {
+ return textArea.Caret;
+ }
+ }
+
+ protected internal IMMulticontext IMContext {
+ get { return textArea.IMContext; }
+ }
+
+ public string IMModule {
+ get {
+ return textArea.IMModule;
+ }
+ set {
+ textArea.IMModule = value;
+ }
+ }
+
+ public ITextEditorOptions Options {
+ get {
+ return textArea.Options;
+ }
+ set {
+ textArea.Options = value;
+ }
+ }
+
+ public string FileName {
+ get {
+ return textArea.FileName;
+ }
+ }
+
+ public string MimeType {
+ get {
+ return textArea.MimeType;
+ }
+ }
+
+ public double LineHeight {
+ get {
+ return textArea.LineHeight;
+ }
+ internal set {
+ textArea.LineHeight = value;
+ }
+ }
+
+ public TextViewMargin TextViewMargin {
+ get {
+ return textArea.TextViewMargin;
+ }
+ }
+
+ public ActionMargin ActionMargin {
+ get {
+ return textArea.ActionMargin;
+ }
+ }
+
+ public Margin IconMargin {
+ get { return textArea.IconMargin; }
+ }
+
+ public DocumentLocation LogicalToVisualLocation (DocumentLocation location)
+ {
+ return textArea.LogicalToVisualLocation (location);
+ }
+
+ public DocumentLocation LogicalToVisualLocation (int line, int column)
+ {
+ return textArea.LogicalToVisualLocation (line, column);
+ }
+
+ public void CenterToCaret ()
+ {
+ textArea.CenterToCaret ();
+ }
+
+ public void CenterTo (int offset)
+ {
+ textArea.CenterTo (offset);
+ }
+
+ public void CenterTo (int line, int column)
+ {
+ textArea.CenterTo (line, column);
+ }
+
+ public void CenterTo (DocumentLocation p)
+ {
+ textArea.CenterTo (p);
+ }
+
+ internal void SmoothScrollTo (double value)
+ {
+ textArea.SmoothScrollTo (value);
+ }
+
+ public void ScrollTo (int offset)
+ {
+ textArea.ScrollTo (offset);
+ }
+
+ public void ScrollTo (int line, int column)
+ {
+ textArea.ScrollTo (line, column);
+ }
+
+ public void ScrollTo (DocumentLocation p)
+ {
+ textArea.ScrollTo (p);
+ }
+
+ public void ScrollTo (Gdk.Rectangle rect)
+ {
+ textArea.ScrollTo (rect);
+ }
+
+ public void ScrollToCaret ()
+ {
+ textArea.ScrollToCaret ();
+ }
+
+ public void TryToResetHorizontalScrollPosition ()
+ {
+ textArea.TryToResetHorizontalScrollPosition ();
+ }
+
+ public int GetWidth (string text)
+ {
+ return textArea.GetWidth (text);
+ }
+
+ internal void HideMouseCursor ()
+ {
+ textArea.HideMouseCursor ();
+ }
+
+ public void ClearTooltipProviders ()
+ {
+ GetTextEditorData ().ClearTooltipProviders ();
+ }
+
+ public void AddTooltipProvider (TooltipProvider provider)
+ {
+ GetTextEditorData ().AddTooltipProvider (provider);
+ }
+
+ public void RemoveTooltipProvider (TooltipProvider provider)
+ {
+ GetTextEditorData ().RemoveTooltipProvider (provider);
+ }
+
+ internal void RedrawMargin (Margin margin)
+ {
+ textArea.RedrawMargin (margin);
+ }
+
+ public void RedrawMarginLine (Margin margin, int logicalLine)
+ {
+ textArea.RedrawMarginLine (margin, logicalLine);
+ }
+ internal void RedrawPosition (int logicalLine, int logicalColumn)
+ {
+ textArea.RedrawPosition (logicalLine, logicalColumn);
+ }
+
+ internal void RedrawLine (int line)
+ {
+ textArea.RedrawLine (line);
+ }
+
+ internal void RedrawLines (int start, int end)
+ {
+ textArea.RedrawLines (start, end);
+ }
+
+ internal string preeditString {
+ get {
+ return textArea.preeditString;
+ }
+ }
+
+ internal int preeditOffset {
+ get {
+ return textArea.preeditOffset;
+ }
+ }
+
+ internal int preeditCursorCharIndex {
+ get {
+ return textArea.preeditCursorCharIndex;
+ }
+ }
+
+ internal Pango.AttrList preeditAttrs {
+ get {
+ return textArea.preeditAttrs;
+ }
+ }
+
+ internal bool UpdatePreeditLineHeight ()
+ {
+ return textArea.UpdatePreeditLineHeight ();
+ }
+
+ internal void ResetIMContext ()
+ {
+ textArea.ResetIMContext ();
+ }
+
+ internal bool ContainsPreedit (int offset, int length)
+ {
+ return textArea.ContainsPreedit (offset, length);
+ }
+
+ internal void FireLinkEvent (string link, uint button, ModifierType modifierState)
+ {
+ textArea.FireLinkEvent (link, button, modifierState);
+ }
+
+ internal void RequestResetCaretBlink ()
+ {
+ textArea.RequestResetCaretBlink ();
+ }
+
+ internal void SetAdjustments ()
+ {
+ textArea.SetAdjustments ();
+ }
+
+ public bool IsInDrag {
+ get {
+ return textArea.IsInDrag;
+ }
+ }
+
+ public event EventHandler VScroll {
+ add { textArea.VScroll += value; }
+ remove { textArea.VScroll -= value; }
+ }
+
+ public event EventHandler HScroll {
+ add { textArea.HScroll += value; }
+ remove { textArea.HScroll -= value; }
+ }
+
+ #endregion
+
+ #region TextEditorData delegation
+ public string EolMarker {
+ get {
+ return textArea.EolMarker;
+ }
+ }
+
+ public Mono.TextEditor.Highlighting.ColorScheme ColorStyle {
+ get {
+ return textArea.ColorStyle;
+ }
+ }
+
+ public EditMode CurrentMode {
+ get {
+ return textArea.CurrentMode;
+ }
+ set {
+ textArea.CurrentMode = value;
+ }
+ }
+
+ public bool IsSomethingSelected {
+ get {
+ return textArea.IsSomethingSelected;
+ }
+ }
+
+ public Selection MainSelection {
+ get {
+ return textArea.MainSelection;
+ }
+ set {
+ textArea.MainSelection = value;
+ }
+ }
+
+ public SelectionMode SelectionMode {
+ get {
+ return textArea.SelectionMode;
+ }
+ set {
+ textArea.SelectionMode = value;
+ }
+ }
+
+ public TextSegment SelectionRange {
+ get {
+ return textArea.SelectionRange;
+ }
+ set {
+ textArea.SelectionRange = value;
+ }
+ }
+
+ public string SelectedText {
+ get {
+ return textArea.SelectedText;
+ }
+ set {
+ textArea.SelectedText = value;
+ }
+ }
+
+ public int SelectionAnchor {
+ get {
+ return textArea.SelectionAnchor;
+ }
+ set {
+ textArea.SelectionAnchor = value;
+ }
+ }
+
+ public int SelectionLead {
+ get {
+ return textArea.SelectionLead;
+ }
+ set {
+ textArea.SelectionLead = value;
+ }
+ }
+
+ public IEnumerable<DocumentLine> SelectedLines {
+ get {
+ return textArea.SelectedLines;
+ }
+ }
+
+ public Adjustment HAdjustment {
+ get {
+ return textArea.HAdjustment;
+ }
+ }
+
+ public Adjustment VAdjustment {
+ get {
+ return textArea.VAdjustment;
+ }
+ }
+
+ public int Insert (int offset, string value)
+ {
+ return textArea.Insert (offset, value);
+ }
+
+ public void Remove (DocumentRegion region)
+ {
+ textArea.Remove (region);
+ }
+
+ public void Remove (TextSegment removeSegment)
+ {
+ textArea.Remove (removeSegment);
+ }
+
+ public void Remove (int offset, int count)
+ {
+ textArea.Remove (offset, count);
+ }
+
+ public int Replace (int offset, int count, string value)
+ {
+ return textArea.Replace (offset, count, value);
+ }
+
+ public void ClearSelection ()
+ {
+ textArea.ClearSelection ();
+ }
+
+ public void DeleteSelectedText ()
+ {
+ textArea.DeleteSelectedText ();
+ }
+
+ public void DeleteSelectedText (bool clearSelection)
+ {
+ textArea.DeleteSelectedText (clearSelection);
+ }
+
+ public void RunEditAction (Action<TextEditorData> action)
+ {
+ action (GetTextEditorData ());
+ }
+
+ public void SetSelection (int anchorOffset, int leadOffset)
+ {
+ textArea.SetSelection (anchorOffset, leadOffset);
+ }
+
+ public void SetSelection (DocumentLocation anchor, DocumentLocation lead)
+ {
+ textArea.SetSelection (anchor, lead);
+ }
+
+ public void SetSelection (int anchorLine, int anchorColumn, int leadLine, int leadColumn)
+ {
+ textArea.SetSelection (anchorLine, anchorColumn, leadLine, leadColumn);
+ }
+
+ public void ExtendSelectionTo (DocumentLocation location)
+ {
+ textArea.ExtendSelectionTo (location);
+ }
+ public void ExtendSelectionTo (int offset)
+ {
+ textArea.ExtendSelectionTo (offset);
+ }
+ public void SetSelectLines (int from, int to)
+ {
+ textArea.SetSelectLines (from, to);
+ }
+
+ public void InsertAtCaret (string text)
+ {
+ textArea.InsertAtCaret (text);
+ }
+
+ public bool CanEdit (int line)
+ {
+ return textArea.CanEdit (line);
+ }
+
+ public string GetLineText (int line)
+ {
+ return textArea.GetLineText (line);
+ }
+
+ public string GetLineText (int line, bool includeDelimiter)
+ {
+ return textArea.GetLineText (line, includeDelimiter);
+ }
+
+ /// <summary>
+ /// Use with care.
+ /// </summary>
+ /// <returns>
+ /// A <see cref="TextEditorData"/>
+ /// </returns>
+ public TextEditorData GetTextEditorData ()
+ {
+ return textArea.GetTextEditorData ();
+ }
+
+ /// <remarks>
+ /// The Key may be null if it has been handled by the IMContext. In such cases, the char is the value.
+ /// </remarks>
+ protected internal virtual bool OnIMProcessedKeyPressEvent (Gdk.Key key, uint ch, Gdk.ModifierType state)
+ {
+ SimulateKeyPress (key, ch, state);
+ return true;
+ }
+
+ public void SimulateKeyPress (Gdk.Key key, uint unicodeChar, ModifierType modifier)
+ {
+ textArea.SimulateKeyPress (key, unicodeChar, modifier);
+ }
+
+
+ public void RunAction (Action<TextEditorData> action)
+ {
+ try {
+ action (GetTextEditorData ());
+ } catch (Exception e) {
+ if (Debugger.IsAttached)
+ Debugger.Break ();
+ //TODO: we should really find a way to log this properly
+ Console.WriteLine ("Error while executing " + action + " :" + e);
+ }
+ }
+
+ public void HideTooltip (bool checkMouseOver = true)
+ {
+ textArea.HideTooltip (checkMouseOver);
+ }
+ public Action<Gdk.EventButton> DoPopupMenu {
+ get {
+ return textArea.DoPopupMenu;
+ }
+ set {
+ textArea.DoPopupMenu = value;
+ }
+ }
+
+ public MenuItem CreateInputMethodMenuItem (string label)
+ {
+ return textArea.CreateInputMethodMenuItem (label);
+ }
+
+ public event EventHandler SelectionChanged {
+ add { textArea.SelectionChanged += value; }
+ remove { textArea.SelectionChanged -= value; }
+ }
+
+ public void CaretToDragCaretPosition ()
+ {
+ textArea.CaretToDragCaretPosition ();
+ }
+
+ public event EventHandler<PaintEventArgs> Painted {
+ add { textArea.Painted += value; }
+ remove { textArea.Painted -= value; }
+ }
+
+ public event EventHandler<LinkEventArgs> LinkRequest {
+ add { textArea.LinkRequest += value; }
+ remove { textArea.LinkRequest -= value; }
+ }
+
+ public void ShowListWindow<T> (ListWindow<T> window, DocumentLocation loc)
+ {
+ textArea.ShowListWindow<T> (window, loc);
+ }
+
+ public Margin LockedMargin {
+ get {
+ return textArea.LockedMargin;
+ }
+ set {
+ textArea.LockedMargin = value;
+ }
+ }
+ #endregion
+
+ #region Document delegation
+
+ public event EventHandler EditorOptionsChanged {
+ add { textArea.EditorOptionsChanged += value; }
+ remove { textArea.EditorOptionsChanged -= value; }
+ }
+
+ protected virtual void OptionsChanged (object sender, EventArgs args)
+ {
+ }
+
+ public int Length {
+ get {
+ return Document.TextLength;
+ }
+ }
+
+ public string Text {
+ get {
+ return Document.Text;
+ }
+ set {
+ Document.Text = value;
+ }
+ }
+
+ public string GetTextBetween (int startOffset, int endOffset)
+ {
+ return Document.GetTextBetween (startOffset, endOffset);
+ }
+
+ public string GetTextBetween (DocumentLocation start, DocumentLocation end)
+ {
+ return Document.GetTextBetween (start, end);
+ }
+
+ public string GetTextBetween (int startLine, int startColumn, int endLine, int endColumn)
+ {
+ return Document.GetTextBetween (startLine, startColumn, endLine, endColumn);
+ }
+
+ public string GetTextAt (int offset, int count)
+ {
+ return Document.GetTextAt (offset, count);
+ }
+
+ public string GetTextAt (TextSegment segment)
+ {
+ return Document.GetTextAt (segment);
+ }
+
+ public string GetTextAt (DocumentRegion region)
+ {
+ return Document.GetTextAt (region);
+ }
+
+ public char GetCharAt (int offset)
+ {
+ return Document.GetCharAt (offset);
+ }
+
+ public IEnumerable<DocumentLine> Lines {
+ get {
+ return Document.Lines;
+ }
+ }
+
+ public int LineCount {
+ get {
+ return Document.LineCount;
+ }
+ }
+
+ public int LocationToOffset (int line, int column)
+ {
+ return Document.LocationToOffset (line, column);
+ }
+
+ public int LocationToOffset (DocumentLocation location)
+ {
+ return Document.LocationToOffset (location);
+ }
+
+ public DocumentLocation OffsetToLocation (int offset)
+ {
+ return Document.OffsetToLocation (offset);
+ }
+
+ public string GetLineIndent (int lineNumber)
+ {
+ return Document.GetLineIndent (lineNumber);
+ }
+
+ public string GetLineIndent (DocumentLine segment)
+ {
+ return Document.GetLineIndent (segment);
+ }
+
+ public DocumentLine GetLine (int lineNumber)
+ {
+ return Document.GetLine (lineNumber);
+ }
+
+ public DocumentLine GetLineByOffset (int offset)
+ {
+ return Document.GetLineByOffset (offset);
+ }
+
+ public int OffsetToLineNumber (int offset)
+ {
+ return Document.OffsetToLineNumber (offset);
+ }
+
+ public IDisposable OpenUndoGroup()
+ {
+ return Document.OpenUndoGroup ();
+ }
+#endregion
+
+ #region Search & Replace
+ public string SearchPattern {
+ get {
+ return textArea.SearchPattern;
+ }
+ set {
+ textArea.SearchPattern = value;
+ }
+ }
+
+ public ISearchEngine SearchEngine {
+ get {
+ return textArea.SearchEngine;
+ }
+ set {
+ textArea.SearchEngine = value;
+ }
+ }
+
+ public event EventHandler HighlightSearchPatternChanged {
+ add { textArea.HighlightSearchPatternChanged += value; }
+ remove { textArea.HighlightSearchPatternChanged -= value; }
+ }
+
+ public bool HighlightSearchPattern {
+ get {
+ return textArea.HighlightSearchPattern;
+ }
+ set {
+ textArea.HighlightSearchPattern = value;
+ }
+ }
+
+ public bool IsCaseSensitive {
+ get {
+ return textArea.IsCaseSensitive;
+ }
+ set {
+ textArea.IsCaseSensitive = value;
+ }
+ }
+
+ public bool IsWholeWordOnly {
+ get {
+ return textArea.IsWholeWordOnly;
+ }
+
+ set {
+ textArea.IsWholeWordOnly = value;
+ }
+ }
+
+ public TextSegment SearchRegion {
+ get {
+ return textArea.SearchRegion;
+ }
+
+ set {
+ textArea.SearchRegion = value;
+ }
+ }
+
+ public SearchResult SearchForward (int fromOffset)
+ {
+ return textArea.SearchForward (fromOffset);
+ }
+
+ public SearchResult SearchBackward (int fromOffset)
+ {
+ return textArea.SearchBackward (fromOffset);
+ }
+
+ /// <summary>
+ /// Initiate a pulse at the specified document location
+ /// </summary>
+ /// <param name="pulseStart">
+ /// A <see cref="DocumentLocation"/>
+ /// </param>
+ public void PulseCharacter (DocumentLocation pulseStart)
+ {
+ textArea.PulseCharacter (pulseStart);
+ }
+
+
+ public SearchResult FindNext (bool setSelection)
+ {
+ return textArea.FindNext (setSelection);
+ }
+
+ public void StartCaretPulseAnimation ()
+ {
+ textArea.StartCaretPulseAnimation ();
+ }
+
+ public void StopSearchResultAnimation ()
+ {
+ textArea.StopSearchResultAnimation ();
+ }
+
+ public void AnimateSearchResult (SearchResult result)
+ {
+ textArea.AnimateSearchResult (result);
+ }
+
+ public SearchResult FindPrevious (bool setSelection)
+ {
+ return textArea.FindPrevious (setSelection);
+ }
+
+ public bool Replace (string withPattern)
+ {
+ return textArea.Replace (withPattern);
+ }
+
+ public int ReplaceAll (string withPattern)
+ {
+ return textArea.ReplaceAll (withPattern);
+ }
+ #endregion
+
+ #region Coordinate transformation
+ public DocumentLocation PointToLocation (double xp, double yp)
+ {
+ return TextViewMargin.PointToLocation (xp, yp);
+ }
+
+ public DocumentLocation PointToLocation (Cairo.Point p)
+ {
+ return TextViewMargin.PointToLocation (p);
+ }
+
+ public DocumentLocation PointToLocation (Cairo.PointD p)
+ {
+ return TextViewMargin.PointToLocation (p);
+ }
+
+ public Cairo.Point LocationToPoint (DocumentLocation loc)
+ {
+ return TextViewMargin.LocationToPoint (loc);
+ }
+
+ public Cairo.Point LocationToPoint (int line, int column)
+ {
+ return TextViewMargin.LocationToPoint (line, column);
+ }
+
+ public Cairo.Point LocationToPoint (int line, int column, bool useAbsoluteCoordinates)
+ {
+ return TextViewMargin.LocationToPoint (line, column, useAbsoluteCoordinates);
+ }
+
+ public Cairo.Point LocationToPoint (DocumentLocation loc, bool useAbsoluteCoordinates)
+ {
+ return TextViewMargin.LocationToPoint (loc, useAbsoluteCoordinates);
+ }
+
+ public double ColumnToX (DocumentLine line, int column)
+ {
+ if (line == null)
+ throw new ArgumentNullException ("line");
+ return TextViewMargin.ColumnToX (line, column);
+ }
+
+ /// <summary>
+ /// Calculates the line number at line start (in one visual line could be several logical lines be displayed).
+ /// </summary>
+ public int YToLine (double yPos)
+ {
+ return TextViewMargin.YToLine (yPos);
+ }
+
+ public double LineToY (int logicalLine)
+ {
+ return TextViewMargin.LineToY (logicalLine);
+ }
+
+ public double GetLineHeight (DocumentLine line)
+ {
+ return TextViewMargin.GetLineHeight (line);
+ }
+
+ public double GetLineHeight (int logicalLineNumber)
+ {
+ return TextViewMargin.GetLineHeight (logicalLineNumber);
+ }
+ #endregion
+
+
+ public void SetCaretTo (int line, int column)
+ {
+ textArea.SetCaretTo (line, column);
+ }
+
+ public void SetCaretTo (int line, int column, bool highlight)
+ {
+ textArea.SetCaretTo (line, column, highlight);
+ }
+
+ public void SetCaretTo (int line, int column, bool highlight, bool centerCaret)
+ {
+ textArea.SetCaretTo (line, column, highlight, centerCaret);
+ }
+ public event EventHandler BeginHover {
+ add { textArea.BeginHover += value; }
+ remove { textArea.BeginHover -= value; }
+ }
+
+ }
+}
+