181
206
int startIndex = args.Offset;
182
207
int endIndex = startIndex + Math.Max (args.RemovalLength, args.InsertionLength);
183
if (TextChanged != null)
184
TextChanged (this, new TextChangedEventArgs (startIndex, endIndex));
208
foreach (var marker in currentErrorMarkers) {
209
if (marker.LineSegment.Contains (args.Offset) || marker.LineSegment.Contains (args.Offset + args.InsertionLength) || args.Offset < marker.LineSegment.Offset && marker.LineSegment.Offset < args.Offset + args.InsertionLength) {
210
markersToRemove.Enqueue (marker);
213
ResetRemoveMarker ();
187
216
widget.TextEditor.Document.LineChanged += delegate(object sender, LineEventArgs e) {
188
217
UpdateBreakpoints ();
218
UpdateWidgetPositions ();
189
219
if (messageBubbleCache != null && messageBubbleCache.RemoveLine (e.Line)) {
190
220
MessageBubbleTextMarker marker = currentErrorMarkers.FirstOrDefault (m => m.LineSegment == e.Line);
191
221
if (marker != null) {
192
double oldHeight = marker.lastHeight;
193
223
widget.TextEditor.TextViewMargin.RemoveCachedLine (e.Line);Ā
194
224
//Ā ensure that the line cache is renewed
195
double newHeight = marker.GetLineHeight (widget.TextEditor);
225
marker.GetLineHeight (widget.TextEditor);
265
290
Document.AddAnnotation (this);
266
291
FileRegistry.Add (this);
294
void HandleFileExtensionRemoved (object sender, FileExtensionEventArgs args)
296
if (ContentName == null || args.Extension.File.FullPath != Path.GetFullPath (ContentName))
298
RemoveFileExtension (args.Extension);
301
void HandleFileExtensionAdded (object sender, FileExtensionEventArgs args)
303
if (ContentName == null || args.Extension.File.FullPath != Path.GetFullPath (ContentName))
305
AddFileExtension (args.Extension);
308
Dictionary<TopLevelWidgetExtension,Gtk.Widget> widgetExtensions = new Dictionary<TopLevelWidgetExtension, Widget> ();
309
Dictionary<FileExtension,Tuple<TextLineMarker,DocumentLine>> markerExtensions = new Dictionary<FileExtension, Tuple<TextLineMarker,DocumentLine>> ();
311
void LoadExtensions ()
313
if (ContentName == null)
316
foreach (var ext in TextEditorService.GetFileExtensions (ContentName))
317
AddFileExtension (ext);
320
void AddFileExtension (FileExtension extension)
322
if (extension is TopLevelWidgetExtension) {
323
var widgetExtension = (TopLevelWidgetExtension)extension;
324
var w = widgetExtension.CreateWidget ();
326
if (!CalcWidgetPosition (widgetExtension, w, out x, out y)) {
331
widgetExtensions [widgetExtension] = w;
332
widget.TextEditor.TextArea.AddTopLevelWidget (w, x, y);
333
widgetExtension.ScrollToViewRequested += HandleScrollToViewRequested;
335
else if (extension is TextLineMarkerExtension) {
336
var lineExt = (TextLineMarkerExtension) extension;
338
DocumentLine line = widget.TextEditor.Document.GetLine (lineExt.Line);
342
var marker = lineExt.CreateMarker ();
343
widget.TextEditor.Document.AddMarker (line, marker);
344
widget.TextEditor.QueueDraw ();
345
markerExtensions [extension] = new Tuple<TextLineMarker,DocumentLine> (marker, line);
349
void HandleScrollToViewRequested (object sender, EventArgs e)
351
var widgetExtension = (TopLevelWidgetExtension)sender;
353
if (widgetExtensions.TryGetValue (widgetExtension, out w)) {
355
widget.TextEditor.TextArea.GetTopLevelWidgetPosition (w, out x, out y);
356
var size = w.SizeRequest ();
357
Gtk.Application.Invoke (delegate {
358
widget.TextEditor.ScrollTo (new Gdk.Rectangle (x, y, size.Width, size.Height));
363
void RemoveFileExtension (FileExtension extension)
365
if (extension is TopLevelWidgetExtension) {
366
var widgetExtension = (TopLevelWidgetExtension)extension;
368
if (!widgetExtensions.TryGetValue (widgetExtension, out w))
370
widgetExtensions.Remove (widgetExtension);
371
widget.TextEditor.TextArea.Remove (w);
373
widgetExtension.ScrollToViewRequested -= HandleScrollToViewRequested;
375
else if (extension is TextLineMarkerExtension) {
376
Tuple<TextLineMarker,DocumentLine> data;
377
if (markerExtensions.TryGetValue (extension, out data))
378
widget.TextEditor.Document.RemoveMarker (data.Item1);
382
void ClearExtensions ()
384
foreach (var ex in widgetExtensions.Keys)
385
ex.ScrollToViewRequested -= HandleScrollToViewRequested;
388
void UpdateWidgetPositions ()
390
foreach (var e in widgetExtensions) {
392
if (CalcWidgetPosition ((TopLevelWidgetExtension)e.Key, e.Value, out x, out y))
393
widget.TextEditor.TextArea.MoveTopLevelWidget (e.Value, x, y);
399
bool CalcWidgetPosition (TopLevelWidgetExtension widgetExtension, Gtk.Widget w, out int x, out int y)
401
DocumentLine line = widget.TextEditor.Document.GetLine (widgetExtension.Line);
408
widget.TextEditor.TextViewMargin.GetLayout (line).Layout.GetPixelSize (out lw, out lh);
409
lh = (int) TextEditor.TextViewMargin.GetLineHeight (widgetExtension.Line);
410
x = (int)widget.TextEditor.TextViewMargin.XOffset + lw + 4;
411
y = (int)widget.TextEditor.LineToY (widgetExtension.Line);
412
int lineStart = (int)widget.TextEditor.TextViewMargin.XOffset;
413
var size = w.SizeRequest ();
415
switch (widgetExtension.HorizontalAlignment) {
416
case HorizontalAlignment.LineLeft:
417
x = (int)widget.TextEditor.TextViewMargin.XOffset;
419
case HorizontalAlignment.LineRight:
420
x = lineStart + lw + 4;
422
case HorizontalAlignment.LineCenter:
423
x = lineStart + (lw - size.Width) / 2;
427
case HorizontalAlignment.Left:
430
case HorizontalAlignment.Right:
432
case HorizontalAlignment.Center:
434
case HorizontalAlignment.ViewLeft:
436
case HorizontalAlignment.ViewRight:
438
case HorizontalAlignment.ViewCenter:
442
switch (widgetExtension.VerticalAlignment) {
443
case VerticalAlignment.LineTop:
444
break; // the default
445
case VerticalAlignment.LineBottom:
446
y += lh - size.Height;
448
case VerticalAlignment.LineCenter:
449
y = y + (lh - size.Height) / 2;
451
case VerticalAlignment.AboveLine:
454
case VerticalAlignment.BelowLine:
458
x += widgetExtension.OffsetX;
459
y += widgetExtension.OffsetY;
463
void HandleWorkbenchWindowChanged (object sender, EventArgs e)
465
if (WorkbenchWindow != null) {
466
widget.TextEditor.ExtensionContext = WorkbenchWindow.ExtensionContext;
467
WorkbenchWindow.ActiveViewContentChanged += HandleActiveViewContentChanged;
468
this.WorkbenchWindowChanged -= HandleWorkbenchWindowChanged;
472
void HandleActiveViewContentChanged (object o, ActiveViewContentEventArgs e)
474
widget.UpdateLineCol ();
269
477
MessageBubbleHighlightPopupWindow messageBubbleHighlightPopupWindow = null;
1066
1326
void OnIconButtonPress (object s, MarginMouseEventArgs args)
1328
if (args.LineNumber < DocumentLocation.MinLine)
1068
1331
if (args.TriggersContextMenu ()) {
1069
TextEditor.Caret.Line = args.LineNumber;
1070
TextEditor.Caret.Column = 1;
1071
IdeApp.CommandService.ShowContextMenu (WorkbenchWindow.ExtensionContext, "/MonoDevelop/SourceEditor2/IconContextMenu/Editor");
1332
if (TextEditor.Caret.Line != args.LineNumber) {
1333
TextEditor.Caret.Line = args.LineNumber;
1334
TextEditor.Caret.Column = 1;
1337
IdeApp.CommandService.ShowContextMenu (
1339
args.RawEvent as Gdk.EventButton,
1340
WorkbenchWindow.ExtensionContext ?? AddinManager.AddinEngine,
1341
"/MonoDevelop/SourceEditor2/IconContextMenu/Editor");
1072
1342
} else if (args.Button == 1) {
1073
1343
if (!string.IsNullOrEmpty (this.Document.FileName)) {
1074
if (args.LineSegment != null)
1075
DebuggingService.Breakpoints.Toggle (this.Document.FileName, args.LineNumber);
1344
if (args.LineSegment != null) {
1345
int column = TextEditor.Caret.Line == args.LineNumber ? TextEditor.Caret.Column : 1;
1347
DebuggingService.Breakpoints.Toggle (this.Document.FileName, args.LineNumber, column);
1460
1731
CodeCompletionContext result = new CodeCompletionContext ();
1461
1732
result.TriggerOffset = triggerOffset;
1462
DocumentLocation loc = Document.OffsetToLocation (triggerOffset);
1733
DocumentLocation loc = widget.TextEditor.Caret.Location;
1463
1734
result.TriggerLine = loc.Line;
1464
1735
result.TriggerLineOffset = loc.Column - 1;
1465
var p = DocumentToScreenLocation (loc);
1466
result.TriggerXCoord = p.X;
1467
result.TriggerYCoord = p.Y;
1468
result.TriggerTextHeight = (int)TextEditor.LineHeight;
1736
/* var p = new Cairo.Point ((int)this.widget.TextEditor.TextViewMargin.CaretVisualLocation.X,
1737
(int)this.widget.TextEditor.TextViewMargin.CaretVisualLocation.Y);
1738
if (widget.TextEditor.Caret.Location.Column == loc.Column)*/
1739
var p = this.widget.TextEditor.LocationToPoint (loc);
1741
widget.TextEditor.ParentWindow.GetOrigin (out tx, out ty);
1742
tx += widget.TextEditor.Allocation.X + (int)p.X;
1743
ty += widget.TextEditor.Allocation.Y + (int)p.Y + (int)TextEditor.LineHeight;
1745
result.TriggerXCoord = tx;
1746
result.TriggerYCoord = ty;
1747
result.TriggerTextHeight = (int)TextEditor.GetLineHeight (loc.Line);