123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- using System;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Text.RegularExpressions;
- using Terminal.Gui;
- using Terminal.Gui.TextValidateProviders;
- namespace UICatalog.Scenarios;
- [ScenarioMetadata ("Text Input Controls", "Tests all text input controls")]
- [ScenarioCategory ("Controls")]
- [ScenarioCategory ("Mouse and Keyboard")]
- [ScenarioCategory ("Text and Formatting")]
- public class Text : Scenario
- {
- private Label _labelMirroringTimeField;
- private TimeField _timeField;
- public override void Setup ()
- {
- // TextField is a simple, single-line text input control
- var label = new Label { Text = "_TextField:" };
- Win.Add (label);
- var textField = new TextField
- {
- X = Pos.Right (label) + 1,
- Y = 0,
- Width = Dim.Percent (50) - 1,
- Text = "TextField with test text. Unicode shouldn't 𝔹Aℝ𝔽!"
- };
- var singleWordGenerator = new SingleWordSuggestionGenerator ();
- textField.Autocomplete.SuggestionGenerator = singleWordGenerator;
- textField.TextChanging += TextField_TextChanging;
- void TextField_TextChanging (object sender, StateEventArgs<string> e)
- {
- singleWordGenerator.AllSuggestions = Regex.Matches (e.NewValue, "\\w+")
- .Select (s => s.Value)
- .Distinct ()
- .ToList ();
- }
- Win.Add (textField);
- var labelMirroringTextField = new Label
- {
- X = Pos.Right (textField) + 1,
- Y = Pos.Top (textField),
- Width = Dim.Fill (1) - 1,
- Height = 1,
- Text = textField.Text
- };
- Win.Add (labelMirroringTextField);
- textField.TextChanged += (s, prev) => { labelMirroringTextField.Text = textField.Text; };
- // TextView is a rich (as in functionality, not formatting) text editing control
- label = new() { Text = "T_extView:", Y = Pos.Bottom (label) + 1 };
- Win.Add (label);
- var textView = new TextView
- {
- X = Pos.Right (label) + 1,
- Y = Pos.Top (label),
- Width = Dim.Percent (50) - 1,
- Height = Dim.Percent (20)
- };
- textView.Text = "TextView with some more test text. Unicode shouldn't 𝔹Aℝ𝔽!";
- textView.DrawContent += TextView_DrawContent;
- // This shows how to enable autocomplete in TextView.
- void TextView_DrawContent (object sender, DrawEventArgs e)
- {
- singleWordGenerator.AllSuggestions = Regex.Matches (textView.Text, "\\w+")
- .Select (s => s.Value)
- .Distinct ()
- .ToList ();
- }
- Win.Add (textView);
- var labelMirroringTextView = new Label
- {
- X = Pos.Right (textView) + 1,
- Y = Pos.Top (textView),
- Width = Dim.Fill (1) - 1,
- Height = Dim.Height (textView) - 1
- };
- Win.Add (labelMirroringTextView);
- // Use ContentChanged to detect if the user has typed something in a TextView.
- // The TextChanged property is only fired if the TextView.Text property is
- // explicitly set
- textView.ContentsChanged += (s, a) =>
- {
- labelMirroringTextView.Enabled = !labelMirroringTextView.Enabled;
- labelMirroringTextView.Text = textView.Text;
- };
- // By default TextView is a multi-line control. It can be forced to
- // single-line mode.
- var chxMultiline = new CheckBox
- {
- X = Pos.Left (textView), Y = Pos.Bottom (textView), Checked = textView.Multiline, Text = "_Multiline"
- };
- Win.Add (chxMultiline);
- var chxWordWrap = new CheckBox
- {
- X = Pos.Right (chxMultiline) + 2,
- Y = Pos.Top (chxMultiline),
- Checked = textView.WordWrap,
- Text = "_Word Wrap"
- };
- chxWordWrap.Toggled += (s, e) => textView.WordWrap = (bool)e.NewValue;
- Win.Add (chxWordWrap);
- // TextView captures Tabs (so users can enter /t into text) by default;
- // This means using Tab to navigate doesn't work by default. This shows
- // how to turn tab capture off.
- var chxCaptureTabs = new CheckBox
- {
- X = Pos.Right (chxWordWrap) + 2,
- Y = Pos.Top (chxWordWrap),
- Checked = textView.AllowsTab,
- Text = "_Capture Tabs"
- };
- chxMultiline.Toggled += (s, e) =>
- {
- textView.Multiline = (bool)e.NewValue;
- if (!textView.Multiline && (bool)chxWordWrap.Checked)
- {
- chxWordWrap.Checked = false;
- }
- if (!textView.Multiline && (bool)chxCaptureTabs.Checked)
- {
- chxCaptureTabs.Checked = false;
- }
- };
- Key keyTab = textView.KeyBindings.GetKeyFromCommands (Command.Tab);
- Key keyBackTab = textView.KeyBindings.GetKeyFromCommands (Command.BackTab);
- chxCaptureTabs.Toggled += (s, e) =>
- {
- if (e.NewValue == true)
- {
- textView.KeyBindings.Add (keyTab, Command.Tab);
- textView.KeyBindings.Add (keyBackTab, Command.BackTab);
- }
- else
- {
- textView.KeyBindings.Remove (keyTab);
- textView.KeyBindings.Remove (keyBackTab);
- }
- textView.AllowsTab = (bool)e.NewValue;
- };
- Win.Add (chxCaptureTabs);
- // Hex editor
- label = new() { Text = "_HexView:", Y = Pos.Bottom (chxMultiline) + 1 };
- Win.Add (label);
- var hexEditor =
- new HexView (
- new MemoryStream (Encoding.UTF8.GetBytes ("HexEditor Unicode that shouldn't 𝔹Aℝ𝔽!"))
- )
- {
- X = Pos.Right (label) + 1, Y = Pos.Bottom (chxMultiline) + 1, Width = Dim.Percent (50) - 1, Height = Dim.Percent (30)
- };
- Win.Add (hexEditor);
- var labelMirroringHexEditor = new Label
- {
- X = Pos.Right (hexEditor) + 1,
- Y = Pos.Top (hexEditor),
- Width = Dim.Fill (1) - 1,
- Height = Dim.Height (hexEditor) - 1
- };
- byte [] array = ((MemoryStream)hexEditor.Source).ToArray ();
- labelMirroringHexEditor.Text = Encoding.UTF8.GetString (array, 0, array.Length);
- hexEditor.Edited += (s, kv) =>
- {
- hexEditor.ApplyEdits ();
- byte [] array = ((MemoryStream)hexEditor.Source).ToArray ();
- labelMirroringHexEditor.Text = Encoding.UTF8.GetString (array, 0, array.Length);
- };
- Win.Add (labelMirroringHexEditor);
- // DateField
- label = new() { Text = "_DateField:", Y = Pos.Bottom (hexEditor) + 1 };
- Win.Add (label);
- var dateField = new DateField (DateTime.Now) { X = Pos.Right (label) + 1, Y = Pos.Bottom (hexEditor) + 1, Width = 20 };
- Win.Add (dateField);
- var labelMirroringDateField = new Label
- {
- X = Pos.Right (dateField) + 1,
- Y = Pos.Top (dateField),
- Width = Dim.Width (dateField),
- Height = Dim.Height (dateField),
- Text = dateField.Text
- };
- Win.Add (labelMirroringDateField);
- dateField.TextChanged += (s, prev) => { labelMirroringDateField.Text = dateField.Text; };
- // TimeField
- label = new() { Text = "T_imeField:", Y = Pos.Top (dateField), X = Pos.Right (labelMirroringDateField) + 5 };
- Win.Add (label);
- _timeField = new()
- {
- X = Pos.Right (label) + 1,
- Y = Pos.Top (dateField),
- Width = 20,
- IsShortFormat = false,
- Time = DateTime.Now.TimeOfDay
- };
- Win.Add (_timeField);
- _labelMirroringTimeField = new()
- {
- X = Pos.Right (_timeField) + 1,
- Y = Pos.Top (_timeField),
- Width = Dim.Width (_timeField),
- Height = Dim.Height (_timeField),
- Text = _timeField.Text
- };
- Win.Add (_labelMirroringTimeField);
- _timeField.TimeChanged += TimeChanged;
- // MaskedTextProvider - uses .NET MaskedTextProvider
- var netProviderLabel = new Label
- {
- X = Pos.Left (dateField),
- Y = Pos.Bottom (dateField) + 1,
- Text = "_NetMaskedTextProvider [ 999 000 LLL >LLL |AAA aaa ]:"
- };
- Win.Add (netProviderLabel);
- var netProvider = new NetMaskedTextProvider ("999 000 LLL >LLL |AAA aaa");
- var netProviderField = new TextValidateField
- {
- X = Pos.Right (netProviderLabel) + 1, Y = Pos.Y (netProviderLabel), Provider = netProvider
- };
- Win.Add (netProviderField);
- var labelMirroringNetProviderField = new Label
- {
- X = Pos.Right (netProviderField) + 1,
- Y = Pos.Top (netProviderField),
- Width = Dim.Width (netProviderField),
- Height = Dim.Height (netProviderField),
- Text = netProviderField.Text
- };
- Win.Add (labelMirroringNetProviderField);
- netProviderField.Provider.TextChanged += (s, prev) => { labelMirroringNetProviderField.Text = netProviderField.Text; };
- // TextRegexProvider - Regex provider implemented by Terminal.Gui
- var regexProvider = new Label
- {
- X = Pos.Left (netProviderLabel),
- Y = Pos.Bottom (netProviderLabel) + 1,
- Text = "Text_RegexProvider [ ^([0-9]?[0-9]?[0-9]|1000)$ ]:"
- };
- Win.Add (regexProvider);
- var provider2 = new TextRegexProvider ("^([0-9]?[0-9]?[0-9]|1000)$") { ValidateOnInput = false };
- var regexProviderField = new TextValidateField
- {
- X = Pos.Right (regexProvider) + 1,
- Y = Pos.Y (regexProvider),
- Width = 30,
- TextAlignment = Alignment.Center,
- Provider = provider2
- };
- Win.Add (regexProviderField);
- var labelMirroringRegexProviderField = new Label
- {
- X = Pos.Right (regexProviderField) + 1,
- Y = Pos.Top (regexProviderField),
- Width = Dim.Width (regexProviderField),
- Height = Dim.Height (regexProviderField),
- Text = regexProviderField.Text
- };
- Win.Add (labelMirroringRegexProviderField);
- regexProviderField.Provider.TextChanged += (s, prev) => { labelMirroringRegexProviderField.Text = regexProviderField.Text; };
- var labelAppendAutocomplete = new Label
- {
- Y = Pos.Y (regexProviderField) + 2, X = 1, Text = "_Append Autocomplete:"
- };
- var appendAutocompleteTextField = new TextField
- {
- X = Pos.Right (labelAppendAutocomplete) + 1, Y = Pos.Top (labelAppendAutocomplete), Width = Dim.Fill ()
- };
- appendAutocompleteTextField.Autocomplete = new AppendAutocomplete (appendAutocompleteTextField);
- appendAutocompleteTextField.Autocomplete.SuggestionGenerator = new SingleWordSuggestionGenerator
- {
- AllSuggestions = new()
- {
- "fish",
- "flipper",
- "fin",
- "fun",
- "the",
- "at",
- "there",
- "some",
- "my",
- "of",
- "be",
- "use",
- "her",
- "than",
- "and",
- "this",
- "an",
- "would",
- "first",
- "have",
- "each",
- "make",
- "water",
- "to",
- "from",
- "which",
- "like",
- "been",
- "in",
- "or",
- "she",
- "him",
- "call",
- "is",
- "one",
- "do",
- "into",
- "who",
- "you",
- "had",
- "how",
- "time",
- "oil",
- "that",
- "by",
- "their",
- "has",
- "its",
- "it",
- "word",
- "if",
- "look",
- "now",
- "he",
- "but",
- "will",
- "two",
- "find",
- "was",
- "not",
- "up",
- "more",
- "long",
- "for",
- "what",
- "other",
- "write",
- "down",
- "on",
- "all",
- "about",
- "go",
- "day",
- "are",
- "were",
- "out",
- "see",
- "did",
- "as",
- "we",
- "many",
- "number",
- "get",
- "with",
- "when",
- "then",
- "no",
- "come",
- "his",
- "your",
- "them",
- "way",
- "made",
- "they",
- "can",
- "these",
- "could",
- "may",
- "said",
- "so",
- "people",
- "part"
- }
- };
- Win.Add (labelAppendAutocomplete);
- Win.Add (appendAutocompleteTextField);
- }
- private void TimeChanged (object sender, DateTimeEventArgs<TimeSpan> e) { _labelMirroringTimeField.Text = _timeField.Text; }
- }
|