Author: mkrueger
Date: 2008-02-18 18:15:35 -0500 (Mon, 18 Feb 2008)
New Revision: 96108

Removed:
   
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/SelectionMarker.cs
Modified:
   trunk/monodevelop/main/src/addins/Mono.Texteditor/ChangeLog
   trunk/monodevelop/main/src/addins/Mono.Texteditor/Makefile.am
   trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor.mdp
   
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/DefaultEditActions.cs
   trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/Document.cs
   
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/GutterMargin.cs
   trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/IMargin.cs
   
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditor.cs
   
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditorData.cs
   
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextViewMargin.cs
   trunk/monodevelop/main/src/addins/Mono.Texteditor/gtk-gui/objects.xml
Log:
* Mono.TextEditor/DefaultEditActions.cs,
  Mono.TextEditor/TextViewMargin.cs, Mono.TextEditor/Document.cs,
  Mono.TextEditor/TextEditorData.cs, Mono.TextEditor/IMargin.cs,
  Mono.TextEditor/SelectionMarker.cs, Mono.TextEditor/TextEditor.cs,
  Mono.TextEditor/GutterMargin.cs: Worked on selection.

Modified: trunk/monodevelop/main/src/addins/Mono.Texteditor/ChangeLog
===================================================================
--- trunk/monodevelop/main/src/addins/Mono.Texteditor/ChangeLog 2008-02-18 
22:56:07 UTC (rev 96107)
+++ trunk/monodevelop/main/src/addins/Mono.Texteditor/ChangeLog 2008-02-18 
23:15:35 UTC (rev 96108)
@@ -1,3 +1,11 @@
+2008-02-19  Mike Krüger <[EMAIL PROTECTED]> 
+
+       * Mono.TextEditor/DefaultEditActions.cs, 
Mono.TextEditor/TextViewMargin.cs,
+         Mono.TextEditor/Document.cs, Mono.TextEditor/TextEditorData.cs,
+         Mono.TextEditor/IMargin.cs, Mono.TextEditor/SelectionMarker.cs,
+         Mono.TextEditor/TextEditor.cs, Mono.TextEditor/GutterMargin.cs: Worked
+         on selection.
+
 2008-02-18  Mike Krüger <[EMAIL PROTECTED]> 
 
        * Mono.TextEditor/DefaultEditActions.cs: fixed Bug 322763 - Ctrl + 
Backspace

Modified: trunk/monodevelop/main/src/addins/Mono.Texteditor/Makefile.am
===================================================================
--- trunk/monodevelop/main/src/addins/Mono.Texteditor/Makefile.am       
2008-02-18 22:56:07 UTC (rev 96107)
+++ trunk/monodevelop/main/src/addins/Mono.Texteditor/Makefile.am       
2008-02-18 23:15:35 UTC (rev 96108)
@@ -47,7 +47,6 @@
        Mono.TextEditor/ReplaceEventArgs.cs \
        Mono.TextEditor/SearchOptions.cs \
        Mono.TextEditor/Segment.cs \
-       Mono.TextEditor/SelectionMarker.cs \
        Mono.TextEditor/TextEditor.cs \
        Mono.TextEditor/TextEditorData.cs \
        Mono.TextEditor/TextEditorOptions.cs \

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/DefaultEditActions.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/DefaultEditActions.cs
     2008-02-18 22:56:07 UTC (rev 96107)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/DefaultEditActions.cs
     2008-02-18 23:15:35 UTC (rev 96108)
@@ -314,9 +314,9 @@
                {
                        data.Caret.AutoScrollToCaret = false;
                        data.Caret.PreserveSelection = true;
-                       data.SelectionStart = new SelectionMarker 
(data.Document.GetLine (0), 0);
+                       data.SelectionAnchor = 0;
                        new CaretMoveToDocumentEnd ().Run (data);
-                       SelectionMoveLeft.EndSelection (data);
+                       data.ExtendSelectionTo (data.Document.Length);
                        data.Caret.AutoScrollToCaret = true;
                }
        }
@@ -326,14 +326,13 @@
                public static void StartSelection (TextEditorData data)
                {
                        data.Caret.PreserveSelection = true;
-                       if (data.SelectionStart == null) {
-                               data.SelectionStart = new SelectionMarker 
(data.Document.GetLine (data.Caret.Line), data.Caret.Column);
-                       }
+                       if (!data.IsSomethingSelected)
+                               data.SelectionAnchor = data.Caret.Offset;
                }
                
                public static void EndSelection (TextEditorData data)
                {
-                       data.SelectionEnd = new SelectionMarker 
(data.Document.GetLine (data.Caret.Line), data.Caret.Column);
+                       data.ExtendSelectionTo (data.Caret.Offset);
                        data.Caret.PreserveSelection = false;
                }
                
