Пример #1
0
 private void InitializeInlineEditing()
 {
     // Add control to listview
     m_textBoxComment             = new PaddedTextBox();
     m_textBoxComment.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
     m_textBoxComment.Location    = new System.Drawing.Point(32, 104);
     m_textBoxComment.Name        = "m_textBoxComment";
     m_textBoxComment.Size        = new System.Drawing.Size(80, 16);
     m_textBoxComment.TabIndex    = 3;
     m_textBoxComment.Text        = string.Empty;
     m_textBoxComment.AutoSize    = false;
     m_textBoxComment.Padding     = new Padding(6, 1, 1, 0);
     m_textBoxComment.Visible     = false;
     m_lvEntries.Controls.Add(m_textBoxComment);
     AddHandler();
 }
Пример #2
0
            private void SetEditBox(PaddedTextBox c, Rectangle rcSubItem, int SubItem)
            {
                if (rcSubItem.X < 0)
                {
                    // Left edge of SubItem not visible - adjust rectangle position and width
                    rcSubItem.Width += rcSubItem.X;
                    rcSubItem.X      = 0;
                }

                if (rcSubItem.X + rcSubItem.Width > m_lvEntries.ClientRectangle.Width)
                {
                    // Right edge of SubItem not visible - adjust rectangle width
                    rcSubItem.Width = m_lvEntries.ClientRectangle.Width - rcSubItem.Left;
                }

                // Calculate editbox height
                //if (c.Lines.Length > 1)
                if (c.Multiline)
                {
                    // Always display only 1 line
                    //rcSubItem.Height *= 1;

                    // Set height depending on lines
                    //rcSubItem.Height *= c.LineCount;
                    rcSubItem.Height = c.CalculateHeight;

                    //c.ScrollBars(true);
                }
                else
                {
                    c.ScrollBars(false);
                }

                // Subitem bounds are relative to the location of the ListView!
                rcSubItem.Offset(m_lvEntries.Left, m_lvEntries.Top);

                // In case the editing control and the listview are on different parents,
                // account for different origins
                Point origin    = new Point(0, 0);
                Point lvOrigin  = m_lvEntries.Parent.PointToScreen(origin);
                Point ctlOrigin = c.Parent.PointToScreen(origin);

                rcSubItem.Offset(lvOrigin.X - ctlOrigin.X, lvOrigin.Y - ctlOrigin.Y);

                // Padding
                Padding pdSubItem = new Padding(6, 1, 1, 0);

                if (SubItem == 0)
                {
                    pdSubItem.Left = 1;
                }
                else if (c.Multiline)
                {
                    pdSubItem.Left = 5;
                }

                // Position, padding and show editor
                if (!c.Bounds.Equals(rcSubItem))
                {
                    c.Bounds = rcSubItem;
                }

                if (!c.Padding.Equals(pdSubItem))
                {
                    c.Padding = pdSubItem;
                }
            }
Пример #3
0
            /// <summary>
            /// Accept or discard current value of cell editor control
            /// </summary>
            /// <param name="AcceptChanges">Use the _editingControl's Text as new SubItem text or discard changes?</param>
            private void EndEditing(bool AcceptChanges, bool ContinueEdit)
            {
                mutEdit.WaitOne();

                //if (_editingControl == null)
                //{
                //    mutEdit.ReleaseMutex();
                //    return;
                //}

                ListViewItem  Item    = _editItem;
                int           SubItem = _editSubItem;
                PaddedTextBox c       = _editingControl;

                PwListItem pli = (((ListViewItem)Item).Tag as PwListItem);

                if (pli == null)
                {
                    Debug.Assert(false); return;
                }
                PwEntry pe = pli.Entry;

                if (AcceptChanges == true)
                {
                    // Check if item and textbox contain different text
                    if (Util.GetEntryFieldEx(pe, SubItem, false) != c.Text)
                    {
                        // Save changes
                        //MAYBE save only if editing is stopped or another item will be edited next
                        //if (ContinueEdit == false)
                        AcceptChanges = Util.SaveEntry(m_host.Database, Item, SubItem, c.Text);

                        //TODO TEST maybe it wont flickr if we set visible false later
                        // Avoid flickering
                        // Set item text manually before calling RefreshEntriesList
                        // If Item is protected
                        if (!_editItem.SubItems[_editSubItem].Text.Equals(PwDefs.HiddenPassword))
                        {
                            // Updating the listview item
                            _editItem.SubItems[_editSubItem].Text = Util.GetEntryFieldEx(pe, SubItem, true);
                        }
                    }
                    else
                    {
                        // No changes detected
                        AcceptChanges = false;
                    }
                }
                else
                {
                    // Cancel
                    // Nothing todo
                    // AcceptChanges is false
                }

                //TODO Should be part of the textbox and inlineedit should be notified by event
                c.Leave     -= new EventHandler(_editControl_Leave);
                c.LostFocus -= new EventHandler(_editControl_LostFocus);
                c.KeyPress  -= new KeyPressEventHandler(_editControl_KeyPress);

                if (ContinueEdit == false)
                {
                    _editingControl = null;
                    _editItem       = null;
                    _editSubItem    = -1;

                    c.Visible = false;

                    //Util.SelectEntry((PwEntry)Item.Tag, true);
                    //m_lvEntries.Update();
                    m_lvEntries.Select();
                    m_lvEntries.HideSelection = false;
                    m_lvEntries.Focus();

                    if (AcceptChanges == true)
                    {
                        // The number of visible entries has not changed, so we can call RefreshEntriesList
                        Util.UpdateSaveState();
                        m_host.MainWindow.EnsureVisibleEntry(pe.Uuid);
                        //TEST m_host.MainWindow.RefreshEntriesList();
                    }
                }

                // Add/Resume UIStateUpdated Event Handler
                //m_evMainWindow.Resume("OnPwListCustomColumnUpdate");
                //m_host.MainWindow.UIStateUpdated += new EventHandler(OnPwListCustomColumnUpdate);

                mutEdit.ReleaseMutex();
            }
