source: 2013/30/MiskaK/MW2(My Warfare 2)/Paranneltu Jypeli/Widgets/InputBox.cs @ 4507

Revision 4507, 8.8 KB checked in by anlakane, 6 years ago (diff)

Talletus.

Line 
1#region MIT License
2/*
3 * Copyright (c) 2009-2011 University of Jyväskylä, Department of Mathematical
4 * Information Technology.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24#endregion
25
26/*
27 * Authors: Tomi Karppinen, Tero Jäntti
28 */
29
30
31using System;
32using System.Collections.Generic;
33using System.Linq;
34using System.Text;
35using Microsoft.Xna.Framework.Graphics;
36using Microsoft.Xna.Framework;
37using Microsoft.Xna.Framework.GamerServices;
38using Jypeli.Controls;
39using Jypeli.GameObjects;
40using Jypeli.WP7;
41
42namespace Jypeli.Widgets
43{
44    /// <summary>
45    /// Laatikko, johon käyttäjä voi syöttää tekstiä.
46    /// </summary>
47    public class InputBox : Label
48    {
49#if WINDOWS
50        private static int InputBoxes = 0;
51        const long eraseDelay = 1000000;
52
53        long remainingDelay = 0;
54#endif
55
56        Timer cursorBlinkTimer;
57        Color cursorColor = new Color( 255, 0, 0, 100 );
58
59        /// <summary>
60        /// Tekstilaatikon pituus kirjaimissa.
61        /// </summary>
62        public int WidthInCharacters { get; set; }
63
64        /// <summary>
65        /// Suurin määrä merkkejä joita tekstilaatikkoon voi kirjoittaa.
66        /// </summary>
67        public int MaxCharacters { get; set; }
68
69        /// <summary>
70        /// Kursori.
71        /// </summary>
72        public Widget Cursor { get; set; }
73
74        public override Vector PreferredSize
75        {
76            get
77            {
78                return new Vector( Font.CharacterWidth * WidthInCharacters + 2 * XMargin, Font.CharacterHeight + 2 * YMargin );
79            }
80        }
81
82        public override Vector Size
83        {
84            get { return base.Size; }
85            set
86            {
87                base.Size = value;
88                if ( Cursor != null )
89                    UpdateCursorPosition();
90            }
91        }
92
93        public override string Text
94        {
95            get { return base.Text; }
96            set
97            {
98                if ( value.Length <= MaxCharacters )
99                {
100                    base.Text = value;
101
102                }
103                else
104                {
105                    base.Text = value.Substring( 0, MaxCharacters );
106                }
107                UpdateCursorPosition();
108            }
109        }
110
111        /// <summary>
112        /// Tapahtuma tekstin muuttumiselle.
113        /// </summary>
114        public event Action<string> TextChanged;
115
116        protected void OnTextChanged()
117        {
118            if ( TextChanged != null )
119                TextChanged( Text );
120        }
121
122        /// <summary>
123        /// Alustaa uuden syöttökentän.
124        /// </summary>
125        /// <param name="characters">
126        /// Kentän leveys merkkeinä. Tämä ei rajoita kirjoitettavan tekstin pituutta.
127        /// <see cref="MaxCharacters"/>
128        /// </param>
129        public InputBox( int characters )
130            : base()
131        {
132            MaxCharacters = int.MaxValue;
133            WidthInCharacters = characters;
134            HorizontalAlignment = HorizontalAlignment.Left;
135            HorizontalSizing = Sizing.Expanding;
136            XMargin = 7;
137            YMargin = 2;
138            TextColor = Color.Black;
139            Color = new Color( 0, 255, 255, 150 );
140            BorderColor = new Color( 200, 200, 200 );
141            SizeMode = TextSizeMode.None;
142            Size = PreferredSize;
143
144            Cursor = new Widget( Font.CharacterWidth, Font.CharacterHeight );
145            Cursor.Color = cursorColor;
146            Add( Cursor );
147            AddedToGame += UpdateCursorPosition;
148
149            cursorBlinkTimer = new Timer();
150            cursorBlinkTimer.Interval = 0.5;
151            cursorBlinkTimer.Timeout += blinkCursor;
152
153            AddedToGame += onAdded;
154            Removed += onRemoved;
155           
156#if WINDOWS_PHONE
157            AddedToGame += AddTouchListener;
158#endif
159        }
160
161        private void onAdded()
162        {
163            cursorBlinkTimer.Start();
164#if WINDOWS
165            InputBoxes++;
166            Keyboard.Buffer.Enabled = true;
167            Keyboard.Buffer.BackspaceEnabled = true;
168            Keyboard.Buffer.Clear();
169            Keyboard.Buffer.TextChanged += updateText;
170#endif
171        }
172
173        private void onRemoved()
174        {
175            cursorBlinkTimer.Stop();
176#if WINDOWS
177            InputBoxes--;
178            Keyboard.Buffer.Enabled = InputBoxes > 0;
179            Keyboard.Buffer.TextChanged -= updateText;
180#endif
181        }
182
183        private void blinkCursor()
184        {
185            Cursor.Color = ( Cursor.Color != cursorColor ) ? cursorColor : Color.Transparent;
186        }
187
188        void UpdateCursorPosition()
189        {
190            Cursor.Left = Math.Min( -Width / 2 + XMargin + TextSize.X, Width / 2 - Font.CharacterWidth );
191        }
192
193#if WINDOWS
194        private void updateText()
195        {
196            if ( !ControlContext.Active ) return;
197            if ( Keyboard.Buffer.TextLength == 0 || Keyboard.Buffer.Text.Length == 0 ) return;
198
199            bool changed = false;
200
201            if ( Keyboard.Buffer.Text[0] == '\b' )
202            {
203                // Erase
204                if ( remainingDelay <= 0 )
205                {
206                    if ( Text.Length > 0 )
207                    {
208                        Text = Text.Remove( Text.Length - 1 );
209                        changed = true;
210                    }
211                    remainingDelay = InputBox.eraseDelay;
212                }
213            }
214            else if ( Text.Length < MaxCharacters )
215            {
216                // Type
217                Text += Keyboard.Buffer.Text;
218                changed = true;
219            }
220
221            Keyboard.Buffer.Clear();
222
223            UpdateCursorPosition();
224
225            if ( changed )
226                OnTextChanged();
227        }
228#endif
229
230#if WINDOWS_PHONE
231        void AddTouchListener()
232        {
233            Game.Instance.TouchPanel.ListenOn(this, ButtonState.Pressed, ShowTouchKeyboard, null).InContext( this );
234        }
235
236        void ShowTouchKeyboard( Touch touch )
237        {
238            if ( !Guide.IsVisible )
239                Guide.BeginShowKeyboardInput( PlayerIndex.One, "", "", "", TouchTextEntered, this );
240        }
241
242        void TouchTextEntered( IAsyncResult result )
243        {
244            string typedText = Guide.EndShowKeyboardInput( result );
245            if ( typedText != null )
246            {
247                Text = ( typedText.Length <= MaxCharacters ) ? typedText : typedText.Substring( 0, MaxCharacters );
248                UpdateCursorPosition();
249                OnTextChanged();
250            }
251        }
252#endif
253
254        /// <summary>
255        /// Alustaa uuden syöttökentän.
256        /// </summary>
257        public InputBox()
258            : this( 15 )
259        {
260        }
261
262        public override void Update( Time time )
263        {
264#if WINDOWS
265            if ( remainingDelay > 0 )
266            {
267                remainingDelay -= time.SinceLastUpdate.Ticks;
268            }
269#endif
270
271            base.Update( time );
272        }
273
274        protected override void Draw( Matrix parentTransformation, Matrix transformation )
275        {
276            if ( ! IsTruncated )
277                base.Draw( parentTransformation, transformation, Text );
278            else
279            {
280                String shownText = "";
281
282                for ( int i = Text.Length - 1; i >= 0; i-- )
283                {
284                    String newText = Text[i] + shownText.ToString();
285
286                    if ( Font.XnaFont.MeasureString( newText ).X >= Width )
287                        break;
288
289                    shownText = newText;
290                }
291
292                base.Draw( parentTransformation, transformation, shownText );
293            }
294        }
295    }
296}
Note: See TracBrowser for help on using the repository browser.