public DynamicStatusItem EnterStatusItem()
        {
            var valid = false;

            if (_statusItem == null)
            {
                var m = new DynamicStatusItem();
                _txtTitle.Text  = m.title;
                _txtAction.Text = m.action;
            }
            else
            {
                EditStatusItem(_statusItem);
            }

            var _btnOk = new Button("Ok")
            {
                IsDefault = true,
            };

            _btnOk.Clicked += () => {
                if (ustring.IsNullOrEmpty(_txtTitle.Text))
                {
                    MessageBox.ErrorQuery("Invalid title", "Must enter a valid title!.", "Ok");
                }
                else
                {
                    if (!ustring.IsNullOrEmpty(_txtShortcut.Text))
                    {
                        _txtTitle.Text = DynamicStatusBarSample.SetTitleText(
                            _txtTitle.Text, _txtShortcut.Text);
                    }
                    valid = true;
                    Application.RequestStop();
                }
            };
            var _btnCancel = new Button("Cancel");

            _btnCancel.Clicked += () => {
                _txtTitle.Text = ustring.Empty;
                Application.RequestStop();
            };
            var _dialog = new Dialog("Please enter the item details.", _btnOk, _btnCancel);

            Width  = Dim.Fill();
            Height = Dim.Fill() - 1;
            _dialog.Add(this);
            _txtTitle.SetFocus();
            _txtTitle.CursorPosition = _txtTitle.Text.Length;
            Application.Run(_dialog);

            if (valid)
            {
                return(new DynamicStatusItem(_txtTitle.Text, _txtAction.Text, _txtShortcut.Text));
            }
            else
            {
                return(null);
            }
        }
        public DynamicStatusBarSample(ustring title) : base(title)
        {
            DataContext = new DynamicStatusItemModel();

            var _frmDelimiter = new FrameView("Shortcut Delimiter:")
            {
                X      = Pos.Center(),
                Y      = 0,
                Width  = 25,
                Height = 4
            };

            var _txtDelimiter = new TextField(StatusBar.ShortcutDelimiter.ToString())
            {
                X     = Pos.Center(),
                Width = 2,
            };

            _txtDelimiter.TextChanged += (_) => StatusBar.ShortcutDelimiter = _txtDelimiter.Text;
            _frmDelimiter.Add(_txtDelimiter);

            Add(_frmDelimiter);

            var _frmStatusBar = new FrameView("Items:")
            {
                Y      = 5,
                Width  = Dim.Percent(50),
                Height = Dim.Fill(2)
            };

            var _btnAddStatusBar = new Button("Add a StatusBar")
            {
                Y = 1,
            };

            _frmStatusBar.Add(_btnAddStatusBar);

            var _btnRemoveStatusBar = new Button("Remove a StatusBar")
            {
                Y = 1
            };

            _btnRemoveStatusBar.X = Pos.AnchorEnd() - (Pos.Right(_btnRemoveStatusBar) - Pos.Left(_btnRemoveStatusBar));
            _frmStatusBar.Add(_btnRemoveStatusBar);

            var _btnAdd = new Button(" Add  ")
            {
                Y = Pos.Top(_btnRemoveStatusBar) + 2,
            };

            _btnAdd.X = Pos.AnchorEnd() - (Pos.Right(_btnAdd) - Pos.Left(_btnAdd));
            _frmStatusBar.Add(_btnAdd);

            _lstItems = new ListView(new List <DynamicStatusItemList> ())
            {
                ColorScheme = Colors.Dialog,
                Y           = Pos.Top(_btnAddStatusBar) + 2,
                Width       = Dim.Fill() - Dim.Width(_btnAdd) - 1,
                Height      = Dim.Fill(),
            };
            _frmStatusBar.Add(_lstItems);

            var _btnRemove = new Button("Remove")
            {
                X = Pos.Left(_btnAdd),
                Y = Pos.Top(_btnAdd) + 1
            };

            _frmStatusBar.Add(_btnRemove);

            var _btnUp = new Button("^")
            {
                X = Pos.Right(_lstItems) + 2,
                Y = Pos.Top(_btnRemove) + 2
            };

            _frmStatusBar.Add(_btnUp);

            var _btnDown = new Button("v")
            {
                X = Pos.Right(_lstItems) + 2,
                Y = Pos.Top(_btnUp) + 1
            };

            _frmStatusBar.Add(_btnDown);

            Add(_frmStatusBar);


            var _frmStatusBarDetails = new DynamicStatusBarDetails("StatusBar Item Details:")
            {
                X      = Pos.Right(_frmStatusBar),
                Y      = Pos.Top(_frmStatusBar),
                Width  = Dim.Fill(),
                Height = Dim.Fill(4)
            };

            Add(_frmStatusBarDetails);

            _btnUp.Clicked += () => {
                var i          = _lstItems.SelectedItem;
                var statusItem = DataContext.Items.Count > 0 ? DataContext.Items [i].StatusItem : null;
                if (statusItem != null)
                {
                    var items = _statusBar.Items;
                    if (i > 0)
                    {
                        items [i]                 = items [i - 1];
                        items [i - 1]             = statusItem;
                        DataContext.Items [i]     = DataContext.Items [i - 1];
                        DataContext.Items [i - 1] = new DynamicStatusItemList(statusItem.Title, statusItem);
                        _lstItems.SelectedItem    = i - 1;
                        _statusBar.SetNeedsDisplay();
                    }
                }
            };

            _btnDown.Clicked += () => {
                var i          = _lstItems.SelectedItem;
                var statusItem = DataContext.Items.Count > 0 ? DataContext.Items [i].StatusItem : null;
                if (statusItem != null)
                {
                    var items = _statusBar.Items;
                    if (i < items.Length - 1)
                    {
                        items [i]                 = items [i + 1];
                        items [i + 1]             = statusItem;
                        DataContext.Items [i]     = DataContext.Items [i + 1];
                        DataContext.Items [i + 1] = new DynamicStatusItemList(statusItem.Title, statusItem);
                        _lstItems.SelectedItem    = i + 1;
                        _statusBar.SetNeedsDisplay();
                    }
                }
            };

            var _btnOk = new Button("Ok")
            {
                X = Pos.Right(_frmStatusBar) + 20,
                Y = Pos.Bottom(_frmStatusBarDetails),
            };

            Add(_btnOk);

            var _btnCancel = new Button("Cancel")
            {
                X = Pos.Right(_btnOk) + 3,
                Y = Pos.Top(_btnOk),
            };

            _btnCancel.Clicked += () => {
                SetFrameDetails(_currentEditStatusItem);
            };
            Add(_btnCancel);

            _lstItems.SelectedItemChanged += (e) => {
                SetFrameDetails();
            };

            _btnOk.Clicked += () => {
                if (ustring.IsNullOrEmpty(_frmStatusBarDetails._txtTitle.Text) && _currentEditStatusItem != null)
                {
                    MessageBox.ErrorQuery("Invalid title", "Must enter a valid title!.", "Ok");
                }
                else if (_currentEditStatusItem != null)
                {
                    _frmStatusBarDetails._txtTitle.Text = SetTitleText(
                        _frmStatusBarDetails._txtTitle.Text, _frmStatusBarDetails._txtShortcut.Text);
                    var statusItem = new DynamicStatusItem(_frmStatusBarDetails._txtTitle.Text,
                                                           _frmStatusBarDetails._txtAction.Text,
                                                           _frmStatusBarDetails._txtShortcut.Text);
                    UpdateStatusItem(_currentEditStatusItem, statusItem, _lstItems.SelectedItem);
                }
            };

            _btnAdd.Clicked += () => {
                if (StatusBar == null)
                {
                    MessageBox.ErrorQuery("StatusBar Bar Error", "Must add a StatusBar first!", "Ok");
                    _btnAddStatusBar.SetFocus();
                    return;
                }

                var frameDetails = new DynamicStatusBarDetails();
                var item         = frameDetails.EnterStatusItem();
                if (item == null)
                {
                    return;
                }

                StatusItem newStatusItem = CreateNewStatusBar(item);
                _currentSelectedStatusBar++;
                _statusBar.AddItemAt(_currentSelectedStatusBar, newStatusItem);
                DataContext.Items.Add(new DynamicStatusItemList(newStatusItem.Title, newStatusItem));
                _lstItems.MoveDown();
            };

            _btnRemove.Clicked += () => {
                var statusItem = DataContext.Items.Count > 0 ? DataContext.Items [_lstItems.SelectedItem].StatusItem : null;
                if (statusItem != null)
                {
                    _statusBar.RemoveItem(_currentSelectedStatusBar);
                    DataContext.Items.RemoveAt(_lstItems.SelectedItem);
                    if (_lstItems.Source.Count > 0 && _lstItems.SelectedItem > _lstItems.Source.Count - 1)
                    {
                        _lstItems.SelectedItem = _lstItems.Source.Count - 1;
                    }
                    _lstItems.SetNeedsDisplay();
                    SetFrameDetails();
                }
            };

            _lstItems.Enter += (_) => {
                var statusItem = DataContext.Items.Count > 0 ? DataContext.Items [_lstItems.SelectedItem].StatusItem : null;
                SetFrameDetails(statusItem);
            };

            _btnAddStatusBar.Clicked += () => {
                if (_statusBar != null)
                {
                    return;
                }

                _statusBar = new StatusBar();
                Add(_statusBar);
            };

            _btnRemoveStatusBar.Clicked += () => {
                if (_statusBar == null)
                {
                    return;
                }

                Remove(_statusBar);
                _statusBar                = null;
                DataContext.Items         = new List <DynamicStatusItemList> ();
                _currentStatusItem        = null;
                _currentSelectedStatusBar = -1;
                SetListViewSource(_currentStatusItem, true);
                SetFrameDetails(null);
            };


            SetFrameDetails();


            var ustringConverter     = new UStringValueConverter();
            var listWrapperConverter = new ListWrapperConverter();

            var lstItems = new Binding(this, "Items", _lstItems, "Source", listWrapperConverter);


            void SetFrameDetails(StatusItem statusItem = null)
            {
                StatusItem newStatusItem;

                if (statusItem == null)
                {
                    newStatusItem = DataContext.Items.Count > 0 ? DataContext.Items [_lstItems.SelectedItem].StatusItem : null;
                }
                else
                {
                    newStatusItem = statusItem;
                }

                _currentEditStatusItem = newStatusItem;
                _frmStatusBarDetails.EditStatusItem(newStatusItem);
                var f = _btnOk.Enabled == _frmStatusBarDetails.Enabled;

                if (!f)
                {
                    _btnOk.Enabled     = _frmStatusBarDetails.Enabled;
                    _btnCancel.Enabled = _frmStatusBarDetails.Enabled;
                }
            }

            void SetListViewSource(StatusItem _currentStatusItem, bool fill = false)
            {
                DataContext.Items = new List <DynamicStatusItemList> ();
                var statusItem = _currentStatusItem;

                if (!fill)
                {
                    return;
                }
                if (statusItem != null)
                {
                    foreach (var si in _statusBar.Items)
                    {
                        DataContext.Items.Add(new DynamicStatusItemList(si.Title, si));
                    }
                }
            }

            StatusItem CreateNewStatusBar(DynamicStatusItem item)
            {
                StatusItem newStatusItem;

                newStatusItem = new StatusItem(ShortcutHelper.GetShortcutFromTag(
                                                   item.shortcut, StatusBar.ShortcutDelimiter),
                                               item.title, _frmStatusBarDetails.CreateAction(item));

                return(newStatusItem);
            }

            void UpdateStatusItem(StatusItem _currentEditStatusItem, DynamicStatusItem statusItem, int index)
            {
                _currentEditStatusItem   = CreateNewStatusBar(statusItem);
                _statusBar.Items [index] = _currentEditStatusItem;
                if (DataContext.Items.Count == 0)
                {
                    DataContext.Items.Add(new DynamicStatusItemList(_currentEditStatusItem.Title, _currentEditStatusItem));
                }
                DataContext.Items [index] = new DynamicStatusItemList(_currentEditStatusItem.Title, _currentEditStatusItem);
                SetFrameDetails(_currentEditStatusItem);
            }

            //_frmStatusBarDetails.Initialized += (s, e) => _frmStatusBarDetails.Enabled = false;
        }
 public Action CreateAction(DynamicStatusItem item)
 {
     return(new Action(() => MessageBox.ErrorQuery(item.title, item.action, "Ok")));
 }