Blame mono/Diagram/TextUtils.cs

Ivan Mahonin 777717
/*
Ivan Mahonin 777717
    ......... 2015 Ivan Mahonin
Ivan Mahonin 777717
Ivan Mahonin 777717
    This program is free software: you can redistribute it and/or modify
Ivan Mahonin 777717
    it under the terms of the GNU General Public License as published by
Ivan Mahonin 777717
    the Free Software Foundation, either version 3 of the License, or
Ivan Mahonin 777717
    (at your option) any later version.
Ivan Mahonin 777717
Ivan Mahonin 777717
    This program is distributed in the hope that it will be useful,
Ivan Mahonin 777717
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Ivan Mahonin 777717
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Ivan Mahonin 777717
    GNU General Public License for more details.
Ivan Mahonin 777717
Ivan Mahonin 777717
    You should have received a copy of the GNU General Public License
Ivan Mahonin 777717
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
Ivan Mahonin 777717
*/
Ivan Mahonin 777717
Ivan Mahonin 777717
using System;
Ivan Mahonin 8cb222
using System.Collections.Generic;
Ivan Mahonin 8cb222
using System.Data.Linq;
Ivan Mahonin 8cb222
using System.Drawing;
Ivan Mahonin 8cb222
Ivan Mahonin 8cb222
namespace Diagram {
Ivan Mahonin 8cb222
    public class TextUtils {
Ivan Mahonin 8cb222
        static Bitmap tmpBitmap = new Bitmap(10, 10);
Ivan Mahonin 8cb222
        static Graphics tmpGraphics = Graphics.FromImage(tmpBitmap);
Ivan Mahonin 8cb222
Ivan Mahonin 8cb222
        public static string wrap(string text, double width, Font font) {
Ivan Mahonin 8cb222
            string wrapped = "";
Ivan Mahonin 8cb222
            string line = "";
Ivan Mahonin 8cb222
            int wordStart = 0;
Ivan Mahonin 8cb222
            for(int i = 0; i <= text.Length; ++i) {
Ivan Mahonin 8cb222
                char c = i < text.Length ? text[i] : ' ';
Ivan Mahonin 8cb222
                if (char.IsWhiteSpace(c)) {
Ivan Mahonin 8cb222
                    bool newLine = c == '\n';
Ivan Mahonin 8cb222
                    string word = text.Substring(wordStart, i - wordStart);
Ivan Mahonin 8cb222
                    if (word != "") {
Ivan Mahonin 8cb222
                        if (line == "") {
Ivan Mahonin 8cb222
                            line = word;
Ivan Mahonin 8cb222
                            word = "";
Ivan Mahonin 8cb222
                        } else
Ivan Mahonin 8cb222
                        if (tmpGraphics.MeasureString(line, font).Width <= width) {
Ivan Mahonin 8cb222
                            line += " " + word;
Ivan Mahonin 8cb222
                            word = "";
Ivan Mahonin 8cb222
                        } else {
Ivan Mahonin 8cb222
                            newLine = true;
Ivan Mahonin 8cb222
                        }
Ivan Mahonin 8cb222
                    }
Ivan Mahonin 8cb222
                    if (newLine) {
Ivan Mahonin 8cb222
                        if (wrapped != "") wrapped += "\r\n";
Ivan Mahonin 8cb222
                        wrapped += line;
Ivan Mahonin 8cb222
                        line = word;
Ivan Mahonin 8cb222
                    }
Ivan Mahonin 8cb222
                    wordStart = i + 1;
Ivan Mahonin 8cb222
                }
Ivan Mahonin 8cb222
            }
Ivan Mahonin 8cb222
Ivan Mahonin 8cb222
            if (line != "") {
Ivan Mahonin 8cb222
                if (wrapped != "") wrapped += "\r\n";
Ivan Mahonin 8cb222
                wrapped += line;
Ivan Mahonin 8cb222
            }
Ivan Mahonin 8cb222
            return wrapped;
Ivan Mahonin 8cb222
        }
Ivan Mahonin 8cb222
Ivan Mahonin 8cb222
        public static SizeF measure(string text, Font font) {
Ivan Mahonin 8cb222
            return tmpGraphics.MeasureString(text, font);
Ivan Mahonin 8cb222
        }
Ivan Mahonin 8cb222
    }
Ivan Mahonin 8cb222
}
Ivan Mahonin 8cb222