Пример #4
0
            /// <summary>
            /// Begin in-place editing of given cell
            /// </summary>
            /// <param name="c">Control used as cell editor</param>
            /// <param name="Item">ListViewItem to edit</param>
            /// <param name="SubItem">SubItem index to edit</param>
            private void StartEditing(PwEntry pe, ListViewItem Item, int SubItem, bool ContinueEdit)
            {
                mutEdit.WaitOne();

                if (Item.Index == -1)
                {
                    mutEdit.ReleaseMutex();
                    return;
                }

                //if (_editingControl != null)
                //{
                //    mutEdit.ReleaseMutex();
                //    return;
                //}

                m_host.MainWindow.EnsureVisibleEntry(pe.Uuid);
                Util.SelectEntry(pe, true, true);

                int           colID   = SubItem;
                AceColumn     col     = Util.GetAceColumn(colID);
                AceColumnType colType = col.Type;
                PaddedTextBox c       = m_textBoxComment;

                // Only Title is the editable
                //TODO: status selection?
                if (colType != AceColumnType.Title)
                {
                    mutEdit.ReleaseMutex();
                    return;
                }

                // Set Multiline property
                switch (colType)
                {
                case AceColumnType.Notes:
                case AceColumnType.CustomString:
                    c.Multiline = true;
                    break;

                case AceColumnType.PluginExt:
                    //TODO
                    c.Multiline = false;
                    break;

                default:
                    c.Multiline = false;
                    break;
                }

                // Set editing allowed
                switch (colType)
                {
                case AceColumnType.CreationTime:
                case AceColumnType.LastAccessTime:
                case AceColumnType.LastModificationTime:
                case AceColumnType.ExpiryTime:
                case AceColumnType.Uuid:
                case AceColumnType.Attachment:
                case AceColumnType.ExpiryTimeDateOnly:
                case AceColumnType.Size:
                case AceColumnType.HistoryCount:
                    // No editing allowed
                    c.ReadOnly = true;
                    break;

                case AceColumnType.PluginExt:
                    //TODO No editing allowed
                    c.ReadOnly = true;
                    break;

                default:
                    // Editing allowed
                    c.ReadOnly = false;
                    break;
                }

                // Read SubItem text and set textbox property


                // Read entry
                c.Text = Util.GetEntryFieldEx(pe, SubItem, false);

                // Set control location, bounding, padding
                SetEditBox(c, GetSubItemBounds(Item, SubItem), SubItem);

                //c.ScrollToTop();
                c.SelectAll();

                _editingControl = c;
                _editItem       = Item;
                _editSubItem    = SubItem;

                if (ContinueEdit == false)
                {
                    //c.Invalidate();
                    c.Visible = true;
                    c.BringToFront();
                    c.Select();
                    c.Focus();

                    m_host.MainWindow.EnsureVisibleEntry(pe.Uuid);
                }

                // Should be in the textbox
                c.Leave     += new EventHandler(_editControl_Leave);
                c.LostFocus += new EventHandler(_editControl_LostFocus);
                c.KeyPress  += new KeyPressEventHandler(_editControl_KeyPress);

                mutEdit.ReleaseMutex();
            }