Files
Terminal.Gui/UICatalog/Scenarios/Text.cs
BDisp ea24de3a27 Fixes #2482. Refactor Redraw - Non-virtual with the right set of virtual OnXXX methods. (#2577)
* Fixes #2482. Refactor Redraw - Non-virtual with the right set of virtual OnXXX methods.

* Change documentation comments.

* Fixes #2575 - TableView to use interface instead of System.Data.DataTable (#2576)

* WIP: Add ITableDataSource

* WIP: Refactor TableView

* WIP: Port CSVEditor

* WIP: Port TableEditor

* WIP: Port MultiColouredTable scenario

* Fix bug of adding duplicate column styles

* Update tests to use DataTableSource

* Tidy up

* Add EnumerableTableDataSource<T>

* Add test for EnumerableTableDataSource

* Add test for EnumerableTableDataSource

* Add code example to xmldoc

* Add ProcessTable scenario

* Rename ITableDataSource to ITableSource and update docs

* Rename EnumerableTableDataSource to EnumerableTableSource

* Fixed Frame != Bounds; changed UICat Scenarios list to use tableview!

* Fix scroll resetting in ProcessTable scenario

* Fix unit tests by setting Frame to same as Bounds

* Document why we have to measure our data for use with TableView

---------

Co-authored-by: Tig Kindel <tig@users.noreply.github.com>

* Fixes #2582 - Refactors FileDialog for cleaner data model (#2583)

* WIP: Add ITableDataSource

* WIP: Refactor TableView

* WIP: Port CSVEditor

* WIP: Port TableEditor

* WIP: Port MultiColouredTable scenario

* Fix bug of adding duplicate column styles

* Update tests to use DataTableSource

* Tidy up

* Add EnumerableTableDataSource<T>

* Add test for EnumerableTableDataSource

* Add test for EnumerableTableDataSource

* Add code example to xmldoc

* Add ProcessTable scenario

* Rename ITableDataSource to ITableSource and update docs

* Rename EnumerableTableDataSource to EnumerableTableSource

* Fixed Frame != Bounds; changed UICat Scenarios list to use tableview!

* Fix scroll resetting in ProcessTable scenario

* Fix unit tests by setting Frame to same as Bounds

* Document why we have to measure our data for use with TableView

* WIP: Simplify FileDialogs use of TableView

* WIP start migrating sorter

* WIP new filedialog table source mostly working

* WIP remove sorter class

* Refactor GetOrderByValue to be adjacent to GetColumnValue

* Fix collection navigator back so it ignores icon

* Fix unit tests

* Tidy up

* Fix UseColors

* Add test for UseColors

---------

Co-authored-by: Tig Kindel <tig@users.noreply.github.com>

* Fixes #2196. TextView: Setting Text places cursor at beginning, unlike TextField (#2572)

* Fixes #2196. TextView: Setting Text places cursor at beginning, unlike TextField

* Change all private members to have the _prefix.

* Renamed local member to prevLayoutStyle.

* Helper function for SetNeedsDisplay.

* Fixes #2569. Borders scenarios needed to be refactored. (#2570)

* Fixes #2569. Borders scenarios needed to be refactored.

* Fix border title with width equal to 4 and thickness top grater than 1.

* Improves border manipulation on borders scenarios.

* Prevents null value on the margin, border and padding thickness on the border scenarios.

* Remove NStack using dependence and fix prior commit.

* Refactoring the Frames scenario.

* Deleted borders scenarios.

* I did not realize that it was changed to SetSubViewNeedsDisplay.

* Re-layout; fixed colorpicker; fixed radio group

* Remove Thickness.IsEmpty as requested.

* Change the Frames scenario as requested.

---------

Co-authored-by: Tig Kindel <tig@users.noreply.github.com>

