public CodeSegmentPreviewWindow (TextEditor editor, bool hideCodeSegmentPreviewInformString, ISegment segment, int width, int height) : base (Gtk.WindowType.Popup) { this.HideCodeSegmentPreviewInformString = hideCodeSegmentPreviewInformString; this.editor = editor; this.AppPaintable = true; layout = PangoUtil.CreateLayout (this); informLayout = PangoUtil.CreateLayout (this); informLayout.SetText (CodeSegmentPreviewInformString); fontDescription = Pango.FontDescription.FromString (editor.Options.FontName); fontDescription.Size = (int)(fontDescription.Size * 0.8f); layout.FontDescription = fontDescription; layout.Ellipsize = Pango.EllipsizeMode.End; // setting a max size for the segment (40 lines should be enough), // no need to markup thousands of lines for a preview window int startLine = editor.Document.OffsetToLineNumber (segment.Offset); int endLine = editor.Document.OffsetToLineNumber (segment.EndOffset); const int maxLines = 40; bool pushedLineLimit = endLine - startLine > maxLines; if (pushedLineLimit) segment = new Segment (segment.Offset, editor.Document.GetLine (startLine + maxLines).Offset - segment.Offset); layout.Ellipsize = Pango.EllipsizeMode.End; layout.SetMarkup (editor.Document.SyntaxMode.GetMarkup (editor.Document, editor.Options, editor.ColorStyle, segment.Offset, segment.Length, true) + (pushedLineLimit ? Environment.NewLine + "..." : "")); CalculateSize (); }
public Conflict(Mono.TextEditor.Segment mySegment, Mono.TextEditor.Segment theirSegment, Mono.TextEditor.Segment startSegment, Mono.TextEditor.Segment dividerSegment, Mono.TextEditor.Segment endSegment) { this.MySegment = mySegment; this.TheirSegment = theirSegment; this.StartSegment = startSegment; this.DividerSegment = dividerSegment; this.EndSegment = endSegment; }
static string GenerateRtf (Document doc, Mono.TextEditor.Highlighting.SyntaxMode mode, Mono.TextEditor.Highlighting.Style style, ITextEditorOptions options) { StringBuilder rtfText = new StringBuilder (); List<Gdk.Color> colorList = new List<Gdk.Color> (); ISegment selection = new Segment (0, doc.Length); int startLineNumber = doc.OffsetToLineNumber (selection.Offset); int endLineNumber = doc.OffsetToLineNumber (selection.EndOffset); bool isItalic = false; bool isBold = false; int curColor = -1; foreach (var line in doc.GetLinesBetween (startLineNumber, endLineNumber)) { bool appendSpace = false; for (Chunk chunk = mode.GetChunks (doc, style, line, line.Offset, line.EditableLength); chunk != null; chunk = chunk.Next) { int start = System.Math.Max (selection.Offset, chunk.Offset); int end = System.Math.Min (chunk.EndOffset, selection.EndOffset); ChunkStyle chunkStyle = chunk.GetChunkStyle (style); if (start < end) { if (isBold != chunkStyle.Bold) { rtfText.Append (chunkStyle.Bold ? @"\b" : @"\b0"); isBold = chunkStyle.Bold; appendSpace = true; } if (isItalic != chunkStyle.Italic) { rtfText.Append (chunkStyle.Italic ? @"\i" : @"\i0"); isItalic = chunkStyle.Italic; appendSpace = true; } if (!colorList.Contains (chunkStyle.Color)) colorList.Add (chunkStyle.Color); int color = colorList.IndexOf (chunkStyle.Color); if (curColor != color) { curColor = color; rtfText.Append (@"\cf" + (curColor + 1)); appendSpace = true; } for (int i = start; i < end; i++) { char ch = chunk.GetCharAt (doc, i); switch (ch) { case '\\': rtfText.Append (@"\\"); break; case '{': rtfText.Append (@"\{"); break; case '}': rtfText.Append (@"\}"); break; case '\t': rtfText.Append (@"\tab"); appendSpace = true; break; default: if (appendSpace) { rtfText.Append (' '); appendSpace = false; } rtfText.Append (ch); break; } } } } rtfText.Append (@"\par"); rtfText.AppendLine (); } // color table StringBuilder colorTable = new StringBuilder (); colorTable.Append (@"{\colortbl ;"); for (int i = 0; i < colorList.Count; i++) { Gdk.Color color = colorList[i]; colorTable.Append (@"\red"); colorTable.Append (color.Red / 256); colorTable.Append (@"\green"); colorTable.Append (color.Green / 256); colorTable.Append (@"\blue"); colorTable.Append (color.Blue / 256); colorTable.Append (";"); } colorTable.Append ("}"); StringBuilder rtf = new StringBuilder(); rtf.Append (@"{\rtf1\ansi\deff0\adeflang1025"); // font table rtf.Append (@"{\fonttbl"); rtf.Append (@"{\f0\fnil\fprq1\fcharset128 " + options.Font.Family + ";}"); rtf.Append ("}"); rtf.Append (colorTable.ToString ()); rtf.Append (@"\viewkind4\uc1\pard"); rtf.Append (@"\f0"); try { string fontName = options.Font.ToString (); double fontSize = Double.Parse (fontName.Substring (fontName.LastIndexOf (' ') + 1), System.Globalization.CultureInfo.InvariantCulture) * 2; rtf.Append (@"\fs"); rtf.Append (fontSize); } catch (Exception) {}; rtf.Append (@"\cf1"); rtf.Append (rtfText.ToString ()); rtf.Append("}"); // System.Console.WriteLine(rtf); return rtf.ToString (); }
ISegment GetFirstSearchResult (int startOffset, int endOffset) { if (startOffset < endOffset && this.selectedRegions.Count > 0) { ISegment region = new Segment (startOffset, endOffset - startOffset); foreach (ISegment segment in this.selectedRegions) { if (segment.Contains (startOffset) || segment.Contains (endOffset) || region.Contains (segment)) { return segment; } } } return null; }
ISegment GetFirstSearchResult (int startOffset, int endOffset) { if (startOffset < endOffset && this.selectedRegions.Count > 0) { ISegment region = new Segment (startOffset, endOffset - startOffset); int min = 0; int max = selectedRegions.Count - 1; do { int mid = (min + max) / 2; ISegment segment = selectedRegions[mid]; if (segment.Contains (startOffset) || segment.Contains (endOffset) || region.Contains (segment)) { if (mid == 0) return segment; ISegment prevSegment = selectedRegions[mid - 1]; if (!(prevSegment.Contains (startOffset) || prevSegment.Contains (endOffset) || region.Contains (prevSegment))) return segment; max = mid - 1; continue; } if (segment.Offset < endOffset) { min = mid + 1; } else { max = mid - 1; } } while (min <= max); } return null; }
static void HighlightSegment (Chunk startChunk, Segment namePart, string style) { for (Chunk searchChunk = startChunk; searchChunk != null; searchChunk = searchChunk.Next) { if (!searchChunk.Contains (namePart)) continue; if (searchChunk.Length == namePart.Length) { searchChunk.Style = style; break; } Chunk propertyChunk = new Chunk (namePart.Offset, namePart.Length, style); propertyChunk.Next = searchChunk.Next; searchChunk.Next = propertyChunk; if (searchChunk.EndOffset - propertyChunk.EndOffset > 0) { Chunk newChunk = new Chunk (propertyChunk.EndOffset, searchChunk.EndOffset - propertyChunk.EndOffset, searchChunk.Style); newChunk.Next = propertyChunk.Next; propertyChunk.Next = newChunk; } searchChunk.Length = namePart.Offset - searchChunk.Offset; break; } }
public override void Run (RefactoringOptions options) { if (options.SelectedItem is LocalVariable || options.SelectedItem is IParameter) { MemberReferenceCollection col = GetReferences (options); if (col == null) return; TextEditorData data = options.GetTextEditorData (); Mono.TextEditor.TextEditor editor = data.Parent; if (editor == null) { MessageService.ShowCustomDialog (new RenameItemDialog (options, this)); return; } List<TextLink> links = new List<TextLink> (); TextLink link = new TextLink ("name"); int baseOffset = Int32.MaxValue; foreach (MemberReference r in col) { baseOffset = Math.Min (baseOffset, data.Document.LocationToOffset (r.Line, r.Column)); } foreach (MemberReference r in col) { Segment segment = new Segment (data.Document.LocationToOffset (r.Line, r.Column) - baseOffset, r.Name.Length); if (segment.Offset <= data.Caret.Offset - baseOffset && data.Caret.Offset - baseOffset <= segment.EndOffset) { link.Links.Insert (0, segment); } else { link.AddLink (segment); } } links.Add (link); TextLinkEditMode tle = new TextLinkEditMode (editor, baseOffset, links); tle.SetCaretPosition = false; tle.SelectPrimaryLink = true; if (tle.ShouldStartTextLinkMode) { ModeHelpWindow helpWindow = new ModeHelpWindow (); helpWindow.TransientFor = IdeApp.Workbench.RootWindow; helpWindow.TitleText = options.SelectedItem is LocalVariable ? GettextCatalog.GetString ("<b>Local Variable -- Renaming</b>") : GettextCatalog.GetString ("<b>Parameter -- Renaming</b>"); helpWindow.Items.Add (new KeyValuePair<string, string> (GettextCatalog.GetString ("<b>Key</b>"), GettextCatalog.GetString ("<b>Behavior</b>"))); helpWindow.Items.Add (new KeyValuePair<string, string> (GettextCatalog.GetString ("<b>Return</b>"), GettextCatalog.GetString ("<b>Accept</b> this refactoring."))); helpWindow.Items.Add (new KeyValuePair<string, string> (GettextCatalog.GetString ("<b>Esc</b>"), GettextCatalog.GetString ("<b>Cancel</b> this refactoring."))); tle.HelpWindow = helpWindow; tle.Cancel += delegate { editor.Document.Undo (); }; tle.OldMode = data.CurrentMode; tle.StartMode (); data.CurrentMode = tle; } } else { MessageService.ShowCustomDialog (new RenameItemDialog (options, this)); } }
public Conflict (Mono.TextEditor.Segment mySegment, Mono.TextEditor.Segment theirSegment, Mono.TextEditor.Segment startSegment, Mono.TextEditor.Segment dividerSegment, Mono.TextEditor.Segment endSegment) { this.MySegment = mySegment; this.TheirSegment = theirSegment; this.StartSegment = startSegment; this.DividerSegment = dividerSegment; this.EndSegment = endSegment; }
public override void Run (RefactoringOptions options) { if (options.SelectedItem is LocalVariable || options.SelectedItem is IParameter) { MemberReferenceCollection col = GetReferences (options); if (col == null) return; TextEditorData data = options.GetTextEditorData (); Mono.TextEditor.TextEditor editor = data.Parent; if (editor == null) { MessageService.ShowCustomDialog (new RenameItemDialog (options, this)); return; } List<TextLink> links = new List<TextLink> (); TextLink link = new TextLink ("name"); int baseOffset = Int32.MaxValue; foreach (MemberReference r in col) { baseOffset = Math.Min (baseOffset, data.Document.LocationToOffset (r.Line - 1, r.Column - 1)); } foreach (MemberReference r in col) { Segment segment = new Segment (data.Document.LocationToOffset (r.Line - 1, r.Column - 1) - baseOffset, r.Name.Length); if (segment.Offset <= data.Caret.Offset - baseOffset && data.Caret.Offset - baseOffset <= segment.EndOffset) { link.Links.Insert (0, segment); } else { link.AddLink (segment); } } links.Add (link); TextLinkEditMode tle = new TextLinkEditMode (editor, baseOffset, links); tle.SetCaretPosition = false; tle.SelectPrimaryLink = true; if (tle.ShouldStartTextLinkMode) { tle.OldMode = data.CurrentMode; tle.StartMode (); data.CurrentMode = tle; } } else { MessageService.ShowCustomDialog (new RenameItemDialog (options, this)); } }