From bc52b86150f11966fd091a7e8ce3dc1edab6c74d Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 7 Oct 2006 17:48:24 +0000 Subject: [PATCH] Use GDI (TextRenderer) instead of GDI+ (DrawString) for text rendering in the text editor. Fixes SD2-1135: Font width measurement not exact for some fonts git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1893 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Nodes/SpanNode.cs | 2 +- .../Document/DefaultTextEditorProperties.cs | 22 ++++- .../HighlightingStrategy/FontContainer.cs | 77 +++++++++------- .../HighlightingStrategy/HighlightColor.cs | 29 +++---- .../Document/HighlightingStrategy/TextWord.cs | 41 ++++++--- .../Src/Document/ITextEditorProperties.cs | 4 + .../Project/Src/Gui/DrawableLine.cs | 2 +- .../Project/Src/Gui/GutterMargin.cs | 2 +- .../Project/Src/Gui/TextEditorControl.cs | 8 +- .../Project/Src/Gui/TextView.cs | 87 ++++++++++--------- .../Project/Src/Util/RtfWriter.cs | 16 ++-- .../Bookmarks/Pad/Nodes/BookmarkNode.cs | 2 +- .../Gui/Dialogs/ExportProjectToHtmlDialog.cs | 10 +-- .../SharpDevelopTextEditorProperties.cs | 22 +++-- 14 files changed, 193 insertions(+), 131 deletions(-) diff --git a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs index 50a338f793..0bfb0373a0 100644 --- a/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs +++ b/src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs @@ -281,7 +281,7 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes Properties properties = ((Properties)PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties())); ////samBegin.Font = samEnd.Font = samCont.Font = ParseFont(properties.Get("DefaultFont", new Font("Courier New", 10).ToString())); - samBegin.Font = samEnd.Font = samCont.Font = FontContainer.DefaultFont; + samBegin.Font = samEnd.Font = samCont.Font = ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.SharpDevelopTextEditorProperties.FontContainer.DefaultFont; nameBox.Text = node.Name; ruleBox.Text = node.Rule; diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultTextEditorProperties.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultTextEditorProperties.cs index 4fd6b4ea95..9dcc28a63c 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultTextEditorProperties.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultTextEditorProperties.cs @@ -23,6 +23,16 @@ namespace ICSharpCode.TextEditor.Document DocumentSelectionMode documentSelectionMode = DocumentSelectionMode.Normal; Encoding encoding = System.Text.Encoding.UTF8; BracketMatchingStyle bracketMatchingStyle = BracketMatchingStyle.After; + FontContainer fontContainer; + static Font DefaultFont; + + public DefaultTextEditorProperties() + { + if (DefaultFont == null) { + DefaultFont = new Font("Courier New", 10); + } + this.fontContainer = new FontContainer(DefaultFont); + } bool allowCaretBeyondEOL = false; @@ -270,10 +280,16 @@ namespace ICSharpCode.TextEditor.Document public Font Font { get { - return FontContainer.DefaultFont; + return fontContainer.DefaultFont; } set { - FontContainer.DefaultFont = value; + fontContainer.DefaultFont = value; + } + } + + public FontContainer FontContainer { + get { + return fontContainer; } } @@ -293,6 +309,6 @@ namespace ICSharpCode.TextEditor.Document set { useCustomLine = value; } - } + } } } diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/FontContainer.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/FontContainer.cs index df544eb39d..960402d6c7 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/FontContainer.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/FontContainer.cs @@ -23,77 +23,88 @@ namespace ICSharpCode.TextEditor.Document /// public class FontContainer { - static Font defaultfont = null; - static Font boldfont = null; - static Font italicfont = null; - static Font bolditalicfont = null; + Font defaultFont; + Font regularfont, boldfont, italicfont, bolditalicfont; /// - /// The bold version of the base font + /// The scaled, bold version of the base font /// - public static Font BoldFont { + public Font RegularFont { + get { + return regularfont; + } + } + + /// + /// The scaled, bold version of the base font + /// + public Font BoldFont { get { - Debug.Assert(boldfont != null, "ICSharpCode.TextEditor.Document.FontContainer : boldfont == null"); return boldfont; } } /// - /// The italic version of the base font + /// The scaled, italic version of the base font /// - public static Font ItalicFont { + public Font ItalicFont { get { - Debug.Assert(italicfont != null, "ICSharpCode.TextEditor.Document.FontContainer : italicfont == null"); return italicfont; } } /// - /// The bold/italic version of the base font + /// The scaled, bold/italic version of the base font /// - public static Font BoldItalicFont { + public Font BoldItalicFont { get { - Debug.Assert(bolditalicfont != null, "ICSharpCode.TextEditor.Document.FontContainer : bolditalicfont == null"); return bolditalicfont; } } + static float twipsPerPixelY; + + public static float TwipsPerPixelY { + get { + if (twipsPerPixelY == 0) { + using (Bitmap bmp = new Bitmap(1,1)) { + using (Graphics g = Graphics.FromImage(bmp)) { + twipsPerPixelY = 1440 / g.DpiY; + } + } + } + return twipsPerPixelY; + } + } + /// /// The base font /// - public static Font DefaultFont { + public Font DefaultFont { get { - return defaultfont; + return defaultFont; } set { -////// Alex: free resources properly -// if (defaultfont!=null) defaultfont.Dispose(); - defaultfont = value; -// if (boldfont!=null) boldfont.Dispose(); - boldfont = new Font(defaultfont, FontStyle.Bold); -// if (italicfont!=null) italicfont.Dispose(); - italicfont = new Font(defaultfont, FontStyle.Italic); -// if (bolditalicfont!=null) bolditalicfont.Dispose(); - bolditalicfont = new Font(defaultfont, FontStyle.Bold | FontStyle.Italic); + // 1440 twips is one inch + int pixelSize = (int)(value.SizeInPoints * 20 / TwipsPerPixelY); + + defaultFont = value; + regularfont = new Font(value.FontFamily, pixelSize * TwipsPerPixelY / 20f, FontStyle.Regular); + boldfont = new Font(regularfont, FontStyle.Bold); + italicfont = new Font(regularfont, FontStyle.Italic); + bolditalicfont = new Font(regularfont, FontStyle.Bold | FontStyle.Italic); } } -// static void CheckFontChange(object sender, PropertyEventArgs e) -// { -// if (e.Key == "DefaultFont") { -// DefaultFont = ParseFont(e.NewValue.ToString()); -// } -// } - public static Font ParseFont(string font) { string[] descr = font.Split(new char[]{',', '='}); return new Font(descr[1], Single.Parse(descr[3])); } - static FontContainer() + public FontContainer(Font defaultFont) { - DefaultFont = new Font("Courier New", 10); + this.DefaultFont = defaultFont; } } } diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/HighlightColor.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/HighlightColor.cs index f464b7faf0..5b4ed7dc6b 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/HighlightColor.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/HighlightColor.cs @@ -18,7 +18,7 @@ using System.Xml; namespace ICSharpCode.TextEditor.Document { /// - /// A color used for highlighting + /// A color used for highlighting /// public class HighlightColor { @@ -94,21 +94,20 @@ namespace ICSharpCode.TextEditor.Document /// /// The font used /// - public Font Font { - get { - if (Bold) { - return Italic ? FontContainer.BoldItalicFont : FontContainer.BoldFont; - } - return Italic ? FontContainer.ItalicFont : FontContainer.DefaultFont; + public Font GetFont(FontContainer fontContainer) + { + if (Bold) { + return Italic ? fontContainer.BoldItalicFont : fontContainer.BoldFont; } + return Italic ? fontContainer.ItalicFont : fontContainer.RegularFont; } Color ParseColorString(string colorName) { string[] cNames = colorName.Split('*'); - PropertyInfo myPropInfo = typeof(System.Drawing.SystemColors).GetProperty(cNames[0], BindingFlags.Public | - BindingFlags.Instance | - BindingFlags.Static); + PropertyInfo myPropInfo = typeof(System.Drawing.SystemColors).GetProperty(cNames[0], BindingFlags.Public | + BindingFlags.Instance | + BindingFlags.Static); Color c = (Color)myPropInfo.GetValue(null, null); if (cNames.Length == 2) { @@ -247,7 +246,7 @@ namespace ICSharpCode.TextEditor.Document this.systemColor = true; systemColorName = systemColor; - + systemBgColor = true; systemBgColorName = systemBackgroundColor; @@ -275,10 +274,10 @@ namespace ICSharpCode.TextEditor.Document /// public override string ToString() { - return "[HighlightColor: Bold = " + Bold + - ", Italic = " + Italic + - ", Color = " + Color + - ", BackgroundColor = " + BackgroundColor + "]"; + return "[HighlightColor: Bold = " + Bold + + ", Italic = " + Italic + + ", Color = " + Color + + ", BackgroundColor = " + BackgroundColor + "]"; } } } diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/TextWord.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/TextWord.cs index 521be9f42e..77dbcd33b6 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/TextWord.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/TextWord.cs @@ -43,10 +43,9 @@ namespace ICSharpCode.TextEditor.Document base.SyntaxColor = color; } - public override Font Font { - get { - return null; - } + public override Font GetFont(FontContainer fontContainer) + { + return null; } public override TextWordType Type { @@ -73,10 +72,9 @@ namespace ICSharpCode.TextEditor.Document base.SyntaxColor = color; } - public override Font Font { - get { - return null; - } + public override Font GetFont(FontContainer fontContainer) + { + return null; } public override TextWordType Type { @@ -160,10 +158,9 @@ namespace ICSharpCode.TextEditor.Document } } - public virtual Font Font { - get { - return color.Font; - } + public virtual Font GetFont(FontContainer fontContainer) + { + return color.GetFont(fontContainer); } public Color Color { @@ -175,6 +172,24 @@ namespace ICSharpCode.TextEditor.Document } } + public bool Bold { + get { + if (color == null) + return false; + else + return color.Bold; + } + } + + public bool Italic { + get { + if (color == null) + return false; + else + return color.Italic; + } + } + public HighlightColor SyntaxColor { get { return color; @@ -215,7 +230,7 @@ namespace ICSharpCode.TextEditor.Document /// public override string ToString() { - return "[TextWord: Word = " + Word + ", Font = " + Font + ", Color = " + Color + "]"; + return "[TextWord: Word = " + Word + ", Color = " + Color + "]"; } } } diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/ITextEditorProperties.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/ITextEditorProperties.cs index 5da0871512..d98ffe9d4a 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/ITextEditorProperties.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/ITextEditorProperties.cs @@ -148,6 +148,10 @@ namespace ICSharpCode.TextEditor.Document set; } + FontContainer FontContainer { + get; + } + BracketMatchingStyle BracketMatchingStyle { // is wrapped in text editor control get; set; diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/DrawableLine.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/DrawableLine.cs index 16dcf8745e..6d14585b96 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/DrawableLine.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/DrawableLine.cs @@ -53,7 +53,7 @@ namespace ICSharpCode.TextEditor } else if (word.Type == TextWordType.Tab) { words.Add(SimpleTextWord.Tab); } else { - words.Add(new SimpleTextWord(TextWordType.Word, word.Word, word.Font.Bold, word.Color)); + words.Add(new SimpleTextWord(TextWordType.Word, word.Word, word.Bold, word.Color)); } } } else { diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/GutterMargin.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/GutterMargin.cs index 9bd688d29e..8b52673cb7 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/GutterMargin.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/GutterMargin.cs @@ -84,7 +84,7 @@ namespace ICSharpCode.TextEditor if (curLine < textArea.Document.TotalNumberOfLines) { g.DrawString((curLine + 1).ToString(), - lineNumberPainterColor.Font, + lineNumberPainterColor.GetFont(TextEditorProperties.FontContainer), drawBrush, backgroundRectangle, numberStringFormat); diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextEditorControl.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextEditorControl.cs index 21f90ef19d..e3f387140d 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextEditorControl.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextEditorControl.cs @@ -312,6 +312,7 @@ namespace ICSharpCode.TextEditor float fontHeight = Font.GetHeight(g); // bool gotNonWhitespace = false; curTabIndent = 0; + FontContainer fontContainer = TextEditorProperties.FontContainer; foreach (TextWord word in line.Words) { switch (word.Type) { case TextWordType.Space: @@ -331,7 +332,7 @@ namespace ICSharpCode.TextEditor // gotNonWhitespace = true; // curTabIndent += TabIndent * primaryTextArea.TextArea.TextView.GetWidth(' '); // } - SizeF drawingSize = g.MeasureString(word.Word, word.Font, new SizeF(maxWidth, fontHeight * 100), printingStringFormat); + SizeF drawingSize = g.MeasureString(word.Word, word.GetFont(fontContainer), new SizeF(maxWidth, fontHeight * 100), printingStringFormat); Advance(ref xPos, ref yPos, maxWidth, drawingSize.Width, fontHeight); break; } @@ -346,6 +347,7 @@ namespace ICSharpCode.TextEditor // bool gotNonWhitespace = false; curTabIndent = 0 ; + FontContainer fontContainer = TextEditorProperties.FontContainer; foreach (TextWord word in line.Words) { switch (word.Type) { case TextWordType.Space: @@ -365,8 +367,8 @@ namespace ICSharpCode.TextEditor // gotNonWhitespace = true; // curTabIndent += TabIndent * primaryTextArea.TextArea.TextView.GetWidth(' '); // } - g.DrawString(word.Word, word.Font, BrushRegistry.GetBrush(word.Color), xPos + margin.X, yPos); - SizeF drawingSize = g.MeasureString(word.Word, word.Font, new SizeF(margin.Width, fontHeight * 100), printingStringFormat); + g.DrawString(word.Word, word.GetFont(fontContainer), BrushRegistry.GetBrush(word.Color), xPos + margin.X, yPos); + SizeF drawingSize = g.MeasureString(word.Word, word.GetFont(fontContainer), new SizeF(margin.Width, fontHeight * 100), printingStringFormat); Advance(ref xPos, ref yPos, margin.Width, drawingSize.Width, fontHeight); break; } diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs index 8fe522b151..aadbbe8f05 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs @@ -33,14 +33,14 @@ namespace ICSharpCode.TextEditor { int fontHeight; //Hashtable charWitdh = new Hashtable(); - StringFormat measureStringFormat = (StringFormat)StringFormat.GenericTypographic.Clone(); + //StringFormat measureStringFormat = (StringFormat)StringFormat.GenericTypographic.Clone(); Highlight highlight; int physicalColumn = 0; // used for calculating physical column during paint public void Dispose() { measureCache.Clear(); - measureStringFormat.Dispose(); + //measureStringFormat.Dispose(); } public Highlight Highlight { @@ -101,11 +101,11 @@ namespace ICSharpCode.TextEditor public TextView(TextArea textArea) : base(textArea) { - measureStringFormat.LineAlignment = StringAlignment.Near; + /*measureStringFormat.LineAlignment = StringAlignment.Near; measureStringFormat.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.FitBlackBox | StringFormatFlags.NoWrap | - StringFormatFlags.NoClip; + StringFormatFlags.NoClip;*/ base.Cursor = Cursors.IBeam; OptionsChanged(); @@ -113,8 +113,9 @@ namespace ICSharpCode.TextEditor static int GetFontHeight(Font font) { - int h = font.Height; - return (h < 16) ? h + 1 : h; + int height1 = TextRenderer.MeasureText("_", font).Height; + int height2 = (int)Math.Ceiling(font.GetHeight()); + return Math.Max(height1, height2) + 1; } float spaceWidth; @@ -145,9 +146,9 @@ namespace ICSharpCode.TextEditor public void OptionsChanged() { - this.lastFont = TextEditorProperties.Font; + this.lastFont = TextEditorProperties.FontContainer.RegularFont; this.fontHeight = GetFontHeight(lastFont); - // use mininum width - in some fonts, space has no width but kerning is used instead + // use minimum width - in some fonts, space has no width but kerning is used instead // -> DivideByZeroException this.spaceWidth = Math.Max(GetWidth(' ', lastFont), 1); // tab should have the width of 4*'x' @@ -162,7 +163,7 @@ namespace ICSharpCode.TextEditor } // Just to ensure that fontHeight and char widths are always correct... - if (lastFont != TextEditorProperties.Font) { + if (lastFont != TextEditorProperties.FontContainer.RegularFont) { OptionsChanged(); base.TextArea.BeginInvoke(new MethodInvoker(base.TextArea.Refresh)); } @@ -307,11 +308,11 @@ namespace ICSharpCode.TextEditor g.FillRectangle(backgroundBrush, rect); physicalColumn += text.Length; - g.DrawString(text, - textArea.Font, - BrushRegistry.GetBrush(drawSelected ? selectionColor.Color : Color.Gray), - rect, - measureStringFormat); + DrawString(g, + text, + textArea.Font, + drawSelected ? selectionColor.Color : Color.Gray, + rect.X, rect.Y); g.DrawRectangle(BrushRegistry.GetPen(drawSelected ? Color.DarkGray : Color.Gray), rect.X, rect.Y, rect.Width, rect.Height); // Bugfix for the problem - of overdrawn right rectangle lines. @@ -411,6 +412,7 @@ namespace ICSharpCode.TextEditor TextWord currentWord; TextWord nextCurrentWord = null; + FontContainer fontContainer = TextEditorProperties.FontContainer; for (int wordIdx = 0; wordIdx < currentLine.Words.Count; wordIdx++) { currentWord = currentLine.Words[wordIdx]; if (currentWordOffset < startColumn) { @@ -534,7 +536,7 @@ namespace ICSharpCode.TextEditor float wordWidth = DrawDocumentWord(g, currentWord.Word, new Point((int)physicalXPos, lineRectangle.Y), - currentWord.Font, + currentWord.GetFont(fontContainer), wordForeColor, wordBackBrush); wordRectangle = new RectangleF(physicalXPos, lineRectangle.Y, wordWidth, lineRectangle.Height); @@ -598,12 +600,12 @@ namespace ICSharpCode.TextEditor g.FillRectangle(backBrush, //num == 0 ? Brushes.LightBlue : num == 1 ? Brushes.LightGreen : Brushes.Yellow, new RectangleF(position.X, position.Y, (float)Math.Ceiling(wordWidth + 1), FontHeight)); - g.DrawString(word, - font, - BrushRegistry.GetBrush(foreColor), - position.X, - position.Y, - measureStringFormat); + DrawString(g, + word, + font, + foreColor, + position.X, + position.Y); return wordWidth; } @@ -625,15 +627,15 @@ namespace ICSharpCode.TextEditor } } - Dictionary measureCache = new Dictionary(); + Dictionary measureCache = new Dictionary(); // split words after 1000 characters. Fixes GDI+ crash on very longs words, for example // a 100 KB Base64-file without any line breaks. const int MaximumWordLength = 1000; - float MeasureStringWidth(Graphics g, string word, Font font) + int MeasureStringWidth(Graphics g, string word, Font font) { - float width; + int width; if (word == null || word.Length == 0) return 0; @@ -659,15 +661,12 @@ namespace ICSharpCode.TextEditor // txt.GetPositionFromCharIndex(txt.SelectionStart) // (Verdana 10, highlighting makes GetP... bold) -> note the space between 'x' and '(' // this also fixes "jumping" characters when selecting in non-monospace fonts - Rectangle rect = new Rectangle(0, 0, 32768, 1000); - CharacterRange[] ranges = { new CharacterRange(0, word.Length) }; - Region[] regions = new Region[1]; - measureStringFormat.SetMeasurableCharacterRanges (ranges); - regions = g.MeasureCharacterRanges (word, font, rect, measureStringFormat); - width = regions[0].GetBounds(g).Right; + width = TextRenderer.MeasureText(g, word, font, new Size(short.MaxValue, short.MaxValue), textFormatFlags).Width; measureCache.Add(new WordFontPair(word, font), width); return width; } + + const TextFormatFlags textFormatFlags = TextFormatFlags.NoPadding | TextFormatFlags.NoPrefix; #endregion #region Conversion Functions @@ -803,7 +802,7 @@ namespace ICSharpCode.TextEditor paintPos += (column - oldColumn) * spaceWidth; break; default: - paintPos += GetWidth(ch, TextEditorProperties.Font); + paintPos += GetWidth(ch, TextEditorProperties.FontContainer.RegularFont); ++column; break; } @@ -877,7 +876,7 @@ namespace ICSharpCode.TextEditor paintPos += (column - oldColumn) * WideSpaceWidth; break; default: - paintPos += GetWidth(ch, TextEditorProperties.Font); + paintPos += GetWidth(ch, TextEditorProperties.FontContainer.RegularFont); ++column; break; } @@ -905,6 +904,7 @@ namespace ICSharpCode.TextEditor if (words == null) return 0; int wordCount = words.Count; int wordOffset = 0; + FontContainer fontContainer = TextEditorProperties.FontContainer; for (int i = 0; i < wordCount; i++) { TextWord word = words[i]; if (wordOffset >= end) @@ -924,7 +924,7 @@ namespace ICSharpCode.TextEditor int wordStart = Math.Max(wordOffset, start); int wordLength = Math.Min(wordOffset + word.Length, end) - wordStart; string text = Document.GetText(currentLine.Offset + wordStart, wordLength); - drawingPos += MeasureStringWidth(g, text, word.Font ?? TextEditorProperties.Font); + drawingPos += MeasureStringWidth(g, text, word.GetFont(fontContainer) ?? fontContainer.RegularFont); break; } wordOffset += word.Length; @@ -1023,7 +1023,7 @@ namespace ICSharpCode.TextEditor drawingPos += CountColumns(ref column, foldEnd, f.StartColumn, f.StartLine, g); foldEnd = f.EndColumn; column += f.FoldText.Length; - drawingPos += MeasureStringWidth(g, f.FoldText, TextEditorProperties.Font); + drawingPos += MeasureStringWidth(g, f.FoldText, TextEditorProperties.FontContainer.RegularFont); } drawingPos += CountColumns(ref column, foldEnd, logicalColumn, logicalLine, g); g.Dispose(); @@ -1038,33 +1038,38 @@ namespace ICSharpCode.TextEditor g.DrawRectangle(Pens.Blue, rect); } + void DrawString(Graphics g, string text, Font font, Color color, float x, float y) + { + TextRenderer.DrawText(g, text, font, new Point((int)x, (int)y), color, textFormatFlags); + } + void DrawInvalidLineMarker(Graphics g, float x, float y) { HighlightColor invalidLinesColor = textArea.Document.HighlightingStrategy.GetColorFor("InvalidLines"); - g.DrawString("~", invalidLinesColor.Font, BrushRegistry.GetBrush(invalidLinesColor.Color), x, y, measureStringFormat); + DrawString(g, "~", invalidLinesColor.GetFont(TextEditorProperties.FontContainer), invalidLinesColor.Color, x, y); } void DrawSpaceMarker(Graphics g, Color color, float x, float y) { HighlightColor spaceMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("SpaceMarkers"); - g.DrawString("\u00B7", spaceMarkerColor.Font, BrushRegistry.GetBrush(color), x, y, measureStringFormat); + DrawString(g, "\u00B7", spaceMarkerColor.GetFont(TextEditorProperties.FontContainer), color, x, y); } void DrawTabMarker(Graphics g, Color color, float x, float y) { HighlightColor tabMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("TabMarkers"); - g.DrawString("\u00BB", tabMarkerColor.Font, BrushRegistry.GetBrush(color), x, y, measureStringFormat); + DrawString(g, "\u00BB", tabMarkerColor.GetFont(TextEditorProperties.FontContainer), color, x, y); } float DrawEOLMarker(Graphics g, Color color, Brush backBrush, float x, float y) { - float width = GetWidth('\u00B6', TextEditorProperties.Font); + HighlightColor eolMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("EOLMarkers"); + + float width = GetWidth('\u00B6', eolMarkerColor.GetFont(TextEditorProperties.FontContainer)); g.FillRectangle(backBrush, new RectangleF(x, y, width, fontHeight)); - HighlightColor eolMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("EOLMarkers"); - - g.DrawString("\u00B6", eolMarkerColor.Font, BrushRegistry.GetBrush(color), x, y, measureStringFormat); + DrawString(g, "\u00B6", eolMarkerColor.GetFont(TextEditorProperties.FontContainer), color, x, y); return width; } diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Util/RtfWriter.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Util/RtfWriter.cs index d639fae130..1ecbb79cd8 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Util/RtfWriter.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Util/RtfWriter.cs @@ -51,7 +51,7 @@ namespace ICSharpCode.TextEditor.Util static void BuildFontTable(IDocument doc, StringBuilder rtf) { rtf.Append(@"{\fonttbl"); - rtf.Append(@"{\f0\fmodern\fprq1\fcharset0 " + FontContainer.DefaultFont.Name + ";}"); + rtf.Append(@"{\f0\fmodern\fprq1\fcharset0 " + doc.TextEditorProperties.Font.Name + ";}"); rtf.Append("}"); } @@ -107,28 +107,28 @@ namespace ICSharpCode.TextEditor.Util escapeSequence = true; } - if (oldItalic != word.Font.Italic) { - if (word.Font.Italic) { + if (oldItalic != word.Italic) { + if (word.Italic) { rtf.Append(@"\i"); } else { rtf.Append(@"\i0"); } - oldItalic = word.Font.Italic; + oldItalic = word.Italic; escapeSequence = true; } - if (oldBold != word.Font.Bold) { - if (word.Font.Bold) { + if (oldBold != word.Bold) { + if (word.Bold) { rtf.Append(@"\b"); } else { rtf.Append(@"\b0"); } - oldBold = word.Font.Bold; + oldBold = word.Bold; escapeSequence = true; } if (firstLine) { - rtf.Append(@"\f0\fs" + (FontContainer.DefaultFont.Size * 2)); + rtf.Append(@"\f0\fs" + (textArea.TextEditorProperties.Font.Size * 2)); firstLine = false; } if (escapeSequence) { diff --git a/src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkNode.cs b/src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkNode.cs index b4f211861a..13d5aa906e 100644 --- a/src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkNode.cs +++ b/src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkNode.cs @@ -133,7 +133,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks xPos += DrawDocumentWord(g, word.Word, new PointF(xPos, yPos), - word.Font.Style == FontStyle.Bold ? BoldMonospacedFont : MonospacedFont, + word.Bold ? BoldMonospacedFont : MonospacedFont, GetTextColor(state, word.Color) ); logicalX += word.Word.Length; diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Dialogs/ExportProjectToHtmlDialog.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Dialogs/ExportProjectToHtmlDialog.cs index 291bab08ac..21dacec15e 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Dialogs/ExportProjectToHtmlDialog.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Dialogs/ExportProjectToHtmlDialog.cs @@ -248,16 +248,16 @@ namespace ICSharpCode.SharpDevelop.Gui Color c = word.Color; string colorstr = c.R + ", " + c.G + ", " + c.B; - if (word.Font.Italic) { + if (word.Italic) { colorstr = "i" + colorstr; } - if (word.Font.Bold) { + if (word.Bold) { colorstr = "b" + colorstr; } if (Spans[colorstr] == null) { Spans[colorstr] = "span" + ++curSpanNumber; } - bool newColor = c != curColor || oldItalic != word.Font.Italic || oldBold != word.Font.Bold; + bool newColor = c != curColor || oldItalic != word.Italic || oldBold != word.Bold; if (newColor) { if (!firstSpan) { curFileStream.Write("" ); @@ -271,8 +271,8 @@ namespace ICSharpCode.SharpDevelop.Gui if (newColor) { curColor = c; - oldItalic = word.Font.Italic; - oldBold = word.Font.Bold; + oldItalic = word.Italic; + oldBold = word.Bold; } break; } diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextEditorProperties.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextEditorProperties.cs index c471c4fbb6..6cb43fd084 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextEditorProperties.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextEditorProperties.cs @@ -17,20 +17,20 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor { public class SharpDevelopTextEditorProperties : ITextEditorProperties { - static - Properties properties; + static Properties properties; + static FontContainer fontContainer; static SharpDevelopTextEditorProperties() { Properties properties2 = ((Properties)PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties())); - FontContainer.DefaultFont = FontContainer.ParseFont(properties2.Get("DefaultFont", ResourceService.DefaultMonospacedFont.ToString())); + fontContainer = new FontContainer(FontContainer.ParseFont(properties2.Get("DefaultFont", ResourceService.DefaultMonospacedFont.ToString()))); properties2.PropertyChanged += new PropertyChangedEventHandler(CheckFontChange); } static void CheckFontChange(object sender, PropertyChangedEventArgs e) { if (e.Key == "DefaultFont") { - FontContainer.DefaultFont = FontContainer.ParseFont(e.NewValue.ToString()); + fontContainer.DefaultFont = FontContainer.ParseFont(e.NewValue.ToString()); } } @@ -274,11 +274,21 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor public Font Font { get { - return FontContainer.DefaultFont; + return fontContainer.DefaultFont; } set { properties.Set("DefaultFont", value.ToString()); - FontContainer.DefaultFont = value; + fontContainer.DefaultFont = value; + } + } + FontContainer ITextEditorProperties.FontContainer { + get { + return fontContainer; + } + } + public static FontContainer FontContainer { + get { + return fontContainer; } }