* Builds CollectionNavigator support into UI Catalog for TableView (#2584)

* Builds collectionnav support into UI cat for TableView

* Fixes keyboard mapping

* MultiSelect = false for TableView

* MultiSelect = false doesn't unbind ctrl-a

* Fixes #2581 Refactor CollectionNavigator so it supports TableView (#2586)

* Refactor CollectionNavigator to a base and a collection implementation

* Refactor CollectionNavigatorBase to look for first match smartly

* Add TableCollectionNavigator

* Make TableCollectionNavigator a core part of TableView

* Fix bad merge

* Added tests for tableview collection navigator

* Add FileDialogCollectionNavigator which ignores . and directory separator prefixes on file names

* whitespace fixes

---------

Co-authored-by: Tig <tig@users.noreply.github.com>

* Resolving merge conflicts.

* Fix merge errors.

* Fix merge errors.

* Add Command.Accept and snap to the selected glyph when ShowHorizontalScrollIndicator change to true.

* Reformat.

* Reformat again.

---------

Co-authored-by: Thomas Nind <31306100+tznind@users.noreply.github.com>
Co-authored-by: Tig Kindel <tig@users.noreply.github.com>
2023-05-04 13:17:59 +02:00

259 lines
8.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using NStack;
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 (Name: "Text Input Controls", Description: "Tests all text input controls")]
[ScenarioCategory ("Controls")]
[ScenarioCategory ("Mouse and Keyboard")]
[ScenarioCategory ("Text and Formatting")]
public class Text : Scenario {
public override void Setup ()
{
// TextField is a simple, single-line text input control
var textField = new TextField ("TextField with test text. Unicode shouldn't 𝔹A𝔽!") {
X = 1,
Y = 0,
Width = Dim.Percent (50) - 1,
Height = 2
};
var singleWordGenerator = new SingleWordSuggestionGenerator ();
textField.Autocomplete.SuggestionGenerator = singleWordGenerator;
textField.TextChanging += TextField_TextChanging;
void TextField_TextChanging (object sender, TextChangingEventArgs e)
{
singleWordGenerator.AllSuggestions = Regex.Matches (e.NewText.ToString (), "\\w+")
.Select (s => s.Value)
.Distinct ().ToList ();
}
Win.Add (textField);
var labelMirroringTextField = new Label (textField.Text) {
X = Pos.Right (textField) + 1,
Y = Pos.Top (textField),
Width = Dim.Fill (1) - 1
};
Win.Add (labelMirroringTextField);
textField.TextChanged += (s, prev) => {
labelMirroringTextField.Text = textField.Text;
};
// TextView is a rich (as in functionality, not formatting) text editing control
var textView = new TextView () {
X = 1,
Y = Pos.Bottom (textField),
Width = Dim.Percent (50) - 1,
Height = Dim.Percent (30),
};
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.ToString (), "\\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 ("Multiline") {
X = Pos.Left (textView),
Y = Pos.Bottom (textView),
Checked = textView.Multiline
};
Win.Add (chxMultiline);
var chxWordWrap = new CheckBox ("Word Wrap") {
X = Pos.Right (chxMultiline) + 2,
Y = Pos.Top (chxMultiline),
Checked = textView.WordWrap
};
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 ("Capture Tabs") {
X = Pos.Right (chxWordWrap) + 2,
Y = Pos.Top (chxWordWrap),
Checked = textView.AllowsTab
};
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.GetKeyFromCommand (Command.Tab);
Key keyBackTab = textView.GetKeyFromCommand (Command.BackTab);
chxCaptureTabs.Toggled += (s, e) => {
if (e.NewValue == true) {
textView.AddKeyBinding (keyTab, Command.Tab);
textView.AddKeyBinding (keyBackTab, Command.BackTab);
} else {
textView.ClearKeyBinding (keyTab);
textView.ClearKeyBinding (keyBackTab);
}
textView.AllowsTab = (bool)e.NewValue;
};
Win.Add (chxCaptureTabs);
var hexEditor = new HexView (new MemoryStream (Encoding.UTF8.GetBytes ("HexEditor Unicode that shouldn't 𝔹A𝔽!"))) {
X = 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,
};
var array = ((MemoryStream)hexEditor.Source).ToArray ();
labelMirroringHexEditor.Text = Encoding.UTF8.GetString (array, 0, array.Length);
hexEditor.Edited += (s, kv) => {
hexEditor.ApplyEdits ();
var array = ((MemoryStream)hexEditor.Source).ToArray ();
labelMirroringHexEditor.Text = Encoding.UTF8.GetString (array, 0, array.Length);
};
Win.Add (labelMirroringHexEditor);
var dateField = new DateField (System.DateTime.Now) {
X = 1,
Y = Pos.Bottom (hexEditor) + 1,
Width = 20,
IsShortFormat = false
};
Win.Add (dateField);
var labelMirroringDateField = new Label (dateField.Text) {
X = Pos.Right (dateField) + 1,
Y = Pos.Top (dateField),
Width = Dim.Width (dateField),
Height = Dim.Height (dateField),
};
Win.Add (labelMirroringDateField);
dateField.TextChanged += (s, prev) => {
labelMirroringDateField.Text = dateField.Text;
};
_timeField = new TimeField (DateTime.Now.TimeOfDay) {
X = Pos.Right (labelMirroringDateField) + 5,
Y = Pos.Bottom (hexEditor) + 1,
Width = 20,
IsShortFormat = false
};
Win.Add (_timeField);
_labelMirroringTimeField = new Label (_timeField.Text) {
X = Pos.Right (_timeField) + 1,
Y = Pos.Top (_timeField),
Width = Dim.Width (_timeField),
Height = Dim.Height (_timeField),
};
Win.Add (_labelMirroringTimeField);
_timeField.TimeChanged += TimeChanged;
// MaskedTextProvider - uses .NET MaskedTextProvider
var netProviderLabel = new Label ("NetMaskedTextProvider [ 999 000 LLL >LLL| AAA aaa ]") {
X = Pos.Left (dateField),
Y = Pos.Bottom (dateField) + 1
};
Win.Add (netProviderLabel);
var netProvider = new NetMaskedTextProvider ("999 000 LLL > LLL | AAA aaa");
var netProviderField = new TextValidateField (netProvider) {
X = Pos.Right (netProviderLabel) + 1,
Y = Pos.Y (netProviderLabel),
};
Win.Add (netProviderField);
// TextRegexProvider - Regex provider implemented by Terminal.Gui
var regexProvider = new Label ("TextRegexProvider [ ^([0-9]?[0-9]?[0-9]|1000)$ ]") {
X = Pos.Left (netProviderLabel),
Y = Pos.Bottom (netProviderLabel) + 1
};
Win.Add (regexProvider);
var provider2 = new TextRegexProvider ("^([0-9]?[0-9]?[0-9]|1000)$") { ValidateOnInput = false };
var regexProviderField = new TextValidateField (provider2) {
X = Pos.Right (regexProvider) + 1,
Y = Pos.Y (regexProvider),
Width = 30,
TextAlignment = TextAlignment.Centered
};
Win.Add (regexProviderField);
var labelAppendAutocomplete = new Label ("Append Autocomplete:") {
Y = Pos.Y (regexProviderField) + 2,
X = 1
};
var appendAutocompleteTextField = new TextField () {
X = Pos.Right (labelAppendAutocomplete),
Y = labelAppendAutocomplete.Y,
Width = Dim.Fill ()
};
appendAutocompleteTextField.Autocomplete = new AppendAutocomplete (appendAutocompleteTextField);
appendAutocompleteTextField.Autocomplete.SuggestionGenerator = new SingleWordSuggestionGenerator {
AllSuggestions = new System.Collections.Generic.List<string>{
"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);
}
TimeField _timeField;
Label _labelMirroringTimeField;
private void TimeChanged (object sender, DateTimeEventArgs<TimeSpan> e)
{
_labelMirroringTimeField.Text = _timeField.Text;
}
}
}