Imports System.Windows.Forms Public Class frmEditWork Private mobjDetailWork As New clsWork Private m_objHymnTuneNamesHash As Hashtable Private m_objComposersHash As Hashtable Private m_objInstrumentationsHash As Hashtable Protected Overrides Sub LoadExistingItemsList() Dim lobjWork As clsWork Dim lobjWorks As System.Collections.Generic.List(Of clsWork) SetUpExistingItemsHeaders() lobjWorks = clsWork.GetAllWorks Me.ExistingItemsListSuspendLayout() For Each lobjWork In lobjWorks Me.ExistingObjectsListItems.Add(ConvertWorkToListViewItem(lobjWork)) Next Me.ExistingItemsListResumeLayout() End Sub Private Sub SetUpExistingItemsHeaders() Me.ExistingObjectsListColumns.Add("Composer", 200, HorizontalAlignment.Left) Me.ExistingObjectsListColumns.Add("Work Name", 300, HorizontalAlignment.Left) Me.ExistingObjectsListColumns.Add("Book", 300, HorizontalAlignment.Left) Me.ExistingObjectsListColumns.Add("Page", 100, HorizontalAlignment.Right) Me.ExistingObjectsListColumns.Add("Hymn Tune Name", 200, HorizontalAlignment.Left) Me.ExistingObjectsListColumns.Add("Instrumentation", 200, HorizontalAlignment.Left) 'Set up sorting rules Dim lobjBaseEditFormColumnSortRules(5) As clsGridColumnSortRule 'First column, sort by Composer, then Work Name lobjBaseEditFormColumnSortRules(0) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString) lobjBaseEditFormColumnSortRules(0).SubColumnSort = New clsGridSubColumnSortRule(1, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing) 'Second column, sort by Work Name, then Composer lobjBaseEditFormColumnSortRules(1) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString) lobjBaseEditFormColumnSortRules(1).SubColumnSort = New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, Nothing) 'Third column, sort by Book, then Page lobjBaseEditFormColumnSortRules(2) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString) lobjBaseEditFormColumnSortRules(2).SubColumnSort = New clsGridSubColumnSortRule(3, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing) 'Fourth column, sort by Book, then Page lobjBaseEditFormColumnSortRules(3) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortNone) lobjBaseEditFormColumnSortRules(3).SubColumnSort = New clsGridSubColumnSortRule(2, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(3, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing)) 'Fifth column, sort by Hymn Tune Name, then Composer lobjBaseEditFormColumnSortRules(4) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString) lobjBaseEditFormColumnSortRules(4).SubColumnSort = New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, Nothing) 'Sixth column, sort by Instrumentation, then Book, then Page lobjBaseEditFormColumnSortRules(5) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString) lobjBaseEditFormColumnSortRules(5).SubColumnSort = New clsGridSubColumnSortRule(2, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(3, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing)) MyBaseEditFormColumnSortRules = lobjBaseEditFormColumnSortRules End Sub Protected Overrides Sub InitializeDetailControls() 'Load data to detail controls here at form load time txtWorkName.MaxLength = MyGlobals.WORK_NAME_SIZE txtOpusInfo.MaxLength = MyGlobals.OPUS_INFO_SIZE cboComposerName.MaxLength = MyGlobals.COMPOSER_NAME_SIZE cboInstrumentationName.MaxLength = MyGlobals.INSTRUMENTATION_NAME_SIZE cboHymnTuneName.MaxLength = MyGlobals.HYMN_TUNE_NAME_SIZE txtPageNumber.Text = "" txtWorkName.Text = "" txtOpusInfo.Text = "" 'Only set up book if first time in If cboBook.Items.Count = 0 Then Dim objBook As clsBook Dim objBooks As System.Collections.Generic.List(Of clsBook) Me.cboBook.Items.Clear() objBooks = clsBook.GetAllBooks For Each objBook In objBooks Me.cboBook.Items.Add(objBook) Next 'Select first book if there is one If Me.cboBook.Items.Count > 0 Then Me.cboBook.SelectedIndex = 0 End If End If If m_objComposersHash Is Nothing Then m_objComposersHash = New Hashtable End If If cboComposerName.Items.Count = 0 Then Dim objComposer As clsComposer Dim objComposers As System.Collections.Generic.List(Of clsComposer) Me.cboComposerName.Items.Clear() m_objComposersHash = New Hashtable objComposers = clsComposer.GetAllComposers For Each objComposer In objComposers AddComposerToForm(objComposer) Next End If If m_objInstrumentationsHash Is Nothing Then m_objInstrumentationsHash = New Hashtable End If If cboInstrumentationName.Items.Count = 0 Then Dim objInstrumentation As clsInstrumentation Dim objInstrumentations As System.Collections.Generic.List(Of clsInstrumentation) Me.cboInstrumentationName.Items.Clear() m_objInstrumentationsHash = New Hashtable objInstrumentations = clsInstrumentation.GetAllInstrumentations For Each objInstrumentation In objInstrumentations AddInstrumentationToForm(objInstrumentation) Next End If If cboHymnTuneName.Items.Count = 0 Then Dim objHymnTuneName As clsHymnTuneName Dim objHymnTuneNames As System.Collections.Generic.List(Of clsHymnTuneName) Me.cboHymnTuneName.Items.Clear() m_objHymnTuneNamesHash = New Hashtable objHymnTuneNames = clsHymnTuneName.GetAllHymnTuneNames For Each objHymnTuneName In objHymnTuneNames AddHymnTuneNameToForm(objHymnTuneName) Next Me.cboHymnTuneName.Items.Add(MyGlobals.NONE_STRING) End If End Sub Protected Overrides Sub SetFocusToFirstDetailControlForEdit() cboBook.Focus() End Sub Protected Overrides Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As System.Windows.Forms.ListViewItem) As Boolean Dim lobjSavedWork As clsWork Dim lblnReturnValue As Boolean = False lobjSavedWork = CType(lstvwExistingItem.Tag, clsWork) Dim objComposer As clsComposer Select Case cboComposerName.Text.ToUpper.Trim Case "" objComposer = Nothing Case Else objComposer = CType(MyGlobals.GetItemFromHashWithStringKey(cboComposerName.Text.ToUpper.Trim, m_objComposersHash), clsComposer) If objComposer Is Nothing Then objComposer = New clsComposer(cboComposerName.Text.Trim) End If End Select Dim objInstrumentation As clsInstrumentation Select Case cboInstrumentationName.Text.ToUpper.Trim Case "" objInstrumentation = Nothing Case Else objInstrumentation = CType(MyGlobals.GetItemFromHashWithStringKey(cboInstrumentationName.Text.ToUpper.Trim, m_objInstrumentationsHash), clsInstrumentation) If objInstrumentation Is Nothing Then objInstrumentation = New clsInstrumentation(cboInstrumentationName.Text.Trim) End If End Select Dim objHymnTuneName As clsHymnTuneName Select Case cboHymnTuneName.Text.ToUpper.Trim Case MyGlobals.NONE_STRING.ToUpper, "" objHymnTuneName = Nothing Case Else objHymnTuneName = CType(MyGlobals.GetItemFromHashWithStringKey(cboHymnTuneName.Text.ToUpper.Trim, m_objHymnTuneNamesHash), clsHymnTuneName) If objHymnTuneName Is Nothing Then objHymnTuneName = New clsHymnTuneName(cboHymnTuneName.Text.Trim) End If End Select mobjDetailWork.Book = CType(cboBook.SelectedItem, clsBook) mobjDetailWork.PageNumberAsString = txtPageNumber.Text mobjDetailWork.WorkName = txtWorkName.Text mobjDetailWork.Composer = objComposer mobjDetailWork.Instrumentation = objInstrumentation mobjDetailWork.OpusInfo = txtOpusInfo.Text mobjDetailWork.HymnTuneName = objHymnTuneName If lobjSavedWork.StateIsIdentical(mobjDetailWork) Then Return False Else Return True End If End Function Protected Overrides Function DetailControlsHaveSignificantData() As Boolean If txtWorkName.Text.Trim.Length > 0 _ OrElse txtPageNumber.Text.Trim.Length > 0 _ OrElse txtOpusInfo.Text.Trim.Length > 0 Then 'Pre-load composer from book, if composer hasn't already been set If cboComposerName.Text.Trim.Length = 0 Then Dim objBook As clsBook objBook = CType(cboBook.SelectedItem, clsBook) If objBook.Composer Is Nothing Then 'Do nothing - this is collection Else cboComposerName.Text = objBook.Composer.ComposerName End If End If 'Pre-load instrumentation from book, if instrumentation hasn't already been set If cboInstrumentationName.Text.Trim.Length = 0 Then Dim objBook As clsBook objBook = CType(cboBook.SelectedItem, clsBook) If objBook.Instrumentation Is Nothing Then 'Do nothing - this is collection Else cboInstrumentationName.Text = objBook.Instrumentation.InstrumentationName End If End If Return True End If Return False End Function Protected Overrides Sub EmptyOutDetailControls() InitializeDetailControls() txtWorkName.Text = "" txtPageNumber.Text = "" cboComposerName.Text = "" cboInstrumentationName.Text = "" txtOpusInfo.Text = "" cboHymnTuneName.Text = "" mobjDetailWork = New clsWork End Sub Protected Overrides Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As System.Windows.Forms.ListViewItem) As Boolean Dim lobjWork As clsWork Dim lblnReturnValue As Boolean = False lobjWork = CType(lstvwExistingItem.Tag, clsWork) 'MessageBox.Show(lobjWork.Book.ToString) 'cboBook.SelectedText = lobjWork.Book.ToString cboBook.Text = lobjWork.Book.ToString txtPageNumber.Text = lobjWork.PageNumberAsString txtWorkName.Text = lobjWork.WorkName If lobjWork.Composer Is Nothing Then cboComposerName.Text = "" Else cboComposerName.Text = lobjWork.Composer.ComposerName End If If lobjWork.Instrumentation Is Nothing Then cboInstrumentationName.Text = "" Else cboInstrumentationName.Text = lobjWork.Instrumentation.InstrumentationName End If txtOpusInfo.Text = lobjWork.OpusInfo If lobjWork.HymnTuneName Is Nothing Then cboHymnTuneName.Text = MyGlobals.NONE_STRING Else cboHymnTuneName.Text = lobjWork.HymnTuneName.HymnTuneName End If mobjDetailWork = CType(lobjWork.Clone(), clsWork) Return True End Function Protected Overrides Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As System.Windows.Forms.ListViewItem) As Boolean Dim lobjWork As clsWork Dim lstrReferencedBy As String = "" lobjWork = CType(lstvwItemToDelete.Tag, clsWork) If Not lobjWork.OKToDelete(lstrReferencedBy) Then MessageBox.Show("Can't delete work: " + lobjWork.ToString + ". Currently used by " + lstrReferencedBy + ".", "Unable to delete", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Return False End If Dim ldrDialogResult As DialogResult = MessageBox.Show("Are you sure you want to delete work: " + lobjWork.ToString + "?", "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) If ldrDialogResult = System.Windows.Forms.DialogResult.No Then Return False End If Return True End Function Protected Overrides Function DeleteExistingItem(ByVal lstvwItemToDelete As System.Windows.Forms.ListViewItem) As Boolean Dim lobjWork As clsWork lobjWork = CType(lstvwItemToDelete.Tag, clsWork) Return lobjWork.Delete() End Function Protected Overrides Function SaveNewItem() As Boolean Dim lstrErrorString As String = "" Dim lblnAddedNewComposer As Boolean Dim lblnAddedNewInstrumentation As Boolean Dim lblnAddedNewHymnTuneName As Boolean lblnAddedNewComposer = False lblnAddedNewInstrumentation = False lblnAddedNewHymnTuneName = False Dim objComposer As clsComposer Select Case cboComposerName.Text.ToUpper.Trim Case "" objComposer = Nothing Case Else objComposer = CType(MyGlobals.GetItemFromHashWithStringKey(cboComposerName.Text.ToUpper.Trim, m_objComposersHash), clsComposer) If objComposer Is Nothing Then objComposer = New clsComposer(cboComposerName.Text.Trim) lblnAddedNewComposer = True End If End Select Dim objInstrumentation As clsInstrumentation Select Case cboInstrumentationName.Text.ToUpper.Trim Case "" objInstrumentation = Nothing Case Else objInstrumentation = CType(MyGlobals.GetItemFromHashWithStringKey(cboInstrumentationName.Text.ToUpper.Trim, m_objInstrumentationsHash), clsInstrumentation) If objInstrumentation Is Nothing Then objInstrumentation = New clsInstrumentation(cboInstrumentationName.Text.Trim) lblnAddedNewInstrumentation = True End If End Select Dim objHymnTuneName As clsHymnTuneName Select Case cboHymnTuneName.Text.ToUpper.Trim Case MyGlobals.NONE_STRING.ToUpper, "" objHymnTuneName = Nothing Case Else objHymnTuneName = CType(MyGlobals.GetItemFromHashWithStringKey(cboHymnTuneName.Text.ToUpper.Trim, m_objHymnTuneNamesHash), clsHymnTuneName) If objHymnTuneName Is Nothing Then objHymnTuneName = New clsHymnTuneName(cboHymnTuneName.Text.Trim) lblnAddedNewHymnTuneName = True End If End Select mobjDetailWork.Book = CType(cboBook.SelectedItem, clsBook) mobjDetailWork.PageNumberAsString = txtPageNumber.Text mobjDetailWork.WorkName = txtWorkName.Text mobjDetailWork.Composer = objComposer mobjDetailWork.Instrumentation = objInstrumentation mobjDetailWork.OpusInfo = txtOpusInfo.Text mobjDetailWork.HymnTuneName = objHymnTuneName If Not mobjDetailWork.Validate(lstrErrorString) Then MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning) Return False End If If Not mobjDetailWork.Save() Then Return False End If If lblnAddedNewComposer Then AddComposerToForm(objComposer) End If If lblnAddedNewInstrumentation Then AddInstrumentationToForm(objInstrumentation) End If If lblnAddedNewHymnTuneName Then AddHymnTuneNameToForm(objHymnTuneName) End If Me.ExistingObjectsListItems.Add(ConvertWorkToListViewItem(mobjDetailWork)) Return True End Function Protected Overrides Sub UserRequestedToExit() Me.Close() End Sub Protected Overrides Sub EditOrAddStarting() CType(Me.ParentForm, frmMain).DisableMenus() End Sub Protected Overrides Sub EditOrAddCompleted() CType(Me.ParentForm, frmMain).EnableMenus() End Sub Private Function ConvertWorkToListViewItem(ByVal lobjWork As clsWork) As ListViewItem Dim lobjItem As ListViewItem If lobjWork.Composer Is Nothing Then lobjItem = New ListViewItem("") Else lobjItem = New ListViewItem(lobjWork.Composer.ComposerName) End If lobjItem.SubItems.Add(lobjWork.WorkName) lobjItem.SubItems.Add(lobjWork.Book.ToString) lobjItem.SubItems.Add(lobjWork.PageNumberAsString) If lobjWork.HymnTuneName Is Nothing Then lobjItem.SubItems.Add(MyGlobals.NONE_STRING) Else lobjItem.SubItems.Add(lobjWork.HymnTuneName.HymnTuneName) End If lobjItem.SubItems.Add(lobjWork.Instrumentation.InstrumentationName) 'If lobjWork.HymnTuneName Is Nothing Then ' lobjItem.SubItems.Add(MyGlobals.NONE_STRING) 'Else ' lobjItem.SubItems.Add(lobjWork.HymnTuneName.HymnTuneName) 'End If lobjItem.Tag = lobjWork Return lobjItem End Function Protected Overrides Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As System.Windows.Forms.ListViewItem) As Boolean Dim lstrErrorString As String = "" Dim lblnAddedNewComposer As Boolean Dim lblnAddedNewInstrumentation As Boolean Dim lblnAddedNewHymnTuneName As Boolean lblnAddedNewComposer = False lblnAddedNewInstrumentation = False lblnAddedNewHymnTuneName = False Dim objComposer As clsComposer Select Case cboComposerName.Text.ToUpper.Trim Case "" objComposer = Nothing Case Else objComposer = CType(MyGlobals.GetItemFromHashWithStringKey(cboComposerName.Text.ToUpper.Trim, m_objComposersHash), clsComposer) If objComposer Is Nothing Then objComposer = New clsComposer(cboComposerName.Text.Trim) lblnAddedNewComposer = True End If End Select Dim objInstrumentation As clsInstrumentation Select Case cboInstrumentationName.Text.ToUpper.Trim Case "" objInstrumentation = Nothing Case Else objInstrumentation = CType(MyGlobals.GetItemFromHashWithStringKey(cboInstrumentationName.Text.ToUpper.Trim, m_objInstrumentationsHash), clsInstrumentation) If objInstrumentation Is Nothing Then objInstrumentation = New clsInstrumentation(cboInstrumentationName.Text.Trim) lblnAddedNewInstrumentation = True End If End Select Dim objHymnTuneName As clsHymnTuneName Select Case cboHymnTuneName.Text.ToUpper.Trim Case MyGlobals.NONE_STRING.ToUpper, "" objHymnTuneName = Nothing Case Else objHymnTuneName = CType(MyGlobals.GetItemFromHashWithStringKey(cboHymnTuneName.Text.ToUpper.Trim, m_objHymnTuneNamesHash), clsHymnTuneName) If objHymnTuneName Is Nothing Then objHymnTuneName = New clsHymnTuneName(cboHymnTuneName.Text.Trim) lblnAddedNewHymnTuneName = True End If End Select mobjDetailWork.Book = CType(cboBook.SelectedItem, clsBook) mobjDetailWork.PageNumberAsString = txtPageNumber.Text mobjDetailWork.WorkName = txtWorkName.Text mobjDetailWork.Composer = objComposer mobjDetailWork.Instrumentation = objInstrumentation mobjDetailWork.OpusInfo = txtOpusInfo.Text mobjDetailWork.HymnTuneName = objHymnTuneName If Not mobjDetailWork.Validate(lstrErrorString) Then MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning) Return False End If If Not mobjDetailWork.Save() Then Return False End If If lblnAddedNewComposer Then AddComposerToForm(objComposer) End If If lblnAddedNewInstrumentation Then AddInstrumentationToForm(objInstrumentation) End If If lblnAddedNewHymnTuneName Then AddHymnTuneNameToForm(objHymnTuneName) End If Me.ExistingObjectsListItems.Remove(lstvwExistingItem) Me.ExistingObjectsListItems.Add(ConvertWorkToListViewItem(mobjDetailWork)) Return True End Function Private Sub txtWorkName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtWorkName.TextChanged MyBase.DetailDataHasChanged() End Sub Private Sub cboComposerName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboComposerName.TextChanged MyBase.DetailDataHasChanged() End Sub Private Sub cboInstrumentationName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboInstrumentationName.TextChanged MyBase.DetailDataHasChanged() End Sub Private Sub cboHymnTuneName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboHymnTuneName.TextChanged MyBase.DetailDataHasChanged() End Sub Private Sub txtPageNumber_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtPageNumber.TextChanged MyBase.DetailDataHasChanged() End Sub Private Sub txtOpusInfo_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtOpusInfo.TextChanged MyBase.DetailDataHasChanged() End Sub Private Sub cboBook_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboBook.SelectedIndexChanged MyBase.DetailDataHasChanged() End Sub Private Sub txtPageNumber_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPageNumber.KeyPress If Not MyGlobals.AllowKeypressInNumericTextBox(e.KeyChar) Then e.Handled = True End If End Sub Protected Sub AddComposerToForm(ByVal objComposer As clsComposer) Me.cboComposerName.Items.Add(objComposer.ComposerName) m_objComposersHash.Add(objComposer.ComposerName.ToUpper, objComposer) End Sub Protected Sub AddInstrumentationToForm(ByVal objInstrumentation As clsInstrumentation) Me.cboInstrumentationName.Items.Add(objInstrumentation.InstrumentationName) m_objInstrumentationsHash.Add(objInstrumentation.InstrumentationName.ToUpper, objInstrumentation) End Sub Protected Sub AddHymnTuneNameToForm(ByVal objHymnTuneName As clsHymnTuneName) Me.cboHymnTuneName.Items.Add(objHymnTuneName.HymnTuneName) m_objHymnTuneNamesHash.Add(objHymnTuneName.HymnTuneName.ToUpper, objHymnTuneName) End Sub End Class