aboutsummaryrefslogtreecommitdiff
path: root/V3/Widgets/AbstractTextWidget.cs
blob: 1f2874212d1d261af43b6757dafa0466af07bf75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Ninject;

namespace V3.Widgets
{
    public abstract class AbstractTextWidget : ITextWidget, IInitializable
    {
        private string mText;

        public Vector2 Position { get; set; }

        public Vector2 Size { get; set; }

        public string Text
        {
            get { return mText; }
            set { mText = ReplaceUmlauteWhenOnUnix(value); }
        }

        public float PaddingX { get; set; } = 80;

        public float PaddingY { get; set; } = 5;

        public Color Color { get; set; } = Color.Black;

        public HorizontalOrientation HorizontalOrientation { get; set; } = HorizontalOrientation.Center;

        public SpriteFont Font { get; set; }

        private readonly ContentManager mContentManager;

        public AbstractTextWidget(ContentManager contentManager)
        {
            mContentManager = contentManager;
            Text = "";
        }

        public virtual void Initialize()
        {
            Font = mContentManager.Load<SpriteFont>("Fonts/MenuFont");
        }

        public virtual void Draw(SpriteBatch spriteBatch)
        {
            var calculatedSize = Font.MeasureString(Text);
            var position = Position;
            switch (HorizontalOrientation)
            {
                case HorizontalOrientation.Left:
                    position.X += PaddingX;
                    break;
                case HorizontalOrientation.Center:
                    position.X += (Size - calculatedSize).X / 2;
                    break;
                case HorizontalOrientation.Right:
                    position.X += (Size - calculatedSize).X;
                    position.X -= PaddingX;
                    break;
            }
            position.Y += (Size - calculatedSize).Y / 2;
            spriteBatch.DrawString(Font, Text, position, GetColor());
        }

        public virtual Vector2 GetMinimumSize()
        {
            var size = Font.MeasureString(Text);
            size.X += 2 * PaddingX;
            size.Y += 2 * PaddingY;
            return size;
        }

        public bool CheckSelected(Point position)
        {
            var rectangle = new Rectangle((int) Position.X, (int) Position.Y, (int) Size.X, (int) Size.Y);
            return rectangle.Contains(position);
        }

        protected virtual Color GetColor()
        {
            return Color;
        }

        /// <summary>
        /// Test if execution platform is UNIX and replace german Umlaute
        /// accordingly because a strange ArgumentException is thrown otherwise. 
        /// </summary>
        /// <param name="originalString">The original input string.</param>
        /// <returns></returns>
        private string ReplaceUmlauteWhenOnUnix(string originalString)
        {
            // Taken from <http://mono.wikia.com/wiki/Detecting_the_execution_platform>.
            int p = (int) Environment.OSVersion.Platform;
            if ((p == 4) || (p == 6) || (p == 128))  // Running on Unix
            {
                var sb = new StringBuilder();
                foreach (char c in originalString)
                {
                    if (c < 128)
                    {
                        sb.Append(c);
                    }
                }
                return sb.ToString();
            }
            // NOT running on Unix.
            return originalString;
        }
    }
}