@@ -561,11 +560,15 @@
                                if (first < 0)
                                        first = last;
                        }
-                       if (data.IsSomethingSelected)
-                               data.SelectionStart.Column = System.Math.Max 
(0, data.SelectionStart.Column - first);
-                       if (!data.IsSomethingSelected 
|| data.SelectionEnd.Column != 0) {
-                               if (data.IsSomethingSelected)
-                                       data.SelectionEnd.Column = 
System.Math.Max (0, data.SelectionEnd.Column - last);
+                       if (data.IsSomethingSelected) {
+                               data.SelectionAnchor = System.Math.Max (0, 
data.SelectionAnchor - first);
+                               data.SelectionRange = new Segment 
(data.SelectionRange.Offset - first, data.SelectionRange.Length + first);
+                       }
+                       DocumentLocation selectionEnd = 
data.IsSomethingSelected ? data.Document.OffsetToLocation 
(data.SelectionRange.EndOffset) : DocumentLocation.Empty;
+                       if (!data.IsSomethingSelected || selectionEnd.Column != 
0) {
+                               if (data.IsSomethingSelected) {
+                                       data.SelectionRange = new Segment 
(data.SelectionRange.Offset, data.SelectionRange.Length -last);
+                               }
                                data.Caret.PreserveSelection = true;
                                data.Caret.Column = System.Math.Max (0, 
data.Caret.Column - last);
                                data.Caret.PreserveSelection = false;
@@ -577,7 +580,7 @@
                
                public override void Run (TextEditorData data)
                {
-                       if (data.IsSomethingSelected && 
data.SelectionStart.Segment != data.SelectionEnd.Segment) {
+                       if (data.IsMultiLineSelection) {
                                RemoveIndentSelection (data);
                                return;
                        } else {
@@ -612,13 +615,15 @@
                        foreach (LineSegment line in data.SelectedLines) {
                                data.Document.Insert (line.Offset, 
TextEditorOptions.Options.IndentationString);
                        }
-                       if (data.IsSomethingSelected)
-                               data.SelectionStart.Column++;
-                       if (!data.IsSomethingSelected 
|| data.SelectionEnd.Column != 0) {
-                               if (data.IsSomethingSelected)
-                                       data.SelectionEnd.Column++;
+                       if (data.IsSomethingSelected) {
+                               data.SelectionAnchor++;
+                       }
+                       DocumentLocation selectionEnd = 
data.IsSomethingSelected ? data.Document.OffsetToLocation 
(data.SelectionRange.EndOffset) : DocumentLocation.Empty;
+                       if (selectionEnd.Column != 0) {
                                data.Caret.PreserveSelection = true;
                                data.Caret.Column++;
+                               if (data.IsSomethingSelected) 
+                                       data.ExtendSelectionTo 
(data.Caret.Offset);
                                data.Caret.PreserveSelection = false;
                        }
                        data.Document.EndAtomicUndo ();
@@ -628,7 +633,7 @@
                
                public override void Run (TextEditorData data)
                {
-                       if (data.IsSomethingSelected && 
data.SelectionStart.Segment != data.SelectionEnd.Segment) {
+                       if (data.IsMultiLineSelection) {
                                IndentSelection (data);
                                return;
                        }
@@ -636,7 +641,6 @@
                        if (data.IsSomethingSelected) {
                                data.DeleteSelectedText ();
                        }
-                       
                        data.Document.Insert (data.Caret.Offset, 
TextEditorOptions.Options.IndentationString);
                        data.Caret.Column += 
TextEditorOptions.Options.IndentationString.Length;
                        data.Document.EndAtomicUndo ();

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/Document.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/Document.cs   
    2008-02-18 22:56:07 UTC (rev 96107)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/Document.cs   
    2008-02-18 23:15:35 UTC (rev 96108)
@@ -391,7 +391,7 @@
                        
                public bool CanUndo {
                        get {
-                               return this.undoStack.Count > 0;
+                               return this.undoStack.Count > 0 || 
currentAtomicOperation != null;
                        }
                }
                

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/GutterMargin.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/GutterMargin.cs
   2008-02-18 22:56:07 UTC (rev 96107)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/GutterMargin.cs
   2008-02-18 23:15:35 UTC (rev 96108)
@@ -42,6 +42,7 @@
                {
                        this.editor = editor;
                        layout = new Pango.Layout (editor.PangoContext);
+                       base.cursor = new Gdk.Cursor (Gdk.CursorType.RightPtr);
                }
                
                void CalculateWidth ()
@@ -69,22 +70,59 @@
                
                public override void MousePressed (int button, int x, int y, 
Gdk.EventType type, Gdk.ModifierType modifierState)
                {
-                       int lineNumber = editor.Document.VisualToLogicalLine 
((int)(y + editor.VAdjustment.Value) / editor.LineHeight);
+                       int lineNumber       = 
editor.Document.VisualToLogicalLine ((int)(y + editor.VAdjustment.Value) / 
editor.LineHeight);
+                       bool extendSelection = (modifierState & 
Gdk.ModifierType.ShiftMask) == Gdk.ModifierType.ShiftMask;
                        if (lineNumber < editor.Document.LineCount) {
                                DocumentLocation loc = new DocumentLocation 
(lineNumber, 0);
-                               if (loc != editor.Caret.Location) {
-                                       editor.Caret.Location = loc;
-                               } else if (editor.IsSomethingSelected) {
+                               LineSegment line = editor.Document.GetLine 
(lineNumber);
+                               if (type == EventType.TwoButtonPress) {
+                                       editor.SelectionRange = line;
+                                       editor.SelectionAnchor = 
editor.Document.LocationToOffset (loc);
+                               } else if (extendSelection) {
+                                       if (!editor.IsSomethingSelected) {
+                                               editor.SelectionAnchor = 
editor.Caret.Offset;
+                                       } 
+                                       editor.SetSelectLines 
(editor.SelectionAnchorLocation.Line, lineNumber);
+                               } else {
                                        editor.ClearSelection ();
-                                       editor.QueueDraw ();
-                               } else {
-                                       LineSegment line = 
editor.Document.GetLine (lineNumber);
-                                       editor.SelectionRange = new Segment 
(line.Offset, line.EditableLength); 
-                                       editor.QueueDraw ();
                                }
+                               editor.Caret.PreserveSelection = true;
+                               editor.Caret.Location = loc;
+                               editor.Caret.PreserveSelection = false;
+                               
+                               
+//                             if (loc != editor.Caret.Location) {
+//                                     
+//                             } else if (editor.IsSomethingSelected) {
+//                                     editor.ClearSelection ();
+//                                     editor.QueueDraw ();
+//                             } else {
+//                                     LineSegment line = 
editor.Document.GetLine (lineNumber);
+//                                     editor.SelectionRange = new Segment 
(line.Offset, line.EditableLength); 
+//                                     editor.QueueDraw ();
+//                             }
                        }
                }
                
+               public override void MouseHover (int x, int y, bool 
buttonPressed)
+               {
+                       if (buttonPressed) {
+                               if (!editor.IsSomethingSelected) {
+                                       editor.SelectionAnchor = 
editor.Caret.Offset;
+                               } 
+                               int lineNumber = 
editor.Document.VisualToLogicalLine ((int)(y + editor.VAdjustment.Value) / 
editor.LineHeight);
+                               editor.SetSelectLines 
(editor.SelectionAnchorLocation.Line, lineNumber);
+                               editor.Caret.PreserveSelection = true;
+                               editor.Caret.Location = new DocumentLocation 
(lineNumber, 0);
+                               editor.Caret.PreserveSelection = false;
+                       }
+               }
+               
+               
+               public override void MouseReleased (int button, int x, int y, 
Gdk.ModifierType modifierState)
+               {
+               }
+               
                public override void Dispose ()
                {
                        if (layout != null) {
@@ -92,6 +130,7 @@
                                layout = null;
                        }
                        DisposeGCs ();
+                       base.Dispose ();
                }
                
                void DisposeGCs ()

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/IMargin.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/IMargin.cs    
    2008-02-18 22:56:07 UTC (rev 96107)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/IMargin.cs    
    2008-02-18 23:15:35 UTC (rev 96108)
@@ -44,11 +44,16 @@
                        set;
                }
                
+               Gdk.Cursor MarginCursor {
+                       get;
+               }
+               
                void OptionsChanged ();
                
                void Draw (Gdk.Drawable drawable, Gdk.Rectangle area, int line, 
int x, int y);
                
                void MousePressed (int button, int x, int y, Gdk.EventType 
type, Gdk.ModifierType modifierState);
+               void MouseReleased (int button, int x, int y, Gdk.ModifierType 
modifierState);
                void MouseHover (int x, int y, bool buttonPressed);
                void MouseLeft ();
        }
@@ -79,6 +84,13 @@
                        }
                }
                
+               protected Gdk.Cursor cursor = null;
+               public Gdk.Cursor MarginCursor {
+                       get {
+                               return cursor;
+                       }
+               }
+               
                public abstract void Draw (Gdk.Drawable drawable, Gdk.Rectangle 
area, int line, int x, int y);
                
                public virtual void OptionsChanged ()
@@ -88,6 +100,9 @@
                public virtual void MousePressed (int button, int x, int y, 
Gdk.EventType type, Gdk.ModifierType modifierState)
                {
                }
+               public virtual void MouseReleased (int button, int x, int y, 
Gdk.ModifierType modifierState)
+               {
+               }
                
                public virtual void MouseHover (int x, int y, bool 
buttonPressed)
                {
@@ -98,6 +113,10 @@
                }
                public virtual void Dispose ()
                {
+                       if (cursor != null) {
+                               cursor.Dispose ();
+                               cursor = null;
+                       }
                }
                
        }

Deleted: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/SelectionMarker.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/SelectionMarker.cs
        2008-02-18 22:56:07 UTC (rev 96107)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/SelectionMarker.cs
        2008-02-18 23:15:35 UTC (rev 96108)
@@ -1,61 +0,0 @@
-// SelectionMarker.cs
-//
-// Author:
-//   Mike Krüger <[EMAIL PROTECTED]>
-//
-// Copyright (c) 2007 Novell, Inc (http://www.novell.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;
-
-namespace Mono.TextEditor
-{
-       public class SelectionMarker
-       {
-               LineSegment segment;
-               int column;
-               
-               public int Column {
-                       get {
-                               return column;
-                       }
-                       set {
-                               column = value;
-                       }
-               }
-
-               public Mono.TextEditor.LineSegment Segment {
-                       get {
-                               return segment;
-                       }
-                       set {
-                               segment = value;
-                       }
-               }
-               
-               public SelectionMarker (LineSegment segment, int column)
-               {
-                       this.segment = segment;
-                       this.column  = column;
-               }
-       }
-}

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditor.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditor.cs 
    2008-02-18 22:56:07 UTC (rev 96107)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditor.cs 
    2008-02-18 23:15:35 UTC (rev 96108)
@@ -266,7 +266,7 @@
                        margins.Add (textViewMargin);
                        ISegment oldSelection = null;
                        this.textEditorData.SelectionChanged += delegate {
-                               if (IsSomethingSelected && 
SelectionRange.Offset > 0)
+                               if (IsSomethingSelected && 
SelectionRange.Offset >= 0 && SelectionRange.EndOffset < Document.Length)
                                        new CopyAction ().CopyToPrimary 
(this.textEditorData);
                                
                                // Handle redraw
@@ -300,7 +300,7 @@
                                                to = endLine;
                                        } 
                                }
-                               oldSelection = selection;
+                               oldSelection = selection != null ? new Segment 
(selection.Offset, selection.Length) : null;
                                this.RedrawLines (System.Math.Min (from, to), 
System.Math.Max (from, to));
                                OnSelectionChanged (EventArgs.Empty);
                        };
@@ -591,6 +591,12 @@
                {
                        if (textViewMargin.inDrag) 
                                Caret.Location = textViewMargin.clickLocation;
+                       int startPos;
+                       IMargin margin = GetMarginAtX ((int)e.X, out startPos);
+                       if (margin != null) {
+                               margin.MouseReleased ((int)e.Button, (int)(e.X 
- startPos), (int)e.Y, e.State);
+                       }
+                       
                        mousePressed = false;
                        textViewMargin.inDrag = false;
                        textViewMargin.inSelectionDrag = false;
@@ -678,6 +684,8 @@
                {
                        int startPos;
                        IMargin margin = GetMarginAtX ((int)e.X, out startPos);
+                       GdkWindow.Cursor = margin.MarginCursor;
+                       
                        if (textViewMargin.inSelectionDrag) {
                                margin   = textViewMargin;
                                startPos = textViewMargin.XOffset;
@@ -700,6 +708,8 @@
                
                protected override bool OnLeaveNotifyEvent (Gdk.EventCrossing e)
                {
+                       GdkWindow.Cursor = null;
+                       
                        if (e.Mode == CrossingMode.Normal) {
                                if (oldMargin != null)
                                        oldMargin.MouseLeft ();
@@ -775,7 +785,6 @@
                        }
                        return base.OnScrollEvent (evnt); 
                }
-
                
                internal void SetAdjustments (Gdk.Rectangle allocation)
                {
@@ -861,6 +870,24 @@
                        }
                }
                
+               public int SelectionAnchor {
+                       get {
+                               return this.textEditorData.SelectionAnchor;
+                       }
+                       set {
+                               this.textEditorData.SelectionAnchor = value;
+                       }
+               }
+               
+               public DocumentLocation SelectionAnchorLocation {
+                       get {
+                               return Document.OffsetToLocation 
(SelectionAnchor);
+                       }
+                       set {
+                               SelectionAnchor = Document.LocationToOffset 
(value);
+                       }
+               }
+               
                public ISegment SelectionRange {
                        get {
                                return this.textEditorData.SelectionRange;
@@ -911,9 +938,20 @@
                {
                        action.Run (this.textEditorData);
                }
+               public void ExtendSelectionTo (DocumentLocation location)
+               {
+                       this.textEditorData.ExtendSelectionTo (location);
+               }
+               public void ExtendSelectionTo (int offset)
+               {
+                       this.textEditorData.ExtendSelectionTo (offset);
+               }
+               public void SetSelectLines (int from, int to)
+               {
+                       this.textEditorData.SetSelectLines (from, to);
+               }
                
                
-               
                /// <summary>
                /// Use with care.
                /// </summary>

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditorData.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditorData.cs
 2008-02-18 22:56:07 UTC (rev 96107)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextEditorData.cs
 2008-02-18 23:15:35 UTC (rev 96108)
@@ -31,14 +31,39 @@
 {
        public class TextEditorData
        {
-               SelectionMarker selectionStart;
-               SelectionMarker selectionEnd;
-               Adjustment hadjustment = new Adjustment (0, 0, 0, 0, 0, 0); 
-               Adjustment vadjustment = new Adjustment (0, 0, 0, 0, 0, 0);
                Document   document; 
                Caret      caret;
                
+               Adjustment hadjustment = new Adjustment (0, 0, 0, 0, 0, 0); 
+               public Adjustment HAdjustment {
+                       get {
+                               return hadjustment;
+                       }
+                       set {
+                               hadjustment = value;
+                       }
+               }
+               
+               Adjustment vadjustment = new Adjustment (0, 0, 0, 0, 0, 0);
+               public Adjustment VAdjustment {
+                       get {
+                               return vadjustment;
+                       }
+                       set {
+                               vadjustment = value;
+                       }
+               }
+               
+               
                string searchPattern = "";
+               public string SearchPattern {
+                       get {
+                               return searchPattern;
+                       }
+                       set {
+                               searchPattern = value;
+                       }
+               }
                
                public TextEditorData ()
                {
@@ -75,51 +100,68 @@
                        }
                }
                
+               #region Selection management
+               int      selectionAnchor = -1;
+               ISegment selectionRange  = null;
+               
                public bool IsSomethingSelected {
                        get {
-                               return SelectionStart != null && SelectionEnd 
!= null; 
+                               return selectionRange != null; 
                        }
                }
                
+               public bool IsMultiLineSelection {
+                       get {
+                               return IsSomethingSelected && 
document.OffsetToLineNumber (selectionRange.Offset) != 
document.OffsetToLineNumber (selectionRange.EndOffset);
+                       }
+               }
+               
                public ISegment SelectionRange {
                        get {
-                               if (!IsSomethingSelected)
-                                       return null;
-                               SelectionMarker start;
-                               SelectionMarker end;
-                                
-                               if (SelectionStart.Segment.Offset < 
SelectionEnd.Segment.Offset || SelectionStart.Segment.Offset == 
SelectionEnd.Segment.Offset && SelectionStart.Column < SelectionEnd.Column) {
-                                       start = SelectionStart;
-                                       end   = SelectionEnd;
-                               } else {
-                                       start = SelectionEnd;
-                                       end   = SelectionStart;
-                               }
-                               
-                               int startOffset = start.Segment.Offset + 
start.Column;
-                               int endOffset   = end.Segment.Offset + 
end.Column;
-                               return new Segment (startOffset, endOffset - 
startOffset);
+                               return selectionRange;
                        }
                        set {
-                               if (value == null) {
-                                       ClearSelection ();
-                                       return;
-                               }
-                               int start, end;
-                               if (value.Offset < value.EndOffset) {
-                                       start = value.Offset;
-                                       end   = value.EndOffset;
-                               } else {
-                                       start = value.EndOffset;
-                                       end   = value.Offset;
-                               }
-                               LineSegment startLine = 
Document.GetLineByOffset (start);
-                               LineSegment endLine   = 
Document.GetLineByOffset (end);
-                               this.Caret.Offset = end;
-                               selectionStart = new SelectionMarker 
(startLine, start - startLine.Offset);
-                               selectionEnd   = new SelectionMarker (endLine, 
end - endLine.Offset);
-                               OnSelectionChanged (EventArgs.Empty);           
                
+                               selectionRange = value;
+                               OnSelectionChanged (EventArgs.Empty);
                        }
+//                     get {
+//                             if (!IsSomethingSelected)
+//                                     return null;
+//                             SelectionMarker start;
+//                             SelectionMarker end;
+//                              
+//                             if (SelectionAnchor.Segment.Offset < 
SelectionEnd.Segment.Offset || SelectionAnchor.Segment.Offset == 
SelectionEnd.Segment.Offset && SelectionAnchor.Column < SelectionEnd.Column) {
+//                                     start = SelectionAnchor;
+//                                     end   = SelectionEnd;
+//                             } else {
+//                                     start = SelectionEnd;
+//                                     end   = SelectionAnchor;
+//                             }
+//                             
+//                             int startOffset = start.Segment.Offset + 
start.Column;
+//                             int endOffset   = end.Segment.Offset + 
end.Column;
+//                             return new Segment (startOffset, endOffset - 
startOffset);
+//                     }
+//                     set {
+//                             if (value == null) {
+//                                     ClearSelection ();
+//                                     return;
+//                             }
+//                             int start, end;
+//                             if (value.Offset < value.EndOffset) {
+//                                     start = value.Offset;
+//                                     end   = value.EndOffset;
+//                             } else {
+//                                     start = value.EndOffset;
+//                                     end   = value.Offset;
+//                             }
+//                             LineSegment startLine = 
Document.GetLineByOffset (start);
+//                             LineSegment endLine   = 
Document.GetLineByOffset (end);
+//                             this.Caret.Offset = end;
+//                             selectionStart = new SelectionMarker 
(startLine, start - startLine.Offset);
+//                             selectionEnd   = new SelectionMarker (endLine, 
end - endLine.Offset);
+//                             OnSelectionChanged (EventArgs.Empty);           
                
+//                     }
                }
                
                public string SelectedText {
@@ -158,66 +200,62 @@
                        }
                }
                
-               public Adjustment HAdjustment {
+               public int SelectionAnchor {
                        get {
-                               return hadjustment;
+                               return selectionAnchor;
                        }
                        set {
-                               hadjustment = value;
+                               selectionAnchor = value;
                        }
                }
                
-               public Adjustment VAdjustment {
-                       get {
-                               return vadjustment;
-                       }
-                       set {
-                               vadjustment = value;
-                       }
+               public void ClearSelection ()
+               {
+                       this.selectionAnchor = -1;
+                       this.selectionRange  = null;
+                       OnSelectionChanged (EventArgs.Empty);
                }
                
-               public SelectionMarker SelectionStart {
-                       get {
-                               return selectionStart;
-                       }
-                       set {
-                               selectionStart = value;
-                               OnSelectionChanged (EventArgs.Empty);
-                       }
+               public void ExtendSelectionTo (DocumentLocation location)
+               {
+                       ExtendSelectionTo (document.LocationToOffset 
(location));
                }
                
-               public SelectionMarker SelectionEnd {
-                       get {
-                               return selectionEnd;
+               public void ExtendSelectionTo (int offset)
+               {
+                       if (selectionAnchor < 0)
+                               selectionAnchor = offset;
+                       int from, to;
+                       if (offset < selectionAnchor) {
+                               from = offset;
+                               to   = selectionAnchor;
+                       } else {
+                               to   = offset;
+                               from = selectionAnchor;
                        }
-                       set {
-                               selectionEnd = value;
-                               OnSelectionChanged (EventArgs.Empty);
-                       }
+                       this.SelectionRange = new Segment (from, to - from);
                }
                
-               public string SearchPattern {
-                       get {
-                               return searchPattern;
+               public void SetSelectLines (int from, int to)
+               {
+                       if (to < from) {
+                               int tmp = from;
+                               from = to;
+                               to = tmp;
                        }
-                       set {
-                               searchPattern = value;
-                       }
+                       LineSegment fromLine =Document.GetLine (from);
+                       LineSegment toLine = Document.GetLine (to);
+                       SelectionRange = new Segment (fromLine.Offset, 
toLine.EndOffset - fromLine.Offset);
                }
+                               
                
-               public void ClearSelection ()
-               {
-                       this.selectionStart = this.selectionEnd = null;
-                       OnSelectionChanged (EventArgs.Empty);
-               }
-               
                public void DeleteSelectedText ()
                {
                        if (!IsSomethingSelected)
                                return;
                        document.BeginAtomicUndo ();
                        ISegment selection = SelectionRange;
-                       bool needUpdate = this.selectionStart.Segment != 
this.selectionEnd.Segment;
+                       bool needUpdate = Document.OffsetToLineNumber 
(selection.Offset) != Document.OffsetToLineNumber (selection.EndOffset);
                        if (Caret.Offset > selection.Offset)
                                Caret.Offset -= selection.Length;
                        
@@ -229,7 +267,7 @@
                        if (needUpdate)
                                Document.CommitDocumentUpdate ();
                }
-               
+#endregion
                public event EventHandler SelectionChanged;
                protected virtual void OnSelectionChanged (EventArgs args)
                {

Modified: 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextViewMargin.cs
===================================================================
--- 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextViewMargin.cs
 2008-02-18 22:56:07 UTC (rev 96107)
+++ 
trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor/TextViewMargin.cs
 2008-02-18 23:15:35 UTC (rev 96108)
@@ -49,9 +49,6 @@
                uint caretBlinkTimeoutId = 0;
                const int CaretBlinkTime = 800;
                
-               Gdk.Cursor defaultCursor;
-               Gdk.Cursor textCursor;
-               
                int lineHeight = 16;
                int highlightBracketOffset = -1;
                
@@ -152,9 +149,7 @@
                                                textEditor.RedrawLine (line2);
                                }
                        };
-                       
-                       defaultCursor = null;
-                       textCursor = new Gdk.Cursor (Gdk.CursorType.Xterm);
+                       base.cursor = new Gdk.Cursor (Gdk.CursorType.Xterm);
                }
                
                public override void OptionsChanged ()
@@ -205,6 +200,7 @@
                                invalidLineMarker.Dispose ();
                                invalidLineMarker = null;
                        }
+                       base.Dispose ();
                }
                
                public void ResetCaretBlink ()
@@ -477,6 +473,12 @@
                public DocumentLocation clickLocation;
                DocumentLocation selectionStartLocation;
                ISegment minimalSelection = null;
+               enum MouseSelectionMode {
+                       SingleChar,
+                       Word,
+                       WholeLine
+               };
+               MouseSelectionMode mouseSelectionMode = 
MouseSelectionMode.SingleChar;
                
                public override void MousePressed (int button, int x, int y, 
Gdk.EventType type, Gdk.ModifierType modifierState)
                {
@@ -484,25 +486,31 @@
                        inDrag = false;
                        if (button == 1 || button == 2) {
                                clickLocation = VisualToDocumentLocation (x, y);
+                               if (!textEditor.IsSomethingSelected) {
+                                       textEditor.SelectionAnchorLocation = 
clickLocation;
+                               }
+                               
                                int offset = Document.LocationToOffset 
(clickLocation);
                                if (offset < 0) {
                                        textEditor.RunAction (new 
CaretMoveToDocumentEnd ());
                                        return;
                                }
-
                                if (type == EventType.TwoButtonPress) {
                                        int start = ScanWord (offset, false);
                                        int end   = ScanWord (offset, true);
                                        textEditor.SelectionRange = 
minimalSelection = new Segment (start, end - start);
                                        selectionStartLocation = 
Document.OffsetToLocation (start);
                                        inSelectionDrag = true;
+                                       mouseSelectionMode = 
MouseSelectionMode.Word;
                                        return;
                                } else if (type == EventType.ThreeButtonPress) {
                                        textEditor.SelectionRange = 
minimalSelection = Document.GetLineByOffset (offset);
                                        selectionStartLocation = 
Document.OffsetToLocation (minimalSelection.Offset);
                                        inSelectionDrag = true;
+                                       mouseSelectionMode = 
MouseSelectionMode.WholeLine;
                                        return;
                                }
+                               mouseSelectionMode = 
MouseSelectionMode.SingleChar;
                                selectionStartLocation = clickLocation;
                                
                                minimalSelection = null;
@@ -510,15 +518,13 @@
                                        inDrag = true;
                                } else {
                                        inSelectionDrag = true;
-                                       textEditor.ClearSelection ();
                                        if ((modifierState & 
Gdk.ModifierType.ShiftMask) == ModifierType.ShiftMask) {
-                                               if 
(!textEditor.IsSomethingSelected) 
-                                                       
SelectionMoveLeft.StartSelection (textEditor.GetTextEditorData ());
                                                Caret.PreserveSelection = true;
                                                Caret.Location = clickLocation;
                                                Caret.PreserveSelection = false;
-                                               SelectionMoveLeft.EndSelection 
(textEditor.GetTextEditorData ());
+                                               textEditor.ExtendSelectionTo 
(clickLocation);
                                        } else {
+                                               textEditor.ClearSelection ();
                                                Caret.Location = clickLocation; 
                                        }
                                        this.caretBlink = false;
@@ -531,37 +537,49 @@
                int ScanWord (int offset, bool forwardDirection)
                {
                        LineSegment line = Document.GetLineByOffset (offset);
-                       while (offset >= line.Offset && offset < line.Offset + 
line.EditableLength && char.IsWhiteSpace (Document.GetCharAt (offset))) {
+                       while (offset >= line.Offset && offset < line.Offset + 
line.EditableLength && !char.IsLetterOrDigit (Document.GetCharAt (offset))) {
                                offset = forwardDirection ? offset + 1 : offset 
- 1; 
                        }
                        while (offset >= line.Offset && offset < line.Offset + 
line.EditableLength && (char.IsLetterOrDigit (Document.GetCharAt (offset)) 
|| Document.GetCharAt (offset) == '_')) {
                                offset = forwardDirection ? offset + 1 : offset 
- 1; 
                        }
-                       return offset + (forwardDirection ? 0 : 1);
+                       return System.Math.Min (line.EndOffset - 1, 
System.Math.Max (line.Offset, offset + (forwardDirection ? 0 : 1)));
                }
                
                public override void MouseHover (int x, int y, bool 
buttonPressed)
                {
-                       textEditor.GdkWindow.Cursor = textCursor;
                        if (!buttonPressed)
                                return;
                        if (inSelectionDrag) {
                                DocumentLocation loc = VisualToDocumentLocation 
(x, y);
-                               int offset1 = Document.LocationToOffset 
(this.selectionStartLocation);
-                               int offset2 = Document.LocationToOffset (loc);
-                               ISegment requestedSelection = offset1 < offset2 
? new Segment (offset1, offset2 - offset1) : new Segment (offset2, offset1 - 
offset2);
-                               if (this.minimalSelection != null) {
-                                       if (requestedSelection.EndOffset < 
minimalSelection.EndOffset) {
-                                               requestedSelection = new 
Segment (requestedSelection.Offset, minimalSelection.EndOffset - 
requestedSelection.Offset);
+                               Caret.PreserveSelection = true;
+                               switch (this.mouseSelectionMode) {
+                               case MouseSelectionMode.SingleChar:
+                                       textEditor.ExtendSelectionTo (loc);
+                                       Caret.Location = loc;
+                                       break;
+                               case MouseSelectionMode.Word:
+                                       int offset = 
textEditor.Document.LocationToOffset (loc);
+                                       int start;
+                                       int end;
+                                       if (offset < 
textEditor.SelectionAnchor) {
+                                               start = ScanWord (offset, 
false);
+                                               end   = ScanWord 
(textEditor.SelectionAnchor, true);
+                                               Caret.Offset = start;
+                                       } else {
+                                               start = ScanWord 
(textEditor.SelectionAnchor, false);
+                                               end   = ScanWord (offset, true);
+                                               Caret.Offset = end;
                                        }
-                                       
-                                       if (requestedSelection.Offset > 
minimalSelection.Offset) {
-                                               requestedSelection = new 
Segment (minimalSelection.Offset, requestedSelection.EndOffset - 
minimalSelection.Offset);
-                                       }
+                                       textEditor.SelectionRange = new Segment 
(start, end - start);
+                                       break;
+                               case MouseSelectionMode.WholeLine:
+                                       textEditor.SetSelectLines (loc.Line, 
textEditor.SelectionAnchorLocation.Line);
+                                       LineSegment line1 = 
textEditor.Document.GetLine (loc.Line);
+                                       LineSegment line2 = 
textEditor.Document.GetLineByOffset (textEditor.SelectionAnchor);
+                                       Caret.Offset = line1.Offset < 
line2.Offset ? line1.Offset : line1.EndOffset;
+                                       break;
                                }
-                               Caret.PreserveSelection = true;
-                               textEditor.SelectionRange = requestedSelection;
-                               Caret.Location = loc;
                                Caret.PreserveSelection = false;
 //                             textEditor.RedrawLines (System.Math.Min 
(oldLine, Caret.Line), System.Math.Max (oldLine, Caret.Line));
                        }
@@ -745,7 +763,6 @@
                
                public override void MouseLeft ()
                {
-                       textEditor.GdkWindow.Cursor = defaultCursor;
                }
                
                public DocumentLocation VisualToDocumentLocation (int x, int y)

Modified: trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor.mdp
===================================================================
--- trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor.mdp       
2008-02-18 22:56:07 UTC (rev 96107)
+++ trunk/monodevelop/main/src/addins/Mono.Texteditor/Mono.TextEditor.mdp       
2008-02-18 23:15:35 UTC (rev 96108)
@@ -38,7 +38,6 @@
     <File name="Mono.TextEditor/FoldMarkerMargin.cs" subtype="Code" 
buildaction="Compile" />
     <File name="Mono.TextEditor/IMargin.cs" subtype="Code" 
buildaction="Compile" />
     <File name="Mono.TextEditor.Highlighting/Chunk.cs" subtype="Code" 
buildaction="Compile" />
-    <File name="Mono.TextEditor/SelectionMarker.cs" subtype="Code" 
buildaction="Compile" />
     <File name="Mono.TextEditor/ISegment.cs" subtype="Code" 
buildaction="Compile" />
     <File name="Mono.TextEditor/TextEditorOptions.cs" subtype="Code" 
buildaction="Compile" />
     <File name="C64Style.xml" subtype="Code" buildaction="EmbedAsResource" />

Modified: trunk/monodevelop/main/src/addins/Mono.Texteditor/gtk-gui/objects.xml
===================================================================
--- trunk/monodevelop/main/src/addins/Mono.Texteditor/gtk-gui/objects.xml       
2008-02-18 22:56:07 UTC (rev 96107)
+++ trunk/monodevelop/main/src/addins/Mono.Texteditor/gtk-gui/objects.xml       
2008-02-18 23:15:35 UTC (rev 96108)
@@ -5,6 +5,7 @@
         <property name="SearchPattern" />
         <property name="HighlightSearchPattern" />
         <property name="SelectedText" />
+        <property name="SelectionAnchor" />
       </itemgroup>
     </itemgroups>
     <signals>

_______________________________________________
Mono-patches maillist  -  Mono-patches@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to