123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Data;
- using Terminal.Gui;
- using static Terminal.Gui.TableView;
- namespace UICatalog.Scenarios {
- [ScenarioMetadata (Name: "ListColumns", Description: "Implements a columned list via a data table.")]
- [ScenarioCategory ("TableView")]
- [ScenarioCategory ("Controls")]
- [ScenarioCategory ("Dialogs")]
- [ScenarioCategory ("Text and Formatting")]
- [ScenarioCategory ("Top Level Windows")]
- public class ListColumns : Scenario {
- TableView listColView;
- DataTable currentTable;
- private MenuItem _miCellLines;
- private MenuItem _miExpandLastColumn;
- private MenuItem _miAlwaysUseNormalColorForVerticalCellLines;
- private MenuItem _miSmoothScrolling;
- private MenuItem _miAlternatingColors;
- private MenuItem _miCursor;
- private MenuItem _miTopline;
- private MenuItem _miBottomline;
- private MenuItem _miOrientVertical;
- private MenuItem _miScrollParallel;
- ColorScheme alternatingColorScheme;
- public override void Setup ()
- {
- Win.Title = this.GetName ();
- Win.Y = 1; // menu
- Win.Height = Dim.Fill (1); // status bar
- Application.Top.LayoutSubviews ();
- this.listColView = new TableView () {
- X = 0,
- Y = 0,
- Width = Dim.Fill (),
- Height = Dim.Fill (1),
- Style = new TableStyle {
- ShowHeaders = false,
- ShowHorizontalHeaderOverline = false,
- ShowHorizontalHeaderUnderline = false,
- ShowHorizontalBottomline = false,
- ExpandLastColumn = false,
- }
- };
- var listColStyle = new ListColumnStyle ();
- var menu = new MenuBar (new MenuBarItem [] {
- new MenuBarItem ("_File", new MenuItem [] {
- new MenuItem ("Open_BigListExample", "", () => OpenSimpleList (true)),
- new MenuItem ("Open_SmListExample", "", () => OpenSimpleList (false)),
- new MenuItem ("_CloseExample", "", () => CloseExample ()),
- new MenuItem ("_Quit", "", () => Quit()),
- }),
- new MenuBarItem ("_View", new MenuItem [] {
- _miTopline = new MenuItem ("_TopLine", "", () => ToggleTopline ()) { Checked = listColView.Style.ShowHorizontalHeaderOverline, CheckType = MenuItemCheckStyle.Checked },
- _miBottomline = new MenuItem ("_BottomLine", "", () => ToggleBottomline ()) { Checked = listColView.Style.ShowHorizontalBottomline, CheckType = MenuItemCheckStyle.Checked },
- _miCellLines = new MenuItem ("_CellLines", "", () => ToggleCellLines ()) { Checked = listColView.Style.ShowVerticalCellLines, CheckType = MenuItemCheckStyle.Checked },
- _miExpandLastColumn = new MenuItem ("_ExpandLastColumn", "", () => ToggleExpandLastColumn ()) { Checked = listColView.Style.ExpandLastColumn, CheckType = MenuItemCheckStyle.Checked },
- _miAlwaysUseNormalColorForVerticalCellLines = new MenuItem ("_AlwaysUseNormalColorForVerticalCellLines", "", () => ToggleAlwaysUseNormalColorForVerticalCellLines ()) { Checked = listColView.Style.AlwaysUseNormalColorForVerticalCellLines, CheckType = MenuItemCheckStyle.Checked },
- _miSmoothScrolling = new MenuItem ("_SmoothHorizontalScrolling", "", () => ToggleSmoothScrolling ()) { Checked = listColView.Style.SmoothHorizontalScrolling, CheckType = MenuItemCheckStyle.Checked },
- _miAlternatingColors = new MenuItem ("Alternating Colors", "", () => ToggleAlternatingColors ()) { CheckType = MenuItemCheckStyle.Checked},
- _miCursor = new MenuItem ("Invert Selected Cell First Character", "", () => ToggleInvertSelectedCellFirstCharacter ()) { Checked = listColView.Style.InvertSelectedCellFirstCharacter,CheckType = MenuItemCheckStyle.Checked},
- }),
- new MenuBarItem ("_List", new MenuItem [] {
- //new MenuItem ("_Hide Headers", "", HideHeaders),
- _miOrientVertical = new MenuItem ("_OrientVertical", "", () => ToggleVerticalOrientation ()) { Checked = listColStyle.Orientation == Orientation.Vertical, CheckType = MenuItemCheckStyle.Checked },
- _miScrollParallel = new MenuItem ("_ScrollParallel", "", () => ToggleScrollParallel ()) { Checked = listColStyle.ScrollParallel, CheckType = MenuItemCheckStyle.Checked },
- new MenuItem ("Set _Max Cell Width", "", SetListMaxWidth),
- new MenuItem ("Set Mi_n Cell Width", "", SetListMinWidth),
- }),
- });
- Application.Top.Add (menu);
- var statusBar = new StatusBar (new StatusItem [] {
- new StatusItem(Key.F2, "~F2~ OpenBigListEx", () => OpenSimpleList (true)),
- new StatusItem(Key.F3, "~F3~ CloseExample", () => CloseExample ()),
- new StatusItem(Key.F4, "~F4~ OpenSmListEx", () => OpenSimpleList (false)),
- new StatusItem(Application.QuitKey, $"{Application.QuitKey} to Quit", () => Quit()),
- });
- Application.Top.Add (statusBar);
- Win.Add (listColView);
- var selectedCellLabel = new Label () {
- X = 0,
- Y = Pos.Bottom (listColView),
- Text = "0,0",
- Width = Dim.Fill (),
- TextAlignment = TextAlignment.Right
- };
- Win.Add (selectedCellLabel);
- listColView.SelectedCellChanged += (s, e) => { selectedCellLabel.Text = $"{listColView.SelectedRow},{listColView.SelectedColumn}"; };
- listColView.KeyPress += TableViewKeyPress;
- SetupScrollBar ();
- alternatingColorScheme = new ColorScheme () {
- Disabled = Win.ColorScheme.Disabled,
- HotFocus = Win.ColorScheme.HotFocus,
- Focus = Win.ColorScheme.Focus,
- Normal = new Attribute (Color.White, Color.BrightBlue)
- };
- // if user clicks the mouse in TableView
- listColView.MouseClick += (s, e) => {
- listColView.ScreenToCell (e.MouseEvent.X, e.MouseEvent.Y, out int? clickedCol);
- };
- listColView.AddKeyBinding (Key.Space, Command.ToggleChecked);
- }
- private void SetupScrollBar ()
- {
- var scrollBar = new ScrollBarView (listColView, true); // (listColView, true, true);
- scrollBar.ChangedPosition += (s, e) => {
- listColView.RowOffset = scrollBar.Position;
- if (listColView.RowOffset != scrollBar.Position) {
- scrollBar.Position = listColView.RowOffset;
- }
- listColView.SetNeedsDisplay ();
- };
- /*
- scrollBar.OtherScrollBarView.ChangedPosition += (s,e) => {
- listColView.ColumnOffset = scrollBar.OtherScrollBarView.Position;
- if (listColView.ColumnOffset != scrollBar.OtherScrollBarView.Position) {
- scrollBar.OtherScrollBarView.Position = listColView.ColumnOffset;
- }
- listColView.SetNeedsDisplay ();
- };
- */
- listColView.DrawContent += (s, e) => {
- scrollBar.Size = listColView.Table?.Rows ?? 0;
- scrollBar.Position = listColView.RowOffset;
- //scrollBar.OtherScrollBarView.Size = listColView.Table?.Columns - 1 ?? 0;
- //scrollBar.OtherScrollBarView.Position = listColView.ColumnOffset;
- scrollBar.Refresh ();
- };
- }
- private void TableViewKeyPress (object sender, KeyEventEventArgs e)
- {
- if (e.KeyEvent.Key == Key.DeleteChar) {
- // set all selected cells to null
- foreach (var pt in listColView.GetAllSelectedCells ()) {
- currentTable.Rows [pt.Y] [pt.X] = DBNull.Value;
- }
- listColView.Update ();
- e.Handled = true;
- }
- }
- private void ToggleTopline ()
- {
- _miTopline.Checked = !_miTopline.Checked;
- listColView.Style.ShowHorizontalHeaderOverline = (bool)_miTopline.Checked;
- listColView.Update ();
- }
- private void ToggleBottomline ()
- {
- _miBottomline.Checked = !_miBottomline.Checked;
- listColView.Style.ShowHorizontalBottomline = (bool)_miBottomline.Checked;
- listColView.Update ();
- }
- private void ToggleExpandLastColumn ()
- {
- _miExpandLastColumn.Checked = !_miExpandLastColumn.Checked;
- listColView.Style.ExpandLastColumn = (bool)_miExpandLastColumn.Checked;
- listColView.Update ();
- }
- private void ToggleAlwaysUseNormalColorForVerticalCellLines ()
- {
- _miAlwaysUseNormalColorForVerticalCellLines.Checked = !_miAlwaysUseNormalColorForVerticalCellLines.Checked;
- listColView.Style.AlwaysUseNormalColorForVerticalCellLines = (bool)_miAlwaysUseNormalColorForVerticalCellLines.Checked;
- listColView.Update ();
- }
- private void ToggleSmoothScrolling ()
- {
- _miSmoothScrolling.Checked = !_miSmoothScrolling.Checked;
- listColView.Style.SmoothHorizontalScrolling = (bool)_miSmoothScrolling.Checked;
- listColView.Update ();
- }
- private void ToggleCellLines ()
- {
- _miCellLines.Checked = !_miCellLines.Checked;
- listColView.Style.ShowVerticalCellLines = (bool)_miCellLines.Checked;
- listColView.Update ();
- }
- private void ToggleAlternatingColors ()
- {
- //toggle menu item
- _miAlternatingColors.Checked = !_miAlternatingColors.Checked;
- if (_miAlternatingColors.Checked == true) {
- listColView.Style.RowColorGetter = (a) => { return a.RowIndex % 2 == 0 ? alternatingColorScheme : null; };
- } else {
- listColView.Style.RowColorGetter = null;
- }
- listColView.SetNeedsDisplay ();
- }
- private void ToggleInvertSelectedCellFirstCharacter ()
- {
- //toggle menu item
- _miCursor.Checked = !_miCursor.Checked;
- listColView.Style.InvertSelectedCellFirstCharacter = (bool)_miCursor.Checked;
- listColView.SetNeedsDisplay ();
- }
- private void ToggleVerticalOrientation ()
- {
- _miOrientVertical.Checked = !_miOrientVertical.Checked;
- if ((ListTableSource)listColView.Table != null) {
- ((ListTableSource)listColView.Table).Style.Orientation = (bool)_miOrientVertical.Checked ? Orientation.Vertical : Orientation.Horizontal;
- listColView.SetNeedsDisplay ();
- }
- }
- private void ToggleScrollParallel ()
- {
- _miScrollParallel.Checked = !_miScrollParallel.Checked;
- if ((ListTableSource)listColView.Table != null) {
- ((ListTableSource)listColView.Table).Style.ScrollParallel = (bool)_miScrollParallel.Checked;
- listColView.SetNeedsDisplay ();
- }
- }
- private void SetListMinWidth ()
- {
- RunListWidthDialog ("MinCellWidth", (s, v) => s.MinCellWidth = v, (s) => s.MinCellWidth);
- listColView.SetNeedsDisplay ();
- }
- private void SetListMaxWidth ()
- {
- RunListWidthDialog ("MaxCellWidth", (s, v) => s.MaxCellWidth = v, (s) => s.MaxCellWidth);
- listColView.SetNeedsDisplay ();
- }
- private void RunListWidthDialog (string prompt, Action<TableView, int> setter, Func<TableView, int> getter)
- {
- var accepted = false;
- var ok = new Button ("Ok", is_default: true);
- ok.Clicked += (s, e) => { accepted = true; Application.RequestStop (); };
- var cancel = new Button ("Cancel");
- cancel.Clicked += (s, e) => { Application.RequestStop (); };
- var d = new Dialog (ok, cancel) { Title = prompt };
- var tf = new TextField () {
- Text = getter (listColView).ToString (),
- X = 0,
- Y = 1,
- Width = Dim.Fill ()
- };
- d.Add (tf);
- tf.SetFocus ();
- Application.Run (d);
- if (accepted) {
- try {
- setter (listColView, int.Parse (tf.Text));
- } catch (Exception ex) {
- MessageBox.ErrorQuery (60, 20, "Failed to set", ex.Message, "Ok");
- }
- }
- }
- private void CloseExample ()
- {
- listColView.Table = null;
- }
- private void Quit ()
- {
- Application.RequestStop ();
- }
- private void OpenSimpleList (bool big)
- {
- SetTable (BuildSimpleList (big ? 1023 : 31));
- }
- private void SetTable (IList list)
- {
- listColView.Table = new ListTableSource (list, listColView);
- if ((ListTableSource)listColView.Table != null) {
- currentTable = ((ListTableSource)listColView.Table).DataTable;
- }
- }
- /// <summary>
- /// Builds a simple list in which values are the index. This helps testing that scrolling etc is working correctly and not skipping out values when paging
- /// </summary>
- /// <param name="items"></param>
- /// <returns></returns>
- public static IList BuildSimpleList (int items)
- {
- var list = new List<object> ();
- for (int i = 0; i < items; i++) {
- list.Add ("Item " + i);
- }
- return list;
- }
- }
- }
|