Browse Source

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
shortcuts
Daniel Grunwald 20 years ago
parent
commit
bc52b86150
  1. 2
      src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs
  2. 22
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultTextEditorProperties.cs
  3. 77
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/FontContainer.cs
  4. 29
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/HighlightColor.cs
  5. 41
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/TextWord.cs
  6. 4
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/ITextEditorProperties.cs
  7. 2
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/DrawableLine.cs
  8. 2
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/GutterMargin.cs
  9. 8
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextEditorControl.cs
  10. 87
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs
  11. 16
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Util/RtfWriter.cs
  12. 2
      src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkNode.cs
  13. 10
      src/Main/Base/Project/Src/TextEditor/Gui/Dialogs/ExportProjectToHtmlDialog.cs
  14. 22
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextEditorProperties.cs

2
src/AddIns/Misc/HighlightingEditor/Project/Src/Nodes/SpanNode.cs

@ -281,7 +281,7 @@ namespace ICSharpCode.SharpDevelop.AddIns.HighlightingEditor.Nodes @@ -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;

22
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultTextEditorProperties.cs

@ -23,6 +23,16 @@ namespace ICSharpCode.TextEditor.Document @@ -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 @@ -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 @@ -293,6 +309,6 @@ namespace ICSharpCode.TextEditor.Document
set {
useCustomLine = value;
}
}
}
}
}

77
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/FontContainer.cs

@ -23,77 +23,88 @@ namespace ICSharpCode.TextEditor.Document @@ -23,77 +23,88 @@ namespace ICSharpCode.TextEditor.Document
/// </summary>
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;
/// <value>
/// The bold version of the base font
/// The scaled, bold version of the base font
/// </value>
public static Font BoldFont {
public Font RegularFont {
get {
return regularfont;
}
}
/// <value>
/// The scaled, bold version of the base font
/// </value>
public Font BoldFont {
get {
Debug.Assert(boldfont != null, "ICSharpCode.TextEditor.Document.FontContainer : boldfont == null");
return boldfont;
}
}
/// <value>
/// The italic version of the base font
/// The scaled, italic version of the base font
/// </value>
public static Font ItalicFont {
public Font ItalicFont {
get {
Debug.Assert(italicfont != null, "ICSharpCode.TextEditor.Document.FontContainer : italicfont == null");
return italicfont;
}
}
/// <value>
/// The bold/italic version of the base font
/// The scaled, bold/italic version of the base font
/// </value>
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;
}
}
/// <value>
/// The base font
/// </value>
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;
}
}
}

29
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/HighlightColor.cs

@ -18,7 +18,7 @@ using System.Xml; @@ -18,7 +18,7 @@ using System.Xml;
namespace ICSharpCode.TextEditor.Document
{
/// <summary>
/// A color used for highlighting
/// A color used for highlighting
/// </summary>
public class HighlightColor
{
@ -94,21 +94,20 @@ namespace ICSharpCode.TextEditor.Document @@ -94,21 +94,20 @@ namespace ICSharpCode.TextEditor.Document
/// <value>
/// The font used
/// </value>
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 @@ -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 @@ -275,10 +274,10 @@ namespace ICSharpCode.TextEditor.Document
/// </summary>
public override string ToString()
{
return "[HighlightColor: Bold = " + Bold +
", Italic = " + Italic +
", Color = " + Color +
", BackgroundColor = " + BackgroundColor + "]";
return "[HighlightColor: Bold = " + Bold +
", Italic = " + Italic +
", Color = " + Color +
", BackgroundColor = " + BackgroundColor + "]";
}
}
}

41
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/HighlightingStrategy/TextWord.cs

@ -43,10 +43,9 @@ namespace ICSharpCode.TextEditor.Document @@ -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 @@ -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 @@ -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 @@ -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 @@ -215,7 +230,7 @@ namespace ICSharpCode.TextEditor.Document
/// </summary>
public override string ToString()
{
return "[TextWord: Word = " + Word + ", Font = " + Font + ", Color = " + Color + "]";
return "[TextWord: Word = " + Word + ", Color = " + Color + "]";
}
}
}

4
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/ITextEditorProperties.cs

@ -148,6 +148,10 @@ namespace ICSharpCode.TextEditor.Document @@ -148,6 +148,10 @@ namespace ICSharpCode.TextEditor.Document
set;
}
FontContainer FontContainer {
get;
}
BracketMatchingStyle BracketMatchingStyle { // is wrapped in text editor control
get;
set;

2
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/DrawableLine.cs

@ -53,7 +53,7 @@ namespace ICSharpCode.TextEditor @@ -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 {

2
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/GutterMargin.cs

@ -84,7 +84,7 @@ namespace ICSharpCode.TextEditor @@ -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);

8
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextEditorControl.cs

@ -312,6 +312,7 @@ namespace ICSharpCode.TextEditor @@ -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 @@ -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 @@ -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 @@ -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;
}

87
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextView.cs

@ -33,14 +33,14 @@ namespace ICSharpCode.TextEditor @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -625,15 +627,15 @@ namespace ICSharpCode.TextEditor
}
}
Dictionary<WordFontPair, float> measureCache = new Dictionary<WordFontPair, float>();
Dictionary<WordFontPair, int> measureCache = new Dictionary<WordFontPair, int>();
// 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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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;
}

16
src/Libraries/ICSharpCode.TextEditor/Project/Src/Util/RtfWriter.cs

@ -51,7 +51,7 @@ namespace ICSharpCode.TextEditor.Util @@ -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 @@ -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) {

2
src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkNode.cs

@ -133,7 +133,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -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;

10
src/Main/Base/Project/Src/TextEditor/Gui/Dialogs/ExportProjectToHtmlDialog.cs

@ -248,16 +248,16 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -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("</span>" );
@ -271,8 +271,8 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -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;
}

22
src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextEditorProperties.cs

@ -17,20 +17,20 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -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 @@ -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;
}
}

Loading…
Cancel
Save