public PieceGridView() { SupressUpdate = true; this.id = new DataGridViewTextBoxColumn(); this.PieceName = new DataGridViewTextBoxColumn(); this.ParentID = new DataGridViewTextBoxColumn(); AllowUserToDeleteRows = false; AllowUserToResizeColumns = false; AllowUserToResizeRows = false; BackgroundColor = System.Drawing.SystemColors.Window; BorderStyle = BorderStyle.None; CellBorderStyle = DataGridViewCellBorderStyle.None; ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText; ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; ColumnHeadersVisible = false; Columns.AddRange(new DataGridViewColumn[] { id, PieceName, ParentID }); RowHeadersVisible = false; RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing; RowTemplate.Height = 16; SelectionMode = DataGridViewSelectionMode.FullRowSelect; StandardTab = true; // // id // this.id.HeaderText = "ID"; this.id.Name = "id"; this.id.ReadOnly = true; this.id.Visible = false; // // PieceName // this.PieceName.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; this.PieceName.HeaderText = "Name"; this.PieceName.Name = "PieceName"; // // ParentID // this.ParentID.HeaderText = "ParentID"; this.ParentID.Name = "ParentID"; this.ParentID.Visible = false; Search = new PieceSearch(PieceSearch.Fields.ID, PieceSearch.Fields.Name, PieceSearch.Fields.ParentPieceID); status_reset_timer = new Timer(); status_reset_timer.Interval = 6000; // reset status message to "Ready" after 6 sec status_reset_timer.Tick += (sender, e) => { this.change_status("Ready", false); status_reset_timer.Enabled = false; }; this.Rows.Clear(); this.CellFormatting += (sender, e) => { // highlight the fact that the control is not in focus e.CellStyle.SelectionBackColor = ((DataGridView)sender).Focused ? SystemColors.Highlight : SystemColors.InactiveCaption; // highlight the pieces that are "derived" from other pieces (i.e. a transcription, etc.) e.CellStyle.ForeColor = (this[2, e.RowIndex].Value == null) ? SystemColors.ControlText : Color.Gray; // highlight the cell in edit mode if (this.IsCurrentCellInEditMode && this.CurrentCell == this[e.ColumnIndex, e.RowIndex]) { e.CellStyle.BackColor = CellInEditColor; } }; this.SortCompare += (sender, e) => { // use natural sorting if (this[1, e.RowIndex1].Value == null || this[1, e.RowIndex2].Value == null) { return; } e.SortResult = NaturalSortComparer.Default.Compare(this[1, e.RowIndex1].Value.ToString(), this[1, e.RowIndex2].Value.ToString()); e.Handled = true; }; this.KeyDown += (sender, e) => { if (e.KeyData == Keys.Up || e.KeyData == Keys.Down) { IsScrolling = true; // don't fetch data if the user is scrolling fast } else if (e.KeyData == (Keys.Home)) { this.ClearSelection(); this.CurrentCell = this[1, 0]; this.CurrentCell.Selected = true; } else if (e.KeyData == (Keys.End)) { this.ClearSelection(); this.CurrentCell = this[1, this.RowCount - 1]; this.CurrentCell.Selected = true; } }; this.KeyUp += (sender, e) => { if (e.KeyData == Keys.Up || e.KeyData == Keys.Down) { // resume fetchting data after user stop fast scrolling IsScrolling = false; //force re-selection so that the SelectionChanged event will fire this.ClearSelection(); this.Rows[this.CurrentRow.Index].Selected = true; } else if (e.KeyData == Keys.Delete) { DeletePiece(); } }; this.GotFocus += (sender, e) => { if (this.SelectedRows.Count == 0) //auto select first row if nothing is already selected { this.Rows[0].Selected = true; } }; this.CellEndEdit += (sender, e) => { this.CurrentCell = this[e.ColumnIndex, e.RowIndex]; if (this[0, e.RowIndex].Value == null && this.CurrentCell.Value != null) { if (!AddNewPiece(this.CurrentCell.Value.ToString())) { this.Rows.Remove(this.Rows[this.CurrentCell.RowIndex]); } } else if (!this.CurrentRow.IsNewRow) { RenamePiece(this.CurrentCell.Value.ToString()); } }; }
public Browse() { InitializeComponent(); status_reset_timer = new Timer(); status_reset_timer.Interval = 6000; // reset status message to "Ready" after 6 sec status_reset_timer.Tick += (sender, e) => { this.change_status("Ready", false); status_reset_timer.Enabled = false; }; if (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Runtime) { artistSearch = new ArtistSearch(ArtistSearch.Fields.ID, ArtistSearch.Fields.FullName, ArtistSearch.Fields.MatchName); artistSearch.AddTypeToSearch(ArtistSearch.TypeCategory.Composers); genreSearch = new GenreSearch(GenreSearch.Fields.ID, GenreSearch.Fields.Name); pieceSearch = new PieceSearch(PieceSearch.Fields.ID, PieceSearch.Fields.Name, PieceSearch.Fields.ParentPieceID); SupressUpdate = false; UpdateArtistList(); UpdateGenreList(); UpdatePieceList(false); } txbComposer.Focus(); // hide the tabs of tabControlMode Rectangle rect = new Rectangle(tabPageSearch.Left, tabPageSearch.Top, tabPageSearch.Width, tabPageSearch.Height); tabControlMode.Region = new Region(rect); txbComposer.SetDefaultText(TextBoxDefaultAll); txbComposer.PopupWidth = -1; txbComposer.ItemSelected += (sender, e) => { UpdateGenreList(); UpdatePieceList(false); if (txbComposer.SelectedItem != null) { txbFilter.Focus(); } }; txbComposer.TextChanged += (sender, e) => { SupressUpdate = true; txbGenre.ResetText(); txbFilter.Text = TextBoxDefaultNone; SupressUpdate = false; }; txbComposer.KeyDown += (sender, e) => { if (e.KeyData == Keys.Enter) { if (txbComposer.SelectedItem != null || !txbComposer.HasText()) { txbFilter.Focus(); } else { if (AddNewComposer(txbComposer.Text)) // add new composer and set focus to dg if add is successful { dg.Focus(); } } } else if (e.KeyData == Keys.F2 && txbComposer.HighlightedItem != null) { //change_status(txbComposer.HighlightedValue.ToString() + txbComposer.HighlightedItem.ToString()); int id = int.Parse(txbComposer.HighlightedValue.ToString()); txbComposer.HideAutoCompleteList(); RenameComposer(id, ""); } else if (e.KeyData == Keys.Delete && txbComposer.HighlightedItem != null) { int id = int.Parse(txbComposer.HighlightedValue.ToString()); txbComposer.HideAutoCompleteList(); DeleteComposer(id); } else { return; } e.Handled = true; }; //txbComposer.LostFocus += new EventHandler(txb_LostFocus); txbGenre.SetDefaultText(TextBoxDefaultAll); txbGenre.PopupWidth = -1; //txbGenre.LostFocus += txb_LostFocus; txbGenre.ItemSelected += (sender, e) => UpdatePieceList(false); txbFilter.Text = TextBoxDefaultNone; txbFilter.TextChanged += (sender, e) => UpdatePieceList(false); txbFilter.KeyDown += txb_KeyDown; txbFilter.KeyDown += (sender, e) => { if (e.KeyData == Keys.Down) { dg.Focus(); } }; txbFilter.Enter += (sender, e) => txbFilter.SelectAll(); dg.Rows.Clear(); dg.CellFormatting += (sender, e) => { // highlight the fact that the control is not in focus e.CellStyle.SelectionBackColor = ((DataGridView)sender).Focused ? SystemColors.Highlight : SystemColors.InactiveCaption; // highlight the pieces that are "derived" from other pieces (i.e. a transcription, etc.) e.CellStyle.ForeColor = (dg[2, e.RowIndex].Value == null) ? SystemColors.ControlText : Color.Gray; // highlight the cell in edit mode if (dg.IsCurrentCellInEditMode && dg.CurrentCell == dg[e.ColumnIndex, e.RowIndex]) { e.CellStyle.BackColor = CellInEditColor; } }; dg.SortCompare += (sender, e) => { // use natural sorting if (dg[1, e.RowIndex1].Value == null || dg[1, e.RowIndex2].Value == null) { return; } e.SortResult = NaturalSortComparer.Default.Compare(dg[1, e.RowIndex1].Value.ToString(), dg[1, e.RowIndex2].Value.ToString()); e.Handled = true; }; dg.KeyDown += (sender, e) => { if (e.KeyData == Keys.Up || e.KeyData == Keys.Down) { IsScrolling = true; // don't fetch data if the user is scrolling fast } else if (e.KeyCode == Keys.Enter) { e.Handled = true; // move to next control if (e.Shift) { tabControl.SelectedTab = tabControl.TabPages[2]; tabControl.Focus(); } else { if (clbDetail.Items.Count != 0) { clbDetail.SelectedIndex = 0; } if (tabControl.SelectedTab == tabControl.TabPages[0] && clbDetail.Items.Count == 0) { tabControl.SelectedTab = tabControl.TabPages[1]; // goto text edit mode } tabControl.Focus(); } } else if (e.KeyData == Keys.Escape) { txbFilter.Focus(); } else if (e.KeyData == (Keys.Home)) { dg.ClearSelection(); dg.CurrentCell = dg[1, 0]; dg.CurrentCell.Selected = true; } else if (e.KeyData == (Keys.End)) { dg.ClearSelection(); dg.CurrentCell = dg[1, dg.RowCount - 1]; dg.CurrentCell.Selected = true; } }; dg.KeyUp += (sender, e) => { if (e.KeyData == Keys.Up || e.KeyData == Keys.Down) { // resume fetchting data after user stop fast scrolling IsScrolling = false; //force re-selection so that the SelectionChanged event will fire dg.ClearSelection(); dg.Rows[dg.CurrentRow.Index].Selected = true; } else if (e.KeyData == (Keys.Alt | Keys.P)) { tabControl.SelectedTab = tabControl.TabPages[2]; dg.Focus(); } else if (e.KeyData == (Keys.Alt | Keys.M)) { tabControl.SelectedTab = tabControl.TabPages[0]; dg.Focus(); } else if (e.KeyData == (Keys.Control | Keys.E)) { //start text edit mode tabControl.SelectedTab = tabControl.TabPages[1]; tabControl.Focus(); } else if (e.KeyData == Keys.Delete) { DeletePiece(); } }; dg.SelectionChanged += (sender, e) => { if (!IsScrolling) { UpdateDetail(); } }; dg.GotFocus += (sender, e) => { if (dg.SelectedRows.Count == 0) //auto select first row if nothing is already selected { dg.Rows[0].Selected = true; } }; dg.CellEndEdit += (sender, e) => { dg.CurrentCell = dg[e.ColumnIndex, e.RowIndex]; if (dg[0, e.RowIndex].Value == null && dg.CurrentCell.Value != null) { if (!AddNewPiece(dg.CurrentCell.Value.ToString())) { dg.Rows.Remove(dg.Rows[dg.CurrentCell.RowIndex]); } } else if (!dg.CurrentRow.IsNewRow) { RenamePiece(dg.CurrentCell.Value.ToString()); } }; clbDetail.KeyDown += new KeyEventHandler(clbDetail_KeyDown); clbDetail.LostFocus += (sender, e) => clbDetail.ClearSelected(); clbDetail.SelectedIndexChanged += (sender, e) => { // show preview of how the formatted name is like on statusbar if (!DetailPaneVisible) { return; // no need to update UI } if (clbDetail.SelectedIndex != -1 && currentPiece != null) { change_status(currentPiece.FormatDetail(clbDetail.SelectedItem.ToString())); } }; // don't focus on the tabs themselves tabControl.GotFocus += (sender, e) => this.SelectNextControl(tabControl, true, true, true, true); tabControl.Deselecting += (sender, e) => { if (e.TabPage == tabPageDetailEdit) { if (string.IsNullOrEmpty(txbEdit.Text.Trim()) || ((currentPiece.Details != null && string.Join("", currentPiece.Details) == string.Join("", txbEdit.Lines)))) { return; } DialogResult ret = MessageBox.Show( "Your changes have not been saved; you want to save the changes?", "Confirmation", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation); switch (ret) { case DialogResult.Cancel: e.Cancel = true; txbEdit.Focus(); break; case DialogResult.No: UpdateDetail(); break; case DialogResult.Yes: ChangeDetail(txbEdit.Lines); break; default: break; } } }; txbEdit.KeyDown += (sender, e) => { if (e.KeyData == Keys.Escape) { tabControl.SelectTab(0); } if (e.KeyData == (Keys.Control | Keys.Enter)) // submit changes and leave edit mode { ChangeDetail(txbEdit.Lines); tabControl.SelectTab(0); } if (e.KeyData == (Keys.Shift | Keys.Enter)) { ChangeDetail(txbEdit.Lines); // submit changes but not leaving edit mode } }; txbEdit.PreviewKeyDown += (sender, e) => { if (e.KeyData == (Keys.Shift | Keys.Enter) || e.KeyData == (Keys.Control | Keys.Enter)) { e.IsInputKey = false; //shift+enter and ctrl+enter is used for special purposes, not input... } }; //txbEdit.GotFocus += (sender,e) => txbEdit.Lines = currentPiece.Details; pgrid.PropertyValueChanged += (sender, e) => { change_status((e.OldValue != null ? e.OldValue.ToString() : "") + " => " + e.ChangedItem.Value.ToString()); Array.ForEach <object>(pgrid.SelectedObjects, p => ((Piece)p).Commit()); change_status("Properties updated"); }; ((ContainerControl)pgrid).Controls[2].PreviewKeyDown += (sender, e) => { if (e.KeyData == Keys.Escape) { dg.Focus(); } }; }