Initial population

This commit is contained in:
Jon
2026-03-07 19:38:21 -06:00
commit 46735bddd3
59 changed files with 12911 additions and 0 deletions

428
.gitignore vendored Normal file
View File

@@ -0,0 +1,428 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
*.env
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
[Dd]ebug/x64/
[Dd]ebugPublic/x64/
[Rr]elease/x64/
[Rr]eleases/x64/
bin/x64/
obj/x64/
[Dd]ebug/x86/
[Dd]ebugPublic/x86/
[Rr]elease/x86/
[Rr]eleases/x86/
bin/x86/
obj/x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
[Aa][Rr][Mm]64[Ee][Cc]/
bld/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Build results on 'Bin' directories
**/[Bb]in/*
# Uncomment if you have tasks that rely on *.refresh files to move binaries
# (https://github.com/github/gitignore/pull/3736)
#!**/[Bb]in/*.refresh
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*.trx
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Approval Tests result files
*.received.*
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.idb
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
# but not Directory.Build.rsp, as it configures directory-level build defaults
!Directory.Build.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
**/.paket/paket.exe
paket-files/
# FAKE - F# Make
**/.fake/
# CodeRush personal settings
**/.cr/personal
# Python Tools for Visual Studio (PTVS)
**/__pycache__/
*.pyc
# Cake - Uncomment if you are using it
#tools/**
#!tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
MSBuild_Logs/
# AWS SAM Build and Temporary Artifacts folder
.aws-sam
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
**/.mfractor/
# Local History for Visual Studio
**/.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
**/.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp

81
AADeleteMe.Designer.vb generated Normal file
View File

@@ -0,0 +1,81 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
Partial Class AADeleteMe
Inherits System.Windows.Forms.Form
'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()>
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent()
Me.MenuStrip1 = New System.Windows.Forms.MenuStrip()
Me.Test1ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.Test1SubToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.Test2ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.MenuStrip1.SuspendLayout()
Me.SuspendLayout()
'
'MenuStrip1
'
Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.Test1ToolStripMenuItem, Me.Test2ToolStripMenuItem})
Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
Me.MenuStrip1.Name = "MenuStrip1"
Me.MenuStrip1.Size = New System.Drawing.Size(800, 24)
Me.MenuStrip1.TabIndex = 0
Me.MenuStrip1.Text = "MenuStrip1"
'
'Test1ToolStripMenuItem
'
Me.Test1ToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.Test1SubToolStripMenuItem})
Me.Test1ToolStripMenuItem.Name = "Test1ToolStripMenuItem"
Me.Test1ToolStripMenuItem.Size = New System.Drawing.Size(45, 20)
Me.Test1ToolStripMenuItem.Text = "Test1"
'
'Test1SubToolStripMenuItem
'
Me.Test1SubToolStripMenuItem.Name = "Test1SubToolStripMenuItem"
Me.Test1SubToolStripMenuItem.Size = New System.Drawing.Size(120, 22)
Me.Test1SubToolStripMenuItem.Text = "Test1Sub"
'
'Test2ToolStripMenuItem
'
Me.Test2ToolStripMenuItem.Name = "Test2ToolStripMenuItem"
Me.Test2ToolStripMenuItem.Size = New System.Drawing.Size(45, 20)
Me.Test2ToolStripMenuItem.Text = "Test2"
'
'AADeleteMe
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 15.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(800, 450)
Me.Controls.Add(Me.MenuStrip1)
Me.IsMdiContainer = True
Me.MainMenuStrip = Me.MenuStrip1
Me.Name = "AADeleteMe"
Me.Text = "AADeleteMe"
Me.MenuStrip1.ResumeLayout(False)
Me.MenuStrip1.PerformLayout()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents MenuStrip1 As Windows.Forms.MenuStrip
Friend WithEvents Test1ToolStripMenuItem As Windows.Forms.ToolStripMenuItem
Friend WithEvents Test1SubToolStripMenuItem As Windows.Forms.ToolStripMenuItem
Friend WithEvents Test2ToolStripMenuItem As Windows.Forms.ToolStripMenuItem
End Class

63
AADeleteMe.resx Normal file
View File

@@ -0,0 +1,63 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="MenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

3
AADeleteMe.vb Normal file
View File

@@ -0,0 +1,3 @@
Public Class AADeleteMe
End Class

32
AssemblyInfo.vb Normal file
View File

@@ -0,0 +1,32 @@
Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices
' General Information about an assembly is controlled through the following
' set of attributes. Change these attribute values to modify the information
' associated with an assembly.
' Review the values of the assembly attributes
<Assembly: AssemblyTitle("OrganLit")>
<Assembly: AssemblyDescription("")>
<Assembly: AssemblyCompany("Jon Reuss")>
<Assembly: AssemblyProduct("OrganLit")>
<Assembly: AssemblyCopyright("Copyright 1996-2013")>
<Assembly: AssemblyTrademark("")>
<Assembly: CLSCompliant(True)>
'The following GUID is for the ID of the typelib if this project is exposed to COM
<Assembly: Guid("58B6982D-3388-486A-B1A4-33C0FAEE208D")>
' Version information for an assembly consists of the following four values:
'
' Major Version
' Minor Version
' Build Number
' Revision
'
' You can specify all the values or you can default the Build and Revision Numbers
' by using the '*' as shown below:
<Assembly: AssemblyVersion("1.0.*")>

138
BaseEditForm.resx Normal file
View File

@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AAD///8A7gDu4A7uAO7gDu4A7uAO7uD4Dg+A4PgOD4Dg+A4PgO4P+HD/hw/4cP+HD/hw/4cODwBw8AcP
AHDwBw8AcPAHDg/4cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4
cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4cP+HD/hw/4cP+HD/
hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+H
D/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP
+HD/hw/4cP+HDg8AcP+HD/hw/4cP+HDwBw7g/wD/hw/4cP+HD/hwD/Du4P8A8AcP+HD/hw8AcA/w7u4A
7g/wD/hw/4cA/w7gDu7u7u4P8A8AcPAHAP8O7u7u6Znp4A7g/w4P8O4A7u7u7umZ7u7u4P8OD/Du7u6Z
nu7u6e7umZ4A6eAO6ZnumZ7u7unu7pme7unu7umZ7u6e7u7p7u7unu7p7u7u6e7unu7u6e7u7p7u6e7u
7unu7p7u7u7u7u6enumZ7u7p7pme7u7u7u7ume7pme7u6Znu7u4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
</value>
</data>
</root>

492
BaseEditForm.vb Normal file
View File

@@ -0,0 +1,492 @@
Imports System.Windows.Forms
Public Class BaseEditForm
Inherits Windows.Forms.Form
Enum EditingOrAdding
Editing
Adding
Loading
NoAction
End Enum 'EditingOrAdding
Private mvalEditingOrAdding As EditingOrAdding
Private mintCurrentSortColumn As Integer
Private mobjEditFormExistingItemColumnSortRules() As clsGridColumnSortRule
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Protected WithEvents fraAddEdit As Windows.Forms.GroupBox
Private WithEvents btnEdit As Windows.Forms.Button
Private WithEvents btnDelete As Windows.Forms.Button
Private WithEvents btnSave As Windows.Forms.Button
Private WithEvents btnCancel As Windows.Forms.Button
Private WithEvents btnRevert As Windows.Forms.Button
Private WithEvents btnExit As Windows.Forms.Button
Private WithEvents lvwExistingItemsList As Windows.Forms.ListView
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(BaseEditForm))
Me.btnEdit = New Windows.Forms.Button
Me.btnDelete = New Windows.Forms.Button
Me.btnExit = New Windows.Forms.Button
Me.fraAddEdit = New Windows.Forms.GroupBox
Me.btnRevert = New Windows.Forms.Button
Me.btnCancel = New Windows.Forms.Button
Me.btnSave = New Windows.Forms.Button
Me.lvwExistingItemsList = New Windows.Forms.ListView
Me.fraAddEdit.SuspendLayout()
Me.SuspendLayout()
'
'btnEdit
'
Me.btnEdit.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.btnEdit.Location = New System.Drawing.Point(976, 8)
Me.btnEdit.Name = "btnEdit"
Me.btnEdit.Size = New System.Drawing.Size(96, 24)
Me.btnEdit.TabIndex = 1
Me.btnEdit.Text = "&Edit"
'
'btnDelete
'
Me.btnDelete.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.btnDelete.Location = New System.Drawing.Point(976, 40)
Me.btnDelete.Name = "btnDelete"
Me.btnDelete.Size = New System.Drawing.Size(96, 24)
Me.btnDelete.TabIndex = 2
Me.btnDelete.Text = "&Delete"
'
'btnExit
'
Me.btnExit.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.btnExit.Location = New System.Drawing.Point(976, 72)
Me.btnExit.Name = "btnExit"
Me.btnExit.Size = New System.Drawing.Size(96, 24)
Me.btnExit.TabIndex = 3
Me.btnExit.Text = "E&xit"
'
'fraAddEdit
'
Me.fraAddEdit.Anchor = CType(((Windows.Forms.AnchorStyles.Bottom Or Windows.Forms.AnchorStyles.Left) _
Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.fraAddEdit.Controls.Add(Me.btnRevert)
Me.fraAddEdit.Controls.Add(Me.btnCancel)
Me.fraAddEdit.Controls.Add(Me.btnSave)
Me.fraAddEdit.Location = New System.Drawing.Point(10, 320)
Me.fraAddEdit.Name = "fraAddEdit"
Me.fraAddEdit.Size = New System.Drawing.Size(1064, 272)
Me.fraAddEdit.TabIndex = 4
Me.fraAddEdit.TabStop = False
Me.fraAddEdit.Text = "Add..."
'
'btnRevert
'
Me.btnRevert.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.btnRevert.Location = New System.Drawing.Point(952, 80)
Me.btnRevert.Name = "btnRevert"
Me.btnRevert.Size = New System.Drawing.Size(104, 24)
Me.btnRevert.TabIndex = 2
Me.btnRevert.Text = "&Revert"
'
'btnCancel
'
Me.btnCancel.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.btnCancel.Location = New System.Drawing.Point(952, 48)
Me.btnCancel.Name = "btnCancel"
Me.btnCancel.Size = New System.Drawing.Size(104, 24)
Me.btnCancel.TabIndex = 1
Me.btnCancel.Text = "&Cancel"
'
'btnSave
'
Me.btnSave.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.btnSave.Location = New System.Drawing.Point(952, 16)
Me.btnSave.Name = "btnSave"
Me.btnSave.Size = New System.Drawing.Size(104, 24)
Me.btnSave.TabIndex = 0
Me.btnSave.Text = "&Save"
'
'lvwExistingItemsList
'
Me.lvwExistingItemsList.Anchor = CType(((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Left) _
Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.lvwExistingItemsList.FullRowSelect = True
Me.lvwExistingItemsList.GridLines = True
Me.lvwExistingItemsList.HideSelection = False
Me.lvwExistingItemsList.Location = New System.Drawing.Point(8, 8)
Me.lvwExistingItemsList.MultiSelect = False
Me.lvwExistingItemsList.Name = "lvwExistingItemsList"
Me.lvwExistingItemsList.Size = New System.Drawing.Size(960, 312)
Me.lvwExistingItemsList.TabIndex = 0
Me.lvwExistingItemsList.UseCompatibleStateImageBehavior = False
Me.lvwExistingItemsList.View = Windows.Forms.View.Details
'
'BaseEditForm
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(1080, 598)
Me.Controls.Add(Me.lvwExistingItemsList)
Me.Controls.Add(Me.fraAddEdit)
Me.Controls.Add(Me.btnExit)
Me.Controls.Add(Me.btnDelete)
Me.Controls.Add(Me.btnEdit)
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
Me.MinimumSize = New System.Drawing.Size(848, 568)
Me.Name = "BaseEditForm"
Me.Text = "BaseEditForm"
Me.fraAddEdit.ResumeLayout(False)
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub BaseEditForm_FormClosed(ByVal sender As Object, ByVal e As Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
MyGlobals.FlushCachedObjects()
End Sub
Private Sub BaseEditForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Me.DesignMode Then
MessageBox.Show("The BaseEditForm class must be inherited, and contains methods that must be overridden." + vbCrLf + "They have been declared in the base class and will throw NotImplementedException at runtime if not overridden.")
End If
MyGlobals.FlushCachedObjects()
lvwExistingItemsList.Sorting = SortOrder.None
mintCurrentSortColumn = 0
mvalEditingOrAdding = EditingOrAdding.NoAction
LoadExistingItemsList()
InitializeDetailControls()
EnableDisableControls()
'Dim lobjColumnClickEventArgs As New Windows.Forms.ColumnClickEventArgs(0)
'lvwExistingItemsList_ColumnClick(Me, lobjColumnClickEventArgs)
lvwExistingItemsList.Height = fraAddEdit.Top - lvwExistingItemsList.Top - 10
End Sub
Protected Overridable Sub LoadExistingItemsList()
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Sub
Protected Overridable Sub InitializeDetailControls()
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Sub
Protected Overridable Sub EmptyOutDetailControls()
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Sub
Protected Overridable Function DetailControlsHaveSignificantData() As Boolean
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
Return False
End Function
Protected Overridable Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As ListViewItem) As Boolean
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
Return False
End Function
Protected Overridable Function DeleteExistingItem(ByVal lstvwItemToDelete As ListViewItem) As Boolean
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
Return True
End Function
Protected Overridable Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As ListViewItem) As Boolean
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
Return True
End Function
Protected Overridable Function SaveNewItem() As Boolean
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
Return True
End Function
Protected Overridable Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As ListViewItem) As Boolean
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
Return True
End Function
Protected Overridable Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As ListViewItem) As Boolean
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
Return True
End Function
Protected Overridable Sub SetFocusToFirstDetailControlForEdit()
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Sub
Protected Overridable Sub UserRequestedToExit()
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Sub
Protected Overridable Sub EditOrAddStarting()
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Sub
Protected Overridable Sub EditOrAddCompleted()
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Sub
Protected ReadOnly Property ExistingObjectsListItems() As ListView.ListViewItemCollection
Get
Return lvwExistingItemsList.Items
End Get
End Property
Protected ReadOnly Property ExistingObjectsListColumns() As ListView.ColumnHeaderCollection
Get
Return lvwExistingItemsList.Columns
End Get
End Property
Protected ReadOnly Property GetEditingOrAdding() As EditingOrAdding
Get
Return mvalEditingOrAdding
End Get
End Property
Protected Property MyBaseEditFormColumnSortRules() As clsGridColumnSortRule()
Get
Return mobjEditFormExistingItemColumnSortRules
End Get
Set(ByVal iValue As clsGridColumnSortRule())
mobjEditFormExistingItemColumnSortRules = iValue
End Set
End Property
Private Sub EnableDisableControls()
Select Case mvalEditingOrAdding
Case EditingOrAdding.Loading
Exit Sub
Case EditingOrAdding.Adding, EditingOrAdding.NoAction
If DetailControlsHaveSignificantData() Then
If btnCancel.Enabled = False Then
EditOrAddStarting()
End If
mvalEditingOrAdding = EditingOrAdding.Adding
lvwExistingItemsList.Enabled = False
btnEdit.Enabled = False
btnDelete.Enabled = False
btnExit.Enabled = False
fraAddEdit.Text = "Add..."
btnSave.Enabled = True
btnCancel.Enabled = True
btnRevert.Enabled = False
Else
If btnCancel.Enabled = True Then
EditOrAddCompleted()
End If
mvalEditingOrAdding = EditingOrAdding.NoAction
lvwExistingItemsList.Enabled = True
btnEdit.Enabled = True
btnDelete.Enabled = True
btnExit.Enabled = True
fraAddEdit.Text = "Add..."
btnSave.Enabled = False
btnCancel.Enabled = False
btnRevert.Enabled = False
End If
Case EditingOrAdding.Editing
If btnCancel.Enabled = False Then
EditOrAddStarting()
End If
lvwExistingItemsList.Enabled = False
btnEdit.Enabled = False
btnDelete.Enabled = False
btnExit.Enabled = False
fraAddEdit.Text = "Edit..."
btnCancel.Enabled = True
If DetailControlsHaveDifferentDataThanExistingData(lvwExistingItemsList.SelectedItems(0)) Then
btnSave.Enabled = True
btnRevert.Enabled = True
Else
btnSave.Enabled = False
btnRevert.Enabled = False
End If
End Select
If Not Me.DesignMode Then
If btnCancel.Enabled Then
Me.CancelButton = btnCancel
Else
Me.CancelButton = Nothing
End If
If btnSave.Enabled Then
Me.AcceptButton = btnSave
Else
Me.AcceptButton = Nothing
End If
End If
End Sub
Private Sub btnEdit_Click1(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEdit.Click
DoEditClick()
End Sub
Private Sub btnDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDelete.Click
If lvwExistingItemsList.SelectedItems.Count = 0 Then
MessageBox.Show("Must select an item to delete", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
If ConfirmOKToDeleteExistingItem(lvwExistingItemsList.SelectedItems(0)) Then
If DeleteExistingItem(lvwExistingItemsList.SelectedItems(0)) Then
lvwExistingItemsList.Items.Remove(lvwExistingItemsList.SelectedItems(0))
End If
End If
End Sub
Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
EmptyOutDetailControls()
mvalEditingOrAdding = EditingOrAdding.NoAction
EnableDisableControls()
SetFocusToFirstDetailControlForEdit()
End Sub
Private Sub btnRevert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRevert.Click
LoadExistingDataToDetailControls(lvwExistingItemsList.SelectedItems(0))
SetFocusToFirstDetailControlForEdit()
End Sub
Private Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
If mvalEditingOrAdding = EditingOrAdding.Adding Then
If SaveNewItem() Then
mvalEditingOrAdding = EditingOrAdding.NoAction
EmptyOutDetailControls()
EnableDisableControls()
End If
Else
If SaveNewDataForExistingItem(lvwExistingItemsList.SelectedItems(0)) Then
mvalEditingOrAdding = EditingOrAdding.NoAction
EmptyOutDetailControls()
EnableDisableControls()
End If
End If
SetFocusToFirstDetailControlForEdit()
End Sub
Private Sub DoEditClick()
If lvwExistingItemsList.SelectedItems.Count = 0 Then
MessageBox.Show("Must select an item to edit", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
mvalEditingOrAdding = EditingOrAdding.Loading
If LoadExistingDataToDetailControls(lvwExistingItemsList.SelectedItems(0)) Then
mvalEditingOrAdding = EditingOrAdding.Editing
EnableDisableControls()
Else
mvalEditingOrAdding = EditingOrAdding.NoAction
EmptyOutDetailControls()
Exit Sub
End If
End Sub
Protected Sub DetailDataHasChanged()
EnableDisableControls()
End Sub
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
UserRequestedToExit()
End Sub
Private Sub lvwExistingItemsList_ColumnClick(ByVal sender As System.Object, ByVal e As Windows.Forms.ColumnClickEventArgs) Handles lvwExistingItemsList.ColumnClick
mintCurrentSortColumn = e.Column
lvwExistingItemsList.ListViewItemSorter = New clsGridSorter(e.Column, mobjEditFormExistingItemColumnSortRules)
End Sub
Private Sub lvwExistingItemsList_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lvwExistingItemsList.DoubleClick
DoEditClick()
End Sub
Private Sub BaseEditForm_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
lvwExistingItemsList.Height = fraAddEdit.Top - lvwExistingItemsList.Top - 10
End Sub
Private Sub fraAddEdit_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles fraAddEdit.Resize
lvwExistingItemsList.Height = fraAddEdit.Top - lvwExistingItemsList.Top - 10
End Sub
Private Sub BaseEditForm_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
If mobjEditFormExistingItemColumnSortRules Is Nothing Then
Exit Sub
End If
Dim intSavedSortColumn As Integer = mintCurrentSortColumn
'If there is more than one column, temporarily sort by some other column
'This is because, when first shown, for some reason, it was sorting only by the first
'column, with no subsorts. I'm not sure if this is because .NET thinks that we're already
'sorted by the first column.
If mobjEditFormExistingItemColumnSortRules.Length > 1 Then
Dim intTempSortColumn As Integer
If mintCurrentSortColumn = 0 Then
intTempSortColumn = 1
Else
intTempSortColumn = 0
End If
Dim lobjTempColumnClickEventArgs As New Windows.Forms.ColumnClickEventArgs(intTempSortColumn)
lvwExistingItemsList_ColumnClick(Me, lobjTempColumnClickEventArgs)
End If
'Sort by the current column
Dim lobjColumnClickEventArgs As New Windows.Forms.ColumnClickEventArgs(intSavedSortColumn)
lvwExistingItemsList_ColumnClick(Me, lobjColumnClickEventArgs)
End Sub
Public Sub ExistingItemsListSuspendLayout()
lvwExistingItemsList.SuspendLayout()
End Sub
Public Sub ExistingItemsListResumeLayout()
lvwExistingItemsList.ResumeLayout()
End Sub
End Class

138
BaseQueryForm.resx Normal file
View File

@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AAD///8A7gDu4A7uAO7gDu4A7uAO7uD4Dg+A4PgOD4Dg+A4PgO4P+HD/hw/4cP+HD/hw/4cODwBw8AcP
AHDwBw8AcPAHDg/4cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4
cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4cP+HD/hw/4cP+HD/
hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+H
D/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP
+HD/hw/4cP+HDg8AcP+HD/hw/4cP+HDwBw7g/wD/hw/4cP+HD/hwD/Du4P8A8AcP+HD/hw8AcA/w7u4A
7g/wD/hw/4cA/w7gDu7u7u4P8A8AcPAHAP8O7u7u6Znp4A7g/w4P8O4A7u7u7umZ7u7u4P8OD/Du7u6Z
nu7u6e7umZ4A6eAO6ZnumZ7u7unu7pme7unu7umZ7u6e7u7p7u7unu7p7u7u6e7unu7u6e7u7p7u6e7u
7unu7p7u7u7u7u6enumZ7u7p7pme7u7u7u7ume7pme7u6Znu7u4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
</value>
</data>
</root>

294
BaseQueryForm.vb Normal file
View File

@@ -0,0 +1,294 @@
Imports System.Windows.Forms
Public Class BaseQueryForm
Inherits Windows.Forms.Form
Private mintCurrentQueryBySortColumn As Integer
Private mintCurrentReportSortColumn As Integer
Private mobjQueryFormQueryByItemColumnSortRules() As clsGridColumnSortRule
Private mobjQueryFormReportItemColumnSortRules() As clsGridColumnSortRule
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Private WithEvents btnExit As Windows.Forms.Button
Protected WithEvents fraReport As Windows.Forms.GroupBox
Private WithEvents lvwReportItemsList As Windows.Forms.ListView
Friend WithEvents fraQueryBy As Windows.Forms.GroupBox
Private WithEvents lvwQueryByItemsList As Windows.Forms.ListView
Friend WithEvents fraOtherQueryParms As Windows.Forms.GroupBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(BaseQueryForm))
Me.btnExit = New Windows.Forms.Button
Me.fraReport = New Windows.Forms.GroupBox
Me.lvwReportItemsList = New Windows.Forms.ListView
Me.fraQueryBy = New Windows.Forms.GroupBox
Me.lvwQueryByItemsList = New Windows.Forms.ListView
Me.fraOtherQueryParms = New Windows.Forms.GroupBox
Me.fraReport.SuspendLayout()
Me.fraQueryBy.SuspendLayout()
Me.SuspendLayout()
'
'btnExit
'
Me.btnExit.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.btnExit.Location = New System.Drawing.Point(976, 16)
Me.btnExit.Name = "btnExit"
Me.btnExit.Size = New System.Drawing.Size(96, 24)
Me.btnExit.TabIndex = 2
Me.btnExit.Text = "E&xit"
'
'fraReport
'
Me.fraReport.Anchor = CType(((Windows.Forms.AnchorStyles.Bottom Or Windows.Forms.AnchorStyles.Left) _
Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.fraReport.Controls.Add(Me.lvwReportItemsList)
Me.fraReport.Location = New System.Drawing.Point(10, 320)
Me.fraReport.Name = "fraReport"
Me.fraReport.Size = New System.Drawing.Size(1064, 272)
Me.fraReport.TabIndex = 1
Me.fraReport.TabStop = False
Me.fraReport.Text = "Add..."
'
'lvwReportItemsList
'
Me.lvwReportItemsList.Anchor = CType((((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Bottom) _
Or Windows.Forms.AnchorStyles.Left) _
Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.lvwReportItemsList.FullRowSelect = True
Me.lvwReportItemsList.GridLines = True
Me.lvwReportItemsList.HideSelection = False
Me.lvwReportItemsList.Location = New System.Drawing.Point(8, 16)
Me.lvwReportItemsList.MultiSelect = False
Me.lvwReportItemsList.Name = "lvwReportItemsList"
Me.lvwReportItemsList.Size = New System.Drawing.Size(960, 312)
Me.lvwReportItemsList.TabIndex = 0
Me.lvwReportItemsList.UseCompatibleStateImageBehavior = False
Me.lvwReportItemsList.View = Windows.Forms.View.Details
'
'fraQueryBy
'
Me.fraQueryBy.Anchor = CType(((Windows.Forms.AnchorStyles.Bottom Or Windows.Forms.AnchorStyles.Left) _
Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.fraQueryBy.Controls.Add(Me.lvwQueryByItemsList)
Me.fraQueryBy.Controls.Add(Me.fraOtherQueryParms)
Me.fraQueryBy.Location = New System.Drawing.Point(10, 10)
Me.fraQueryBy.Name = "fraQueryBy"
Me.fraQueryBy.Size = New System.Drawing.Size(958, 302)
Me.fraQueryBy.TabIndex = 0
Me.fraQueryBy.TabStop = False
Me.fraQueryBy.Text = "Query By"
'
'lvwQueryByItemsList
'
Me.lvwQueryByItemsList.Anchor = CType((((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Bottom) _
Or Windows.Forms.AnchorStyles.Left) _
Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.lvwQueryByItemsList.FullRowSelect = True
Me.lvwQueryByItemsList.GridLines = True
Me.lvwQueryByItemsList.HideSelection = False
Me.lvwQueryByItemsList.Location = New System.Drawing.Point(8, 16)
Me.lvwQueryByItemsList.MultiSelect = False
Me.lvwQueryByItemsList.Name = "lvwQueryByItemsList"
Me.lvwQueryByItemsList.Size = New System.Drawing.Size(944, 200)
Me.lvwQueryByItemsList.TabIndex = 0
Me.lvwQueryByItemsList.UseCompatibleStateImageBehavior = False
Me.lvwQueryByItemsList.View = Windows.Forms.View.Details
'
'fraOtherQueryParms
'
Me.fraOtherQueryParms.Anchor = CType(((Windows.Forms.AnchorStyles.Bottom Or Windows.Forms.AnchorStyles.Left) _
Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles)
Me.fraOtherQueryParms.Location = New System.Drawing.Point(8, 216)
Me.fraOtherQueryParms.Name = "fraOtherQueryParms"
Me.fraOtherQueryParms.Size = New System.Drawing.Size(944, 75)
Me.fraOtherQueryParms.TabIndex = 1
Me.fraOtherQueryParms.TabStop = False
'
'BaseQueryForm
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(1080, 598)
Me.Controls.Add(Me.fraQueryBy)
Me.Controls.Add(Me.fraReport)
Me.Controls.Add(Me.btnExit)
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
Me.MinimumSize = New System.Drawing.Size(848, 568)
Me.Name = "BaseQueryForm"
Me.Text = "BaseQueryForm"
Me.fraReport.ResumeLayout(False)
Me.fraQueryBy.ResumeLayout(False)
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub BaseQueryForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Me.DesignMode Then
MessageBox.Show("The BaseQueryForm class must be inherited, and contains methods that must be overridden." + vbCrLf + "They have been declared in the base class and will throw NotImplementedException at runtime if not overridden.")
End If
lvwQueryByItemsList.Sorting = SortOrder.None
lvwReportItemsList.Sorting = SortOrder.None
LoadQueryByItemsList()
InitializeReportControls()
Dim lobjQueryByColumnClickEventArgs As New Windows.Forms.ColumnClickEventArgs(0)
lvwQueryByItemsList_ColumnClick(Me, lobjQueryByColumnClickEventArgs)
Dim lobjReportColumnClickEventArgs As New Windows.Forms.ColumnClickEventArgs(0)
lvwReportItemsList_ColumnClick(Me, lobjReportColumnClickEventArgs)
fraQueryBy.Height() = fraReport.Top - fraQueryBy.Top - 10
If fraOtherQueryParms.Controls.Count > 0 Then
fraOtherQueryParms.Visible = False
lvwQueryByItemsList.Height = fraQueryBy.Height - 10
Else
lvwQueryByItemsList.Height = fraOtherQueryParms.Top - 10
End If
lvwReportItemsList.Height = fraReport.Height - 10
End Sub
Protected Overridable Sub LoadQueryByItemsList()
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Sub
Protected Overridable Sub InitializeReportControls()
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Sub
Protected Overridable Function ReportOnQueryByItem(ByVal lstvwQueryByItem As ListViewItem) As Boolean
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Function
Protected Overridable Function UserWantsDetailOnResult(ByVal lstvwResultItem As ListViewItem) As Boolean
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Function
Protected Overridable Sub UserRequestedToExit()
If Not Me.DesignMode Then
Throw New NotImplementedException
End If
End Sub
Protected ReadOnly Property QueryByListItems() As ListView.ListViewItemCollection
Get
Return lvwQueryByItemsList.Items
End Get
End Property
Protected ReadOnly Property QueryByListColumns() As ListView.ColumnHeaderCollection
Get
Return lvwQueryByItemsList.Columns
End Get
End Property
Protected Property MyBaseQueryFormQueryByColumnSortRules() As clsGridColumnSortRule()
Get
Return mobjQueryFormQueryByItemColumnSortRules
End Get
Set(ByVal iValue As clsGridColumnSortRule())
mobjQueryFormQueryByItemColumnSortRules = iValue
End Set
End Property
Protected ReadOnly Property ReportListItems() As ListView.ListViewItemCollection
Get
Return lvwReportItemsList.Items
End Get
End Property
Protected ReadOnly Property ReportListColumns() As ListView.ColumnHeaderCollection
Get
Return lvwReportItemsList.Columns
End Get
End Property
Protected Property MyBaseQueryFormReportColumnSortRules() As clsGridColumnSortRule()
Get
Return mobjQueryFormReportItemColumnSortRules
End Get
Set(ByVal iValue As clsGridColumnSortRule())
mobjQueryFormReportItemColumnSortRules = iValue
End Set
End Property
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
UserRequestedToExit()
End Sub
Private Sub lvwQueryByItemsList_ColumnClick(ByVal sender As System.Object, ByVal e As Windows.Forms.ColumnClickEventArgs)
mintCurrentQueryBySortColumn = e.Column
lvwQueryByItemsList.ListViewItemSorter = New clsGridSorter(e.Column, mobjQueryFormQueryByItemColumnSortRules)
End Sub
Private Sub lvwQueryByItemsList_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
DoReportClick()
End Sub
Private Sub lvwReportItemsList_ColumnClick(ByVal sender As System.Object, ByVal e As Windows.Forms.ColumnClickEventArgs) Handles lvwReportItemsList.ColumnClick
mintCurrentReportSortColumn = e.Column
lvwReportItemsList.ListViewItemSorter = New clsGridSorter(e.Column, mobjQueryFormReportItemColumnSortRules)
End Sub
Private Sub lvwReportItemsList_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lvwReportItemsList.DoubleClick
DoUserWantsDetailOnResult()
End Sub
Private Sub DoReportClick()
If lvwQueryByItemsList.SelectedItems.Count = 0 Then
MessageBox.Show("Must select an item to query by", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
ReportOnQueryByItem(lvwQueryByItemsList.SelectedItems(0))
'Check if there are results - if so show them
' - if not hide them
If lvwReportItemsList.Items.Count = 0 Then
lvwReportItemsList.Visible = False
Else
lvwReportItemsList.Visible = True
End If
End Sub
Private Sub DoUserWantsDetailOnResult()
If lvwReportItemsList.SelectedItems.Count = 0 Then
MessageBox.Show("Must select an item to show details results for", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
UserWantsDetailOnResult(lvwReportItemsList.SelectedItems(0))
End Sub
End Class

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MySubMain>true</MySubMain>
<MainForm>Form1</MainForm>
<SingleInstance>false</SingleInstance>
<ShutdownMode>0</ShutdownMode>
<EnableVisualStyles>true</EnableVisualStyles>
<AuthenticationMode>0</AuthenticationMode>
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
</MyApplicationData>

109
MyGlobals.vb Normal file
View File

@@ -0,0 +1,109 @@
Imports System.Data.SqlClient
Imports System.IO
Imports System.Xml.Xsl
Imports System.Collections.Generic
Imports System.Windows.Forms
Public Class MyGlobals
Public Shared g_objDatabaseLayer As clsDatabaseLayer
Public Shared g_objCachedObjects As Hashtable
Public Shared g_objObjectTypesCached As New List(Of String)
Public Const COMPOSER_NAME_SIZE As Integer = 60
Public Const PUBLISHER_NAME_SIZE As Integer = 60
Public Const PUBLISHER_STREAMING_ALLOWED_SIZE As Integer = 7
Public Const HYMNAL_NAME_SIZE As Integer = 60
Public Const HYMNAL_ABBREVIATION_SIZE As Integer = 10
Public Const BOOK_TITLE_SIZE As Integer = 120
Public Const HYMN_TUNE_NAME_SIZE As Integer = 60
Public Const HYMN_NAME_SIZE As Integer = 120
Public Const WORK_NAME_SIZE As Integer = 150
Public Const OPUS_INFO_SIZE As Integer = 50
Public Const INSTRUMENTATION_NAME_SIZE As Integer = 60
Public Const COLLECTION_STRING As String = "(Collection)"
Public Const NONE_STRING As String = "(None)"
Public Const PUBLISHER_STREAMING_ALLOWED_UNKNOWN As String = "Unknown"
Public Shared Function GetItemFromHashWithStringKey(ByVal strKeyValue As String, ByVal objHash As Hashtable) As Object
If objHash.ContainsKey(strKeyValue) Then
Return objHash.Item(strKeyValue)
Else
Return Nothing
End If
End Function
Public Shared Sub FlushCachedObjects()
If g_objCachedObjects Is Nothing Then
g_objCachedObjects = New Hashtable
Else
g_objCachedObjects.Clear()
End If
g_objObjectTypesCached.Clear()
End Sub
Public Shared Sub AddCachedObject(ByRef objObject As Object, ByVal strKeyValue As String)
If g_objCachedObjects Is Nothing Then
FlushCachedObjects()
End If
If g_objCachedObjects.ContainsKey(strKeyValue) Then
g_objCachedObjects.Remove(strKeyValue)
End If
g_objCachedObjects.Add(strKeyValue, objObject)
End Sub
Public Shared Sub RemoveCachedObject(ByVal strKeyValue As String)
If g_objCachedObjects Is Nothing Then
FlushCachedObjects()
End If
If g_objCachedObjects.ContainsKey(strKeyValue) Then
g_objCachedObjects.Remove(strKeyValue)
End If
End Sub
Public Shared Function CachedObjectExists(ByVal strKeyValue As String) As Boolean
If g_objCachedObjects Is Nothing Then
FlushCachedObjects()
End If
Return g_objCachedObjects.ContainsKey(strKeyValue)
End Function
Public Shared Function CachedObjectRetrieve(ByVal strKeyValue As String) As Object
If g_objCachedObjects Is Nothing Then
FlushCachedObjects()
End If
Return GetItemFromHashWithStringKey(strKeyValue, g_objCachedObjects)
End Function
Public Shared Function AllowKeypressInNumericTextBox(ByVal sChar As Char) As Boolean
If Not Char.IsDigit(sChar) Then
Select Case Asc(sChar)
Case 8, 3, 24 '8=Backspace,3=ctrlC,24=ctrlX
'Let these through
Case 22 '22=ctrlV
If Clipboard.GetDataObject.GetDataPresent("System.String", True) Then
Dim sClipboardText As String
sClipboardText = Clipboard.GetDataObject.GetData("System.String", True).ToString
Dim sCharInClipboard As Char
For Each sCharInClipboard In sClipboardText
If Not Char.IsDigit(sCharInClipboard) Then
'There is a non-digit in the clipboard - don't allow the paste
Return False
End If
Next
Else
Return False
End If
Case Else
Return False
End Select
End If
Return True
End Function
End Class

BIN
ORGANLIT.ICO Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

6
OrganLit.exe.config Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="XSLLocations" value="F:\VBDOTNETPROJECTS\OrganLit\" />
</appSettings>
</configuration>

24
OrganLit.sln Normal file
View File

@@ -0,0 +1,24 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.33122.133
MinimumVisualStudioVersion = 10.0.40219.1
Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "OrganLit", "OrganLit.vbproj", "{77265D90-970B-4B0E-A99F-974E4EA852D0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{77265D90-970B-4B0E-A99F-974E4EA852D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{77265D90-970B-4B0E-A99F-974E4EA852D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{77265D90-970B-4B0E-A99F-974E4EA852D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{77265D90-970B-4B0E-A99F-974E4EA852D0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {01F7DDB8-06D9-492A-A62A-DDBA84268474}
EndGlobalSection
EndGlobal

81
OrganLit.vbproj Normal file
View File

@@ -0,0 +1,81 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework>
<ProjectType>Local</ProjectType>
<ApplicationIcon>ORGANLIT.ICO</ApplicationIcon>
<AssemblyKeyContainerName></AssemblyKeyContainerName>
<AssemblyOriginatorKeyFile></AssemblyOriginatorKeyFile>
<AssemblyOriginatorKeyMode>None</AssemblyOriginatorKeyMode>
<DefaultClientScript>JScript</DefaultClientScript>
<DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
<DefaultTargetSchema>IE50</DefaultTargetSchema>
<DelaySign>false</DelaySign>
<OutputType>WinExe</OutputType>
<OptionStrict>On</OptionStrict>
<StartupObject>OrganLit.frmMain</StartupObject>
<MyType>WindowsFormsWithCustomSubMain</MyType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWindowsForms>true</UseWindowsForms>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
<Deterministic>false</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DocumentationFile>OrganLit.xml</DocumentationFile>
<BaseAddress>285212672</BaseAddress>
<ConfigurationOverrideFile></ConfigurationOverrideFile>
<DefineConstants></DefineConstants>
<RegisterForComInterop>false</RegisterForComInterop>
<RemoveIntegerChecks>false</RemoveIntegerChecks>
<NoWarn>42016,42017,42018,42019,42032,42353,42354,42355</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DocumentationFile>OrganLit.xml</DocumentationFile>
<BaseAddress>285212672</BaseAddress>
<ConfigurationOverrideFile></ConfigurationOverrideFile>
<DefineConstants></DefineConstants>
<DefineDebug>false</DefineDebug>
<RegisterForComInterop>false</RegisterForComInterop>
<RemoveIntegerChecks>false</RemoveIntegerChecks>
<NoWarn>42016,42017,42018,42019,42032,42353,42354,42355</NoWarn>
<DebugType>none</DebugType>
</PropertyGroup>
<ItemGroup>
<Reference Include="combotypeahead">
<HintPath>References\combotypeahead.dll</HintPath>
</Reference>
<Reference Update="System">
<Name>System</Name>
</Reference>
<Reference Update="System.Data">
<Name>System.Data</Name>
</Reference>
<Reference Update="System.Drawing">
<Name>System.Drawing</Name>
</Reference>
<Reference Update="System.Xml">
<Name>System.XML</Name>
</Reference>
</ItemGroup>
<ItemGroup>
<Import Include="System.Drawing" />
</ItemGroup>
<ItemGroup>
<Content Include="ORGANLIT.ICO" />
<Content Include="OrganLitHymnTuneBased.xsl" />
<Content Include="OrganLitIndexByBook.xsl" />
<Content Include="OrganLitIndexByComposer.xsl" />
<Content Include="OrganLitIndexByHymn.xsl" />
<Content Include="OrganLitIndexByHymnTuneName.xsl" />
<Content Include="OrganLitNonHymnTuneBased.xsl" />
<Content Include="OrganLitWorksByBook.xsl" />
<Content Include="OrganLitWorksByComposer.xsl" />
</ItemGroup>
<ItemGroup>
<Folder Include="bin\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualBasic" Version="10.3.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.2" />
</ItemGroup>
<PropertyGroup />
</Project>

149
OrganLitHymnTuneBased.xsl Normal file
View File

@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html" version="4.01" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>OrganLit - Hymn Tune Names, Hymns and Works</title>
</head>
<body>
<h1>Hymn Tune Names, Hymns and Works</h1>
<xsl:for-each select="//OrganLit/HymnTunes/HymnTune">
<xsl:call-template name="FormatHymnTune"/>
</xsl:for-each>
<br/>
<br/>
<a href="index.htm">OrganLit Home</a>
</body>
</html>
</xsl:template>
<xsl:template name="FormatHymnTune">
<p>
<a name="#{current()/HymnTuneID}"/>
<xsl:choose>
<xsl:when test="count(../../HymnTuneNames/HymnTuneName[HymnTuneID=current()/HymnTuneID])>1">
<br><b><xsl:text>Tune Name (with potential alternate names or spellings):</xsl:text></b></br>
<xsl:for-each select="../../HymnTuneNames/HymnTuneName[HymnTuneID=current()/HymnTuneID]">
<xsl:sort select="HymnTuneName"/>
<xsl:call-template name="FormatHymnTuneNameMultiple"/>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="../../HymnTuneNames/HymnTuneName[HymnTuneID=current()/HymnTuneID]">
<xsl:call-template name="FormatHymnTuneNameSingle"/>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(../../Hymns/Hymn[HymnTuneName/HymnTuneID=current()/HymnTuneID])>1">
<br><b><xsl:text>Hymn(s):</xsl:text></b></br>
<xsl:for-each select="../../Hymns/Hymn[HymnTuneName/HymnTuneID=current()/HymnTuneID]">
<xsl:sort select="current()/HymnalAbbreviation"/>
<xsl:sort select="HymnNumber" data-type="number"/>
<xsl:call-template name="FormatHymnMultiple"/>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="../../Hymns/Hymn[HymnTuneName/HymnTuneID=current()/HymnTuneID]">
<xsl:call-template name="FormatHymnSingle"/>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="count(../../Works/Work[HymnTuneName/HymnTuneID=current()/HymnTuneID])>0">
<br><b>Work(s):</b></br>
</xsl:if>
<xsl:for-each select="../../Works/Work[HymnTuneName/HymnTuneID=current()/HymnTuneID]">
<xsl:sort select="Instrumentation/InstrumentationName"/>
<xsl:sort select="Composer/ComposerName"/>
<xsl:sort select="WorkName"/>
<xsl:sort select="Book/BookTitle"/>
<xsl:sort select="Book/Composer/ComposerName"/>
<xsl:sort select="Book/PageNumber" data-type="number"/>
<xsl:call-template name="FormatWorks"/>
</xsl:for-each>
</p>
</xsl:template>
<xsl:template name="FormatHymnTuneNameSingle">
<br><b><xsl:text>Tune Name: </xsl:text><xsl:value-of select="HymnTuneName"/></b></br>
</xsl:template>
<xsl:template name="FormatHymnTuneNameMultiple">
<br><b><xsl:text> </xsl:text><xsl:value-of select="HymnTuneName"/></b></br>
</xsl:template>
<xsl:template name="FormatHymnSingle">
<br><b><xsl:text>Hymn: </xsl:text><xsl:value-of select="Hymnal/HymnalAbbreviation"/><xsl:value-of select="HymnNumber"/><xsl:text> </xsl:text><xsl:value-of select="HymnName"/></b></br>
</xsl:template>
<xsl:template name="FormatHymnMultiple">
<br><b><xsl:text> </xsl:text><xsl:value-of select="Hymnal/HymnalAbbreviation"/><xsl:value-of select="HymnNumber"/><xsl:text> </xsl:text><xsl:value-of select="HymnName"/></b></br>
</xsl:template>
<xsl:template name="FormatWorks">
<br>
<xsl:value-of select="Composer/ComposerName"/>
<xsl:text> </xsl:text>
<xsl:text>&quot;</xsl:text><xsl:value-of select="WorkName"/>
<xsl:if test="OpusInfo!=''"><xsl:text> - </xsl:text><xsl:value-of select="OpusInfo"/></xsl:if>
<xsl:text>&quot;</xsl:text>
<xsl:text> </xsl:text>
<xsl:variable name="WorkComposerID" select="current()/ComposerID"/>
<xsl:for-each select="Book">
<xsl:call-template name="FormatBookTitleAndLocation">
<xsl:with-param name="WorkComposerID" select="$WorkComposerID"/>
</xsl:call-template>
</xsl:for-each>
<xsl:choose>
<xsl:when test="PageNumber=''"/>
<xsl:when test="PageNumber='0'"/>
<xsl:otherwise>
<xsl:text> p. </xsl:text><xsl:value-of select="PageNumber"/>
</xsl:otherwise>
</xsl:choose>
<i>
<xsl:text> (</xsl:text>
<xsl:value-of select="current()/Instrumentation/InstrumentationName"/>
<xsl:text>)</xsl:text>
</i>
</br>
<br/>
</xsl:template>
<xsl:template name="FormatBookTitleAndLocation">
<xsl:param name="WorkComposerID"/>
<i><xsl:value-of select="BookTitle"/></i><xsl:text> </xsl:text>
<xsl:choose>
<xsl:when test="ComposerID=''">
<xsl:choose>
<xsl:when test="PublisherID=''">
<xsl:text>(Collection)</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>(Collection - </xsl:text><xsl:value-of select="Publisher/PublisherName"/><xsl:text>)</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:if test="ComposerID!=$WorkComposerID">
<xsl:text>(filed under </xsl:text>
<xsl:value-of select="current()/Composer/ComposerName"/>
<xsl:text>)</xsl:text>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="PublisherStreamingAllowed=''">
<xsl:text> - Publisher Streaming Allowed Unknown</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> - Publisher Streaming Allowed </xsl:text><xsl:value-of select="Publisher/PublisherStreamingAllowed"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

View File

@@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html" version="4.01" encoding="UTF-8" indent="yes"/>
<xsl:param name="HymnTuneID"/>
<xsl:template match="/">
<html>
<head>
<title>OrganLit - Hymn Tune Names, Hymns and Works</title>
</head>
<body>
<h1>Hymn Tune Names, Hymns and Works</h1>
<xsl:for-each select="//OrganLit/HymnTunes/HymnTune[HymnTuneID=$HymnTuneID]">
<xsl:call-template name="FormatHymnTune"/>
</xsl:for-each>
<br/>
<br/>
<a href="index.htm">OrganLit Home</a>
</body>
</html>
</xsl:template>
<xsl:template name="FormatHymnTune">
<p>
<a name="#{current()/HymnTuneID}"/>
<xsl:choose>
<xsl:when test="count(../../HymnTuneNames/HymnTuneName[HymnTuneID=current()/HymnTuneID])>1">
<br><b><xsl:text>Tune Name (with potential alternate names or spellings):</xsl:text></b></br>
<xsl:for-each select="../../HymnTuneNames/HymnTuneName[HymnTuneID=current()/HymnTuneID]">
<xsl:sort select="HymnTuneName"/>
<xsl:call-template name="FormatHymnTuneNameMultiple"/>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="../../HymnTuneNames/HymnTuneName[HymnTuneID=current()/HymnTuneID]">
<xsl:call-template name="FormatHymnTuneNameSingle"/>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="count(../../Hymns/Hymn[HymnTuneName/HymnTuneID=current()/HymnTuneID])>1">
<br/><br><b><xsl:text>Hymn(s):</xsl:text></b></br>
<xsl:for-each select="../../Hymns/Hymn[HymnTuneName/HymnTuneID=current()/HymnTuneID]">
<xsl:sort select="current()/HymnalAbbreviation"/>
<xsl:sort select="HymnNumber" data-type="number"/>
<xsl:call-template name="FormatHymnMultiple"/>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="../../Hymns/Hymn[HymnTuneName/HymnTuneID=current()/HymnTuneID]">
<xsl:call-template name="FormatHymnSingle"/>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="count(../../Works/Work[HymnTuneName/HymnTuneID=current()/HymnTuneID])>0">
<br/><br><b>Work(s):</b></br>
</xsl:if>
<xsl:for-each select="../../Works/Work[HymnTuneName/HymnTuneID=current()/HymnTuneID]">
<xsl:sort select="Instrumentation/InstrumentationName"/>
<xsl:sort select="Composer/ComposerName"/>
<xsl:sort select="WorkName"/>
<xsl:sort select="Book/BookTitle"/>
<xsl:sort select="Book/Composer/ComposerName"/>
<xsl:sort select="Book/PageNumber" data-type="number"/>
<xsl:call-template name="FormatWorks"/>
</xsl:for-each>
</p>
<br/>
</xsl:template>
<xsl:template name="FormatHymnTuneNameSingle">
<br><b><xsl:text>Tune Name: </xsl:text><xsl:value-of select="HymnTuneName"/></b></br>
</xsl:template>
<xsl:template name="FormatHymnTuneNameMultiple">
<br><b><xsl:text> </xsl:text><xsl:value-of select="HymnTuneName"/></b></br>
</xsl:template>
<xsl:template name="FormatHymnSingle">
<br><b><xsl:text>Hymn: </xsl:text><xsl:value-of select="Hymnal/HymnalAbbreviation"/><xsl:value-of select="HymnNumber"/><xsl:text> </xsl:text><xsl:value-of select="HymnName"/></b></br>
</xsl:template>
<xsl:template name="FormatHymnMultiple">
<br><b><xsl:text> </xsl:text><xsl:value-of select="Hymnal/HymnalAbbreviation"/><xsl:value-of select="HymnNumber"/><xsl:text> </xsl:text><xsl:value-of select="HymnName"/></b></br>
</xsl:template>
<xsl:template name="FormatWorks">
<br>
<xsl:value-of select="Composer/ComposerName"/>
<xsl:text> </xsl:text>
<xsl:text>&quot;</xsl:text><xsl:value-of select="WorkName"/>
<xsl:if test="OpusInfo!=''"><xsl:text> - </xsl:text><xsl:value-of select="OpusInfo"/></xsl:if>
<xsl:text>&quot;</xsl:text>
<xsl:text> </xsl:text>
<xsl:variable name="WorkComposerID" select="current()/ComposerID"/>
<xsl:for-each select="Book">
<xsl:call-template name="FormatBookTitleAndLocation">
<xsl:with-param name="WorkComposerID" select="$WorkComposerID"/>
</xsl:call-template>
</xsl:for-each>
<xsl:choose>
<xsl:when test="PageNumber=''"/>
<xsl:when test="PageNumber='0'"/>
<xsl:otherwise>
<xsl:text> p. </xsl:text><xsl:value-of select="PageNumber"/>
</xsl:otherwise>
</xsl:choose>
<i>
<xsl:text> (</xsl:text>
<xsl:value-of select="current()/Instrumentation/InstrumentationName"/>
<xsl:text>)</xsl:text>
</i>
</br>
<br/>
</xsl:template>
<xsl:template name="FormatBookTitleAndLocation">
<xsl:param name="WorkComposerID"/>
<i><xsl:value-of select="BookTitle"/></i><xsl:text> </xsl:text>
<xsl:choose>
<xsl:when test="ComposerID=''">
<xsl:choose>
<xsl:when test="PublisherID=''">
<xsl:text>(Collection)</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>(Collection - </xsl:text><xsl:value-of select="Publisher/PublisherName"/><xsl:text>)</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:if test="ComposerID!=$WorkComposerID">
<xsl:text>(filed under </xsl:text>
<xsl:value-of select="current()/Composer/ComposerName"/>
<xsl:text>)</xsl:text>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="PublisherStreamingAllowed=''">
<xsl:text> - Publisher Streaming Allowed Unknown</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> - Publisher Streaming Allowed </xsl:text><xsl:value-of select="Publisher/PublisherStreamingAllowed"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

51
OrganLitIndexByBook.xsl Normal file
View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html" version="4.01" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>OrganLit - Index By Book</title>
</head>
<body>
<h1>Index By Book</h1>
<xsl:for-each select="//OrganLit/Books/Book">
<xsl:sort select="Composer/ComposerName"/>
<xsl:sort select="current()[Composer/ComposerName='']/Publisher/PublisherName"/>
<xsl:sort select="BookTitle"/>
<xsl:call-template name="FormatBook"/>
</xsl:for-each>
<br/>
<br/>
<a href="index.htm">OrganLit Home</a>
</body>
</html>
</xsl:template>
<xsl:template name="FormatBook">
<br>
<a href="worksbybook.htm#{BookID}">
<xsl:call-template name="FormatBookTitleAndLocation"/>
</a>
</br>
</xsl:template>
<xsl:template name="FormatBookTitleAndLocation">
<i><xsl:value-of select="BookTitle"/></i><xsl:text> </xsl:text>
<xsl:choose>
<xsl:when test="ComposerID=''">
<xsl:choose>
<xsl:when test="PublisherID=''">
<xsl:text>(Collection)</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>(Collection - </xsl:text><xsl:value-of select="Publisher/PublisherName"/><xsl:text>)</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="current()/Composer/ComposerName"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html" version="4.01" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>OrganLit - Index By Composer</title>
</head>
<body>
<h1>Index By Composer</h1>
<xsl:for-each select="//OrganLit/Composers/Composer">
<xsl:sort select="ComposerName"/>
<xsl:call-template name="FormatComposer"/>
</xsl:for-each>
<br/>
<br/>
<a href="index.htm">OrganLit Home</a>
</body>
</html>
</xsl:template>
<xsl:template name="FormatComposer">
<br>
<a href="worksbycomposer.htm#{ComposerID}">
<xsl:value-of select="ComposerName"/>
</a>
</br>
</xsl:template>
</xsl:stylesheet>

41
OrganLitIndexByHymn.xsl Normal file
View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html" version="4.01" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>OrganLit - Index By Hymn</title>
</head>
<body>
<h1>Index By Hymn</h1>
<xsl:for-each select="//OrganLit/Hymnals/Hymnal">
<xsl:sort select="HymnalName"/>
<xsl:call-template name="FormatHymnal"/>
</xsl:for-each>
<br/>
<br/>
<a href="index.htm">OrganLit Home</a>
</body>
</html>
</xsl:template>
<xsl:template name="FormatHymnal">
<p><b><xsl:value-of select="current()/HymnalName"/></b></p>
<xsl:for-each select="../../Hymns/Hymn[HymnalID=current()/HymnalID]">
<xsl:sort select="HymnNumber" data-type="number"/>
<xsl:call-template name="FormatHymn"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="FormatHymn">
<br>
<a href="hymntuneworks-{current()/HymnTuneName/HymnTuneID}.htm">
<xsl:value-of select="current()/Hymnal/HymnalAbbreviation"/>
<xsl:value-of select="current()/HymnNumber"/>
<xsl:text> </xsl:text>
<xsl:value-of select="current()/HymnName"/>
</a>
</br>
</xsl:template>
</xsl:stylesheet>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html" version="4.01" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>OrganLit - Index By Hymn Tune Name</title>
</head>
<body>
<h1>Index By Hymn Tune Name</h1>
<xsl:for-each select="//OrganLit/HymnTuneNames/HymnTuneName">
<xsl:sort select="HymnTuneName"/>
<xsl:call-template name="FormatHymnTuneName"/>
</xsl:for-each>
<br/>
<br/>
<a href="index.htm">OrganLit Home</a>
</body>
</html>
</xsl:template>
<xsl:template name="FormatHymnTuneName">
<br><a href="hymntuneworks-{current()/HymnTuneID}.htm"><xsl:value-of select="current()/HymnTuneName"/></a></br>
</xsl:template>
</xsl:stylesheet>

View File

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html" version="4.01" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>OrganLit - Non-Hymn-Tune-Based Works By Composer</title>
</head>
<body>
<h1>Organ Works Not based on HymnTunes</h1>
<xsl:for-each select="//OrganLit/Composers/Composer">
<xsl:sort select="ComposerName"/>
<xsl:call-template name="FormatComposer">
<xsl:with-param name="ComposerID" select="./ComposerID">
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
<br/>
<br/>
<a href="index.htm">OrganLit Home</a>
</body>
</html>
</xsl:template>
<xsl:template name="FormatComposer">
<xsl:param name="ComposerID"/>
<xsl:if test="count(../../Works/Work[ComposerID=$ComposerID and HymnTuneNameID=''])>0">
<p><b><xsl:value-of select="ComposerName"/></b>
<xsl:for-each select="../../Works/Work[ComposerID=$ComposerID and HymnTuneNameID='']">
<xsl:sort select="WorkName"/>
<xsl:sort select="Book/BookTitle"/>
<xsl:sort select="Book/Composer/ComposerName"/>
<xsl:sort select="Book/PageNumber" data-type="number"/>
<xsl:call-template name="FormatWorksForComposer">
<xsl:with-param name="WorkComposerID" select="$ComposerID"/>
</xsl:call-template>
</xsl:for-each>
</p>
</xsl:if>
</xsl:template>
<xsl:template name="FormatWorksForComposer">
<xsl:param name="WorkComposerID"/>
<br><xsl:text>&quot;</xsl:text><xsl:value-of select="WorkName"/>
<xsl:if test="OpusInfo!=''"><xsl:text> - </xsl:text><xsl:value-of select="OpusInfo"/></xsl:if>
<xsl:text>&quot;</xsl:text>
<xsl:text> </xsl:text>
<xsl:for-each select="current()/Book">
<xsl:call-template name="FormatBookTitleAndLocation">
<xsl:with-param name="WorkComposerID" select="$WorkComposerID"/>
</xsl:call-template>
</xsl:for-each>
<xsl:choose>
<xsl:when test="PageNumber=''"/>
<xsl:when test="PageNumber='0'"/>
<xsl:otherwise>
<xsl:text> p. </xsl:text><xsl:value-of select="PageNumber"/>
</xsl:otherwise>
</xsl:choose>
<i>
<xsl:text> (</xsl:text>
<xsl:value-of select="current()/Instrumentation/InstrumentationName"/>
<xsl:text>)</xsl:text>
</i>
</br>
<br/>
</xsl:template>
<xsl:template name="FormatBookTitleAndLocation">
<xsl:param name="WorkComposerID"/>
<i><xsl:value-of select="BookTitle"/></i><xsl:text> </xsl:text>
<xsl:choose>
<xsl:when test="ComposerID=''">
<xsl:choose>
<xsl:when test="PublisherID=''">
<xsl:text>(Collection)</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>(Collection - </xsl:text><xsl:value-of select="Publisher/PublisherName"/><xsl:text>)</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:if test="ComposerID!=$WorkComposerID">
<xsl:text>(filed under </xsl:text>
<xsl:value-of select="current()/Composer/ComposerName"/>
<xsl:text>)</xsl:text>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="PublisherStreamingAllowed=''">
<xsl:text> - Publisher Streaming Allowed Unknown</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> - Publisher Streaming Allowed </xsl:text><xsl:value-of select="Publisher/PublisherStreamingAllowed"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

84
OrganLitWorksByBook.xsl Normal file
View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html" version="4.01" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>OrganLit - Works By Book</title>
</head>
<body>
<h1>Works By Book</h1>
<xsl:for-each select="//OrganLit/Books/Book">
<xsl:sort select="Composer/ComposerName"/>
<xsl:sort select="current()[Composer/ComposerName='']/Publisher/PublisherName"/>
<xsl:sort select="BookTitle"/>
<xsl:call-template name="FormatBook"/>
</xsl:for-each>
<br/>
<br/>
<a href="index.htm">OrganLit Home</a>
</body>
</html>
</xsl:template>
<xsl:template name="FormatBook">
<p>
<br><b>
<a name="{current()/BookID}"/>
<xsl:call-template name="FormatBookTitleAndLocation"/>
</b></br>
<xsl:for-each select="../../Works/Work[BookID=current()/BookID]">
<xsl:sort select="PageNumber" data-type="number"/>
<xsl:call-template name="FormatWorks"/>
</xsl:for-each>
</p>
</xsl:template>
<xsl:template name="FormatWorks">
<br>
<xsl:choose>
<xsl:when test="PageNumber=''"/>
<xsl:when test="PageNumber='0'"/>
<xsl:otherwise>
<xsl:text> p. </xsl:text><xsl:value-of select="PageNumber"/><xsl:text> </xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:text>&quot;</xsl:text><xsl:value-of select="WorkName"/>
<xsl:if test="OpusInfo!=''"><xsl:text> - </xsl:text><xsl:value-of select="OpusInfo"/></xsl:if>
<xsl:text>&quot;</xsl:text>
<xsl:text> </xsl:text>
<xsl:if test="ComposerID!=current()/Book/ComposerID">
<xsl:value-of select="Composer/ComposerName"/>
<xsl:text> </xsl:text>
</xsl:if>
</br>
</xsl:template>
<xsl:template name="FormatBookTitleAndLocation">
<i><xsl:value-of select="BookTitle"/></i><xsl:text> </xsl:text>
<xsl:choose>
<xsl:when test="ComposerID=''">
<xsl:choose>
<xsl:when test="PublisherID=''">
<xsl:text>(Collection)</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>(Collection - </xsl:text><xsl:value-of select="Publisher/PublisherName"/><xsl:text>)</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="current()/Composer/ComposerName"/>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="PublisherStreamingAllowed=''">
<xsl:text> - Publisher Streaming Allowed Unknown</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> - Publisher Streaming Allowed </xsl:text><xsl:value-of select="Publisher/PublisherStreamingAllowed"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

View File

@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html" version="4.01" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>OrganLit - Works By Composer</title>
</head>
<body>
<h1>Works By Composer</h1>
<xsl:for-each select="//OrganLit/Composers/Composer">
<xsl:sort select="ComposerName"/>
<xsl:call-template name="FormatComposer"/>
</xsl:for-each>
<br/>
<br/>
<a href="index.htm">OrganLit Home</a>
</body>
</html>
</xsl:template>
<xsl:template name="FormatComposer">
<p>
<a name="{current()/ComposerID}"/>
<br><b><xsl:value-of select="ComposerName"/></b></br>
<xsl:for-each select="../../Works/Work[ComposerID=current()/ComposerID]">
<xsl:sort select="WorkName"/>
<xsl:sort select="Book/BookTitle"/>
<xsl:sort select="Book/Composer/ComposerName"/>
<xsl:sort select="Book/PageNumber" data-type="number"/>
<xsl:call-template name="FormatWorks"/>
</xsl:for-each>
</p>
</xsl:template>
<xsl:template name="FormatWorks">
<br>
<xsl:text>&quot;</xsl:text><xsl:value-of select="WorkName"/>
<xsl:if test="OpusInfo!=''"><xsl:text> - </xsl:text><xsl:value-of select="OpusInfo"/></xsl:if>
<xsl:text>&quot;</xsl:text>
<xsl:text> </xsl:text>
<xsl:variable name="WorkComposerID" select="current()/ComposerID"/>
<xsl:for-each select="current()/Book">
<xsl:call-template name="FormatBookTitleAndLocation">
<xsl:with-param name="WorkComposerID" select="$WorkComposerID"/>
</xsl:call-template>
</xsl:for-each>
<xsl:choose>
<xsl:when test="PageNumber=''"/>
<xsl:when test="PageNumber='0'"/>
<xsl:otherwise>
<xsl:text> p. </xsl:text><xsl:value-of select="PageNumber"/>
</xsl:otherwise>
</xsl:choose>
</br>
<br/>
</xsl:template>
<xsl:template name="FormatBookTitleAndLocation">
<xsl:param name="WorkComposerID"/>
<i><xsl:value-of select="BookTitle"/></i><xsl:text> </xsl:text>
<xsl:choose>
<xsl:when test="ComposerID=''">
<xsl:choose>
<xsl:when test="PublisherID=''">
<xsl:text>(Collection)</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>(Collection - </xsl:text><xsl:value-of select="Publisher/PublisherName"/><xsl:text>)</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:if test="ComposerID!=$WorkComposerID">
<xsl:text>(filed under </xsl:text>
<xsl:value-of select="current()/Composer/ComposerName"/>
<xsl:text>)</xsl:text>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="PublisherStreamingAllowed=''">
<xsl:text> - Publisher Streaming Allowed Unknown</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> - Publisher Streaming Allowed </xsl:text><xsl:value-of select="Publisher/PublisherStreamingAllowed"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

Binary file not shown.

23
app.config Normal file
View File

@@ -0,0 +1,23 @@
<?xml version="1.0"?>
<configuration>
<system.diagnostics>
<sources>
<!-- This section defines the logging configuration for My.Application.Log -->
<source name="DefaultSource" switchName="DefaultSwitch">
<listeners>
<add name="FileLog"/>
<!-- Uncomment the below section to write to the Application Event Log -->
<!--<add name="EventLog"/>-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information"/>
</switches>
<sharedListeners>
<add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter"/>
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/></startup></configuration>

553
clsBook.vb Normal file
View File

@@ -0,0 +1,553 @@
Imports System.Data
Imports System.Text
Imports System.Windows.Forms
Imports System.Xml
Public Class clsBook
Implements ICloneable
Private mguidBookID As Guid
Private m_objComposer As clsComposer
Private m_objInstrumentation As clsInstrumentation
Private m_strBookTitle As String
Private m_objPublisher As clsPublisher
Private m_blnObjectAlreadyPersisted As Boolean
Public Sub New()
mguidBookID = Guid.NewGuid
m_objComposer = Nothing
m_objInstrumentation = Nothing
m_strBookTitle = ""
m_objPublisher = Nothing
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal objComposer As clsComposer, ByVal strBookTitle As String, ByVal objInstrumentation As clsInstrumentation, ByVal objPublisher As clsPublisher)
mguidBookID = Guid.NewGuid
m_objComposer = objComposer
m_objInstrumentation = objInstrumentation
m_strBookTitle = strBookTitle
m_objPublisher = objPublisher
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal guidBookID As Guid)
mguidBookID = guidBookID
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_book"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmBookID As New SqlClient.SqlParameter
prmBookID.ParameterName = "@book_id"
prmBookID.SqlDbType = SqlDbType.UniqueIdentifier
'prmBookID.Size = 5
prmBookID.Value = guidBookID
ldbcmdCommand.Parameters.Add(prmBookID)
Dim ldbdsBooks As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsBooks.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsBooks.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.BookID.ToString)
End If
ldbdsBooks.Clear()
End Sub
Public Sub New(ByVal ldbrwRow As DataRow)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.BookID.ToString)
End Sub
Private Sub PopulateFromDBRow(ByVal ldbrwRow As DataRow)
mguidBookID = CType(ldbrwRow.Item("book_id"), Guid)
If ldbrwRow.IsNull("composer_id") Then
m_objComposer = Nothing
Else
Dim guidComposerID As Guid = CType(ldbrwRow.Item("composer_id"), Guid)
If MyGlobals.CachedObjectExists(guidComposerID.ToString) Then
m_objComposer = CType(MyGlobals.CachedObjectRetrieve(guidComposerID.ToString), clsComposer)
Else
m_objComposer = New clsComposer(guidComposerID)
End If
End If
If ldbrwRow.IsNull("instrumentation_id") Then
m_objInstrumentation = Nothing
Else
Dim guidInstrumentationID As Guid = CType(ldbrwRow.Item("instrumentation_id"), Guid)
If MyGlobals.CachedObjectExists(guidInstrumentationID.ToString) Then
m_objInstrumentation = CType(MyGlobals.CachedObjectRetrieve(guidInstrumentationID.ToString), clsInstrumentation)
Else
m_objInstrumentation = New clsInstrumentation(guidInstrumentationID)
End If
End If
m_strBookTitle = CType(ldbrwRow.Item("book_title"), String)
If ldbrwRow.IsNull("publisher_id") Then
m_objPublisher = Nothing
Else
Dim guidPublisherID As Guid = CType(ldbrwRow.Item("publisher_id"), Guid)
If MyGlobals.CachedObjectExists(guidPublisherID.ToString) Then
m_objPublisher = CType(MyGlobals.CachedObjectRetrieve(guidPublisherID.ToString), clsPublisher)
Else
m_objPublisher = New clsPublisher(guidPublisherID)
End If
End If
End Sub
Public Function Delete() As Boolean
Try
MyGlobals.RemoveCachedObject(Me.BookID.ToString)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "del_book"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmBookID As New SqlClient.SqlParameter
prmBookID.ParameterName = "@book_id"
prmBookID.SqlDbType = SqlDbType.UniqueIdentifier
'prmBookID.Size = 5
prmBookID.Value = mguidBookID
ldbcmdCommand.Parameters.Add(prmBookID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Catch
Return False
End Try
End Function
Public Function Save() As Boolean
Try
If Not m_objComposer Is Nothing Then
If Not m_objComposer.ItemAlreadyPersisted Then
m_objComposer.Save()
End If
End If
If Not m_objInstrumentation Is Nothing Then
If Not m_objInstrumentation.ItemAlreadyPersisted Then
m_objInstrumentation.Save()
End If
End If
If Not m_objPublisher Is Nothing Then
If Not m_objPublisher.ItemAlreadyPersisted Then
m_objPublisher.Save()
End If
End If
MyGlobals.AddCachedObject(Me, Me.BookID.ToString)
If m_blnObjectAlreadyPersisted Then
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "upd_book"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmBookID As New SqlClient.SqlParameter
prmBookID.ParameterName = "@book_id"
prmBookID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
prmBookID.Value = mguidBookID
ldbcmdCommand.Parameters.Add(prmBookID)
' Set up parameter for stored procedure
Dim prmComposerID As New SqlClient.SqlParameter
prmComposerID.ParameterName = "@composer_id"
prmComposerID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
If m_objComposer Is Nothing Then
prmComposerID.Value = DBNull.Value
Else
prmComposerID.Value = m_objComposer.ComposerID
End If
ldbcmdCommand.Parameters.Add(prmComposerID)
' Set up parameter for stored procedure
Dim prmInstrumentationID As New SqlClient.SqlParameter
prmInstrumentationID.ParameterName = "@instrumentation_id"
prmInstrumentationID.SqlDbType = SqlDbType.UniqueIdentifier
'prmInstrumentationID.Size = 5
If m_objInstrumentation Is Nothing Then
prmInstrumentationID.Value = DBNull.Value
Else
prmInstrumentationID.Value = m_objInstrumentation.InstrumentationID
End If
ldbcmdCommand.Parameters.Add(prmInstrumentationID)
' Set up parameter for stored procedure
Dim prmBookTitle As New SqlClient.SqlParameter
prmBookTitle.ParameterName = "@book_title"
prmBookTitle.SqlDbType = SqlDbType.VarChar
prmBookTitle.Size = MyGlobals.BOOK_TITLE_SIZE
prmBookTitle.Value = m_strBookTitle
ldbcmdCommand.Parameters.Add(prmBookTitle)
' Set up parameter for stored procedure
Dim prmPublisherID As New SqlClient.SqlParameter
prmPublisherID.ParameterName = "@publisher_id"
prmPublisherID.SqlDbType = SqlDbType.UniqueIdentifier
'prmPublisherID.Size = 5
If m_objPublisher Is Nothing Then
prmPublisherID.Value = DBNull.Value
Else
prmPublisherID.Value = m_objPublisher.PublisherID
End If
ldbcmdCommand.Parameters.Add(prmPublisherID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Else
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "ins_book"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmBookID As New SqlClient.SqlParameter
prmBookID.ParameterName = "@book_id"
prmBookID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
prmBookID.Value = mguidBookID
ldbcmdCommand.Parameters.Add(prmBookID)
' Set up parameter for stored procedure
Dim prmComposerID As New SqlClient.SqlParameter
prmComposerID.ParameterName = "@composer_id"
prmComposerID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
If m_objComposer Is Nothing Then
prmComposerID.Value = DBNull.Value
Else
prmComposerID.Value = m_objComposer.ComposerID
End If
ldbcmdCommand.Parameters.Add(prmComposerID)
' Set up parameter for stored procedure
Dim prmInstrumentationID As New SqlClient.SqlParameter
prmInstrumentationID.ParameterName = "@instrumentation_id"
prmInstrumentationID.SqlDbType = SqlDbType.UniqueIdentifier
'prmInstrumentationID.Size = 5
If m_objInstrumentation Is Nothing Then
prmInstrumentationID.Value = DBNull.Value
Else
prmInstrumentationID.Value = m_objInstrumentation.InstrumentationID
End If
ldbcmdCommand.Parameters.Add(prmInstrumentationID)
' Set up parameter for stored procedure
Dim prmBookTitle As New SqlClient.SqlParameter
prmBookTitle.ParameterName = "@book_title"
prmBookTitle.SqlDbType = SqlDbType.VarChar
prmBookTitle.Size = MyGlobals.BOOK_TITLE_SIZE
prmBookTitle.Value = m_strBookTitle
ldbcmdCommand.Parameters.Add(prmBookTitle)
' Set up parameter for stored procedure
Dim prmPublisherID As New SqlClient.SqlParameter
prmPublisherID.ParameterName = "@publisher_id"
prmPublisherID.SqlDbType = SqlDbType.UniqueIdentifier
'prmPublisherID.Size = 5
If m_objPublisher Is Nothing Then
prmPublisherID.Value = DBNull.Value
Else
prmPublisherID.Value = m_objPublisher.PublisherID
End If
ldbcmdCommand.Parameters.Add(prmPublisherID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = True
Return True
Else
Return False
End If
End If
Catch e As SqlClient.SqlException
MessageBox.Show(e.Message)
Return False
Catch
Return False
End Try
End Function
Public Property BookID() As Guid
Get
Return mguidBookID
End Get
Set(ByVal Value As Guid)
mguidBookID = Value
End Set
End Property
Public Property Composer() As clsComposer
Get
Return m_objComposer
End Get
Set(ByVal Value As clsComposer)
m_objComposer = Value
End Set
End Property
Public Property Instrumentation() As clsInstrumentation
Get
Return m_objInstrumentation
End Get
Set(ByVal Value As clsInstrumentation)
m_objInstrumentation = Value
End Set
End Property
Public Property BookTitle() As String
Get
Return m_strBookTitle
End Get
Set(ByVal Value As String)
m_strBookTitle = Value.Trim
End Set
End Property
Public Property Publisher() As clsPublisher
Get
Return m_objPublisher
End Get
Set(ByVal Value As clsPublisher)
m_objPublisher = Value
End Set
End Property
Public Property ItemAlreadyPersisted() As Boolean
Get
Return m_blnObjectAlreadyPersisted
End Get
Set(ByVal Value As Boolean)
m_blnObjectAlreadyPersisted = Value
End Set
End Property
Public Function Clone() As Object Implements ICloneable.Clone
Dim lobjReturnValue As New clsBook
lobjReturnValue.BookID = Me.BookID
lobjReturnValue.Composer = Me.Composer
lobjReturnValue.Instrumentation = Me.Instrumentation
lobjReturnValue.BookTitle = Me.BookTitle
lobjReturnValue.Publisher = Me.Publisher
lobjReturnValue.ItemAlreadyPersisted = Me.ItemAlreadyPersisted
Return lobjReturnValue
End Function
Public Function StateIsIdentical(ByVal lobjOtherBook As clsBook) As Boolean
Dim blnResult As Boolean
If Me.BookID.Equals(lobjOtherBook.BookID) _
AndAlso Me.BookTitle = lobjOtherBook.BookTitle Then
blnResult = True
If Me.Composer Is Nothing Then
If lobjOtherBook.Composer Is Nothing Then
'OK
Else
Return False
End If
Else
If lobjOtherBook.Composer Is Nothing Then
Return False
Else
blnResult = Me.Composer.ComposerID.Equals(lobjOtherBook.Composer.ComposerID)
End If
End If
If Not blnResult Then
Return False
End If
If Me.Instrumentation Is Nothing Then
If lobjOtherBook.Instrumentation Is Nothing Then
'OK
Else
Return False
End If
Else
If lobjOtherBook.Instrumentation Is Nothing Then
Return False
Else
blnResult = Me.Instrumentation.InstrumentationID.Equals(lobjOtherBook.Instrumentation.InstrumentationID)
End If
End If
If Not blnResult Then
Return False
End If
If Me.Publisher Is Nothing Then
If lobjOtherBook.Publisher Is Nothing Then
'OK
Else
Return False
End If
Else
If lobjOtherBook.Publisher Is Nothing Then
Return False
Else
blnResult = Me.Publisher.PublisherID.Equals(lobjOtherBook.Publisher.PublisherID)
End If
End If
Else
Return False
End If
Return blnResult
End Function
Public Function Validate(ByRef lstrErrorString As String) As Boolean
lstrErrorString = ""
If Me.BookTitle.Length = 0 Then
lstrErrorString = "Book Title is required"
Return False
End If
If Me.Publisher Is Nothing Then
lstrErrorString = "Publisher is required"
Return False
End If
Return True
End Function
Public Function OKToDelete(ByRef lstrReferencedByString As String) As Boolean
Dim lblnReturnValue As Boolean
lblnReturnValue = True
lstrReferencedByString = ""
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_book_isreferenced"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmBookID As New SqlClient.SqlParameter
prmBookID.ParameterName = "@book_id"
prmBookID.SqlDbType = SqlDbType.UniqueIdentifier
'prmBookID.Size = 5
prmBookID.Value = mguidBookID
ldbcmdCommand.Parameters.Add(prmBookID)
Dim ldbdsBooks As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsBooks.Tables(0).Rows.Count > 0 Then
lblnReturnValue = False
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsBooks.Tables(0).Rows
If Not ldbrwRow.IsNull("table_referencing_instance") Then
If lstrReferencedByString.Length = 0 Then
lstrReferencedByString = CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
Else
lstrReferencedByString = lstrReferencedByString + " and " + CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
End If
End If
Next
End If
ldbdsBooks.Clear()
Return lblnReturnValue
End Function
Public Overrides Function ToString() As String
Dim strReturnString As New StringBuilder
If m_objComposer Is Nothing Then
strReturnString.Append(MyGlobals.COLLECTION_STRING)
Else
strReturnString.Append(m_objComposer.ComposerName)
End If
strReturnString.Append(" - ")
strReturnString.Append(m_strBookTitle)
Return strReturnString.ToString
End Function
Public Sub WriteXML(ByRef objXMLWriter As XmlTextWriter)
objXMLWriter.WriteStartElement("Book")
objXMLWriter.WriteElementString("BookID", Me.BookID.ToString)
objXMLWriter.WriteElementString("BookTitle", Me.BookTitle)
If Me.Composer Is Nothing Then
objXMLWriter.WriteElementString("ComposerID", "")
Else
objXMLWriter.WriteElementString("ComposerID", Me.Composer.ComposerID.ToString)
Me.Composer.WriteXML(objXMLWriter)
End If
If Me.Instrumentation Is Nothing Then
objXMLWriter.WriteElementString("InstrumentationID", "")
Else
objXMLWriter.WriteElementString("InstrumentationID", Me.Instrumentation.InstrumentationID.ToString)
Me.Instrumentation.WriteXML(objXMLWriter)
End If
objXMLWriter.WriteElementString("BookPublisherID", Me.Publisher.PublisherID.ToString)
Me.Publisher.WriteXML(objXMLWriter)
objXMLWriter.WriteEndElement()
End Sub
Public Shared Function GetAllBooks() As System.Collections.Generic.List(Of clsBook)
'Preload to cache
clsComposer.AddAllComposersToCache()
clsInstrumentation.AddAllInstrumentationsToCache()
clsPublisher.AddAllPublishersToCache()
Dim lguidBookID As Guid
Dim ldbcmdCommand As New SqlClient.SqlCommand
Dim lobjBook As clsBook
Dim lcolBooks As New System.Collections.Generic.List(Of clsBook)
ldbcmdCommand.CommandText = "sel_book_all"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
Dim ldbdsBooks As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsBooks.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsBooks.Tables(0).Rows
lguidBookID = CType(ldbrwRow.Item("book_id"), Guid)
If MyGlobals.CachedObjectExists(lguidBookID.ToString) Then
lobjBook = CType(MyGlobals.CachedObjectRetrieve(lguidBookID.ToString), clsBook)
Else
'lobjBook = New clsBook(lguidBookID)
lobjBook = New clsBook(ldbrwRow)
End If
lcolBooks.Add(lobjBook)
Next
End If
ldbdsBooks.Clear()
Return lcolBooks
End Function
Public Shared Sub AddAllBooksToCache()
If MyGlobals.g_objObjectTypesCached.Contains("Books") = False Then
GetAllBooks()
MyGlobals.g_objObjectTypesCached.Add("Books")
End If
End Sub
End Class

371
clsComposer.vb Normal file
View File

@@ -0,0 +1,371 @@
Imports System.Data
Imports System.Xml
Public Class clsComposer
Implements ICloneable
Private mguidComposerID As Guid
Private mstrComposerName As String
Private m_blnObjectAlreadyPersisted As Boolean
Public Sub New()
mguidComposerID = Guid.NewGuid
mstrComposerName = ""
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal lstrComposerName As String)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_composer_by_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmComposerName As New SqlClient.SqlParameter
prmComposerName.ParameterName = "@composer_name"
prmComposerName.SqlDbType = SqlDbType.VarChar
prmComposerName.Size = MyGlobals.COMPOSER_NAME_SIZE
prmComposerName.Value = lstrComposerName
ldbcmdCommand.Parameters.Add(prmComposerName)
Dim ldbdsComposers As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsComposers.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsComposers.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
ldbdsComposers.Clear()
m_blnObjectAlreadyPersisted = True
Else
ldbdsComposers.Clear()
mguidComposerID = Guid.NewGuid
mstrComposerName = lstrComposerName.Trim
m_blnObjectAlreadyPersisted = False
End If
End Sub
Public Sub New(ByVal lguidComposerID As Guid)
mguidComposerID = lguidComposerID
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_composer"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmComposerID As New SqlClient.SqlParameter
prmComposerID.ParameterName = "@composer_id"
prmComposerID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
prmComposerID.Value = lguidComposerID
ldbcmdCommand.Parameters.Add(prmComposerID)
Dim ldbdsComposers As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsComposers.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsComposers.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.ComposerID.ToString)
End If
ldbdsComposers.Clear()
End Sub
Public Sub New(ByVal ldbrwRow As DataRow)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.ComposerID.ToString)
End Sub
Private Sub PopulateFromDBRow(ByVal ldbrwRow As DataRow)
mguidComposerID = CType(ldbrwRow.Item("composer_id"), Guid)
mstrComposerName = CType(ldbrwRow.Item("composer_name"), String)
End Sub
Public Function Delete() As Boolean
Try
MyGlobals.RemoveCachedObject(Me.ComposerID.ToString)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "del_composer"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmComposerID As New SqlClient.SqlParameter
prmComposerID.ParameterName = "@composer_id"
prmComposerID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
prmComposerID.Value = mguidComposerID
ldbcmdCommand.Parameters.Add(prmComposerID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = False
Return True
Else
Return False
End If
Catch
Return False
End Try
End Function
Public Function Save() As Boolean
Try
MyGlobals.AddCachedObject(Me, Me.ComposerID.ToString)
If m_blnObjectAlreadyPersisted Then
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "upd_composer"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmComposerID As New SqlClient.SqlParameter
prmComposerID.ParameterName = "@composer_id"
prmComposerID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
prmComposerID.Value = mguidComposerID
ldbcmdCommand.Parameters.Add(prmComposerID)
' Set up parameter for stored procedure
Dim prmComposerName As New SqlClient.SqlParameter
prmComposerName.ParameterName = "@composer_name"
prmComposerName.SqlDbType = SqlDbType.VarChar
prmComposerName.Size = MyGlobals.COMPOSER_NAME_SIZE
prmComposerName.Value = mstrComposerName
ldbcmdCommand.Parameters.Add(prmComposerName)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Else
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "ins_composer"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmComposerID As New SqlClient.SqlParameter
prmComposerID.ParameterName = "@composer_id"
prmComposerID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
prmComposerID.Value = mguidComposerID
ldbcmdCommand.Parameters.Add(prmComposerID)
' Set up parameter for stored procedure
Dim prmComposerName As New SqlClient.SqlParameter
prmComposerName.ParameterName = "@composer_name"
prmComposerName.SqlDbType = SqlDbType.VarChar
prmComposerName.Size = MyGlobals.COMPOSER_NAME_SIZE
prmComposerName.Value = mstrComposerName
ldbcmdCommand.Parameters.Add(prmComposerName)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = True
Return True
Else
Return False
End If
End If
Catch
Return False
End Try
End Function
Public Function DuplicateExists(ByVal lstrComposerNameToCheck As String) As Boolean
Try
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_composer_by_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmComposerName As New SqlClient.SqlParameter
prmComposerName.ParameterName = "@composer_name"
prmComposerName.SqlDbType = SqlDbType.VarChar
prmComposerName.Size = MyGlobals.COMPOSER_NAME_SIZE
prmComposerName.Value = lstrComposerNameToCheck
ldbcmdCommand.Parameters.Add(prmComposerName)
Dim ldbdsComposers As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsComposers.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsComposers.Tables(0).Rows
If mguidComposerID.Equals(CType(ldbrwRow.Item("composer_id"), Guid)) Then
'OK
Else
ldbdsComposers.Clear()
Return True
End If
Next
End If
ldbdsComposers.Clear()
Return False
Catch
Return False
End Try
End Function
Public Property ComposerID() As Guid
Get
Return mguidComposerID
End Get
Set(ByVal lguidValue As Guid)
mguidComposerID = lguidValue
End Set
End Property
Public Property ComposerName() As String
Get
Return mstrComposerName
End Get
Set(ByVal sValue As String)
mstrComposerName = sValue.Trim
End Set
End Property
Public Property ItemAlreadyPersisted() As Boolean
Get
Return m_blnObjectAlreadyPersisted
End Get
Set(ByVal Value As Boolean)
m_blnObjectAlreadyPersisted = Value
End Set
End Property
Public Function Clone() As Object Implements ICloneable.Clone
Dim lobjReturnValue As New clsComposer
lobjReturnValue.ComposerID = Me.ComposerID
lobjReturnValue.ComposerName = Me.ComposerName
lobjReturnValue.ItemAlreadyPersisted = Me.ItemAlreadyPersisted
Return lobjReturnValue
End Function
Public Function StateIsIdentical(ByVal lobjOtherComposer As clsComposer) As Boolean
If Me.ComposerID.Equals(lobjOtherComposer.ComposerID) _
AndAlso Me.ComposerName = lobjOtherComposer.ComposerName Then
Return True
Else
Return False
End If
End Function
Public Function Validate(ByRef lstrErrorString As String) As Boolean
lstrErrorString = ""
If Me.ComposerName.Length = 0 Then
lstrErrorString = "Composer Name is required"
Return False
End If
If Me.DuplicateExists(Me.ComposerName) Then
lstrErrorString = "Given Composer Name already exists"
Return False
End If
Return True
End Function
Public Function OKToDelete(ByRef lstrReferencedByString As String) As Boolean
Dim lblnReturnValue As Boolean
lblnReturnValue = True
lstrReferencedByString = ""
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_composer_isreferenced"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmComposerID As New SqlClient.SqlParameter
prmComposerID.ParameterName = "@composer_id"
prmComposerID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
prmComposerID.Value = mguidComposerID
ldbcmdCommand.Parameters.Add(prmComposerID)
Dim ldbdsComposers As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsComposers.Tables(0).Rows.Count > 0 Then
lblnReturnValue = False
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsComposers.Tables(0).Rows
If Not ldbrwRow.IsNull("table_referencing_instance") Then
If lstrReferencedByString.Length = 0 Then
lstrReferencedByString = CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
Else
lstrReferencedByString = lstrReferencedByString + " and " + CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
End If
End If
Next
End If
ldbdsComposers.Clear()
Return lblnReturnValue
End Function
Public Overrides Function ToString() As String
Return mstrComposerName
End Function
Public Sub WriteXML(ByRef objXMLWriter As XmlTextWriter)
objXMLWriter.WriteStartElement("Composer")
objXMLWriter.WriteElementString("ComposerID", Me.ComposerID.ToString)
objXMLWriter.WriteElementString("ComposerName", Me.ComposerName)
objXMLWriter.WriteEndElement()
End Sub
Public Shared Function GetAllComposers() As System.Collections.Generic.List(Of clsComposer)
Dim lguidComposerID As Guid
Dim ldbcmdCommand As New SqlClient.SqlCommand
Dim lobjComposer As clsComposer
Dim lcolComposers As New System.Collections.Generic.List(Of clsComposer)
ldbcmdCommand.CommandText = "sel_composer_all"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
Dim ldbdsComposers As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsComposers.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsComposers.Tables(0).Rows
lguidComposerID = CType(ldbrwRow.Item("composer_id"), Guid)
If MyGlobals.CachedObjectExists(lguidComposerID.ToString) Then
lobjComposer = CType(MyGlobals.CachedObjectRetrieve(lguidComposerID.ToString), clsComposer)
Else
'lobjComposer = New clsComposer(lguidComposerID)
lobjComposer = New clsComposer(ldbrwRow)
End If
lcolComposers.Add(lobjComposer)
Next
End If
ldbdsComposers.Clear()
Return lcolComposers
End Function
Public Shared Sub AddAllComposersToCache()
If MyGlobals.g_objObjectTypesCached.Contains("Composers") = False Then
GetAllComposers()
MyGlobals.g_objObjectTypesCached.Add("Composers")
End If
End Sub
End Class

75
clsDatabaseLayer.vb Normal file
View File

@@ -0,0 +1,75 @@
Imports System.Data
Imports System.Windows.Forms
Public Class clsDatabaseLayer
Private m_dbcnctConnection As SqlClient.SqlConnection
Public Function OpenDatabaseConnection() As Boolean
Try
m_dbcnctConnection = New SqlClient.SqlConnection
'm_dbcnctConnection.ConnectionString = "Persist Security Info=False;Integrated Security=SSPI;database=OrganLit;server=REUSS\SQLEXPRESS;Connect Timeout=30"
'm_dbcnctConnection.ConnectionString = "Persist Security Info=False;Integrated Security=False;User ID=OrganLitDBLogin;Password=OrganLitDBL0gin7;database=OrganLit;server=REUSS\SQLEXPRESS;Connect Timeout=30"
'm_dbcnctConnection.ConnectionString = "Persist Security Info=False;Integrated Security=False;User ID=OrganLitDBLogin;Password=OrganLitDBL0gin7;database=OrganLit;server=SIRJON\REUSSSQL;Connect Timeout=30"
'm_dbcnctConnection.ConnectionString = "Persist Security Info=False;Integrated Security=False;User ID=OrganLitDBLogin;Password=OrganLitDBL0gin7;database=OrganLit;server=SIRJ\REUSSSQL;Connect Timeout=30"
m_dbcnctConnection.ConnectionString = "Persist Security Info=False;Integrated Security=True;database=OrganLit;server=SIRJ\REUSSSQL;Connect Timeout=30"
m_dbcnctConnection.Open()
Return True
Catch e As SqlClient.SqlException
MessageBox.Show("Error in OpenDatabaseConnection: " + e.Message)
Return False
Catch e As Exception
MessageBox.Show("Error in OpenDatabaseConnection: " + e.Message)
Return False
End Try
End Function
Public Function CloseDatabaseConnection() As Boolean
Try
m_dbcnctConnection.Close()
Catch e As SqlClient.SqlException
MessageBox.Show("Error in CloseDatabaseConnection: " + e.Message)
Return False
Catch e As Exception
MessageBox.Show("Error in CloseDatabaseConnection: " + e.Message)
Return False
End Try
End Function
Public Function ExecuteDataSet(ByVal objSQLCommand As SqlClient.SqlCommand) As DataSet
Try
objSQLCommand.Connection = m_dbcnctConnection
Dim ldbdaDataAdapter As New SqlClient.SqlDataAdapter
ldbdaDataAdapter.SelectCommand = objSQLCommand
Dim ldbdsDataSet As New DataSet
ldbdaDataAdapter.Fill(ldbdsDataSet)
Return ldbdsDataSet
Catch e As SqlClient.SqlException
MessageBox.Show("Error in ExecuteDataSet: Procedure=" + e.Procedure + ControlChars.CrLf + "Error=" + e.Message)
Return Nothing
Catch e As Exception
MessageBox.Show("Error in ExecuteDataSet: " + e.Message)
Return Nothing
End Try
End Function
Public Function ExecuteNonQuery(ByVal objSQLCommand As SqlClient.SqlCommand) As Integer
'Returns rows affected
Try
objSQLCommand.Connection = m_dbcnctConnection
Dim lintRowsAffected As Integer = objSQLCommand.ExecuteNonQuery
Return lintRowsAffected
Catch e As SqlClient.SqlException
MessageBox.Show("Error in ExecuteNonQuery: Procedure=" + e.Procedure + ControlChars.CrLf + "Error=" + e.Message)
Return 0
Catch e As Exception
MessageBox.Show("Error in ExecuteNonQuery: " + e.Message)
Return 0
End Try
End Function
End Class

217
clsGridSorter.vb Normal file
View File

@@ -0,0 +1,217 @@
Imports System.Windows.Forms
Public Class clsGridSorter : Implements IComparer
Dim mintColumnIndexToSort As Integer
Dim mobjGridColumnSortRules() As clsGridColumnSortRule
Public Sub New()
mintColumnIndexToSort = 0
End Sub
Public Sub New(ByVal lintInputColumnToSort As Integer)
mintColumnIndexToSort = lintInputColumnToSort
End Sub
Public Sub New(ByVal lintInputColumnToSort As Integer, ByVal lobjGridColumnSortRules As clsGridColumnSortRule())
mintColumnIndexToSort = lintInputColumnToSort
mobjGridColumnSortRules = lobjGridColumnSortRules
End Sub
Public Property ColumnIndexToSort() As Integer
Get
Return mintColumnIndexToSort
End Get
Set(ByVal iValue As Integer)
mintColumnIndexToSort = iValue
End Set
End Property
Public Property ColumnSortRules() As clsGridColumnSortRule()
Get
Return mobjGridColumnSortRules
End Get
Set(ByVal iValue As clsGridColumnSortRule())
mobjGridColumnSortRules = iValue
End Set
End Property
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim row1 As ListViewItem
Dim row2 As ListViewItem
Dim lintReturnValue As Integer
row1 = CType(x, ListViewItem)
row2 = CType(y, ListViewItem)
If mintColumnIndexToSort > row1.SubItems.Count Then
Return -1
End If
If mobjGridColumnSortRules Is Nothing _
OrElse mintColumnIndexToSort >= mobjGridColumnSortRules.Length Then
'Default to string comparison
Dim s1 As String = row1.SubItems(0).Text
Dim s2 As String = row2.SubItems(0).Text
Return String.Compare(s1, s2)
End If
Select Case mobjGridColumnSortRules(mintColumnIndexToSort).SortType
Case clsGridColumnSortRule.enumSortType.SortAsNumber
Dim ldblValue1 As Double = Val(row1.SubItems(mintColumnIndexToSort).Text)
Dim ldblValue2 As Double = Val(row2.SubItems(mintColumnIndexToSort).Text)
lintReturnValue = CompareDouble(ldblValue1, ldblValue2)
If lintReturnValue = 0 Then
lintReturnValue = CompareSubColumns(row1, row2, Me.mobjGridColumnSortRules(mintColumnIndexToSort).SubColumnSort)
End If
Return lintReturnValue
Case clsGridColumnSortRule.enumSortType.SortAsString
Dim lstrValue1 As String = row1.SubItems(mintColumnIndexToSort).Text
Dim lstrValue2 As String = row2.SubItems(mintColumnIndexToSort).Text
lintReturnValue = CompareString(lstrValue1, lstrValue2)
If lintReturnValue = 0 Then
lintReturnValue = CompareSubColumns(row1, row2, Me.mobjGridColumnSortRules(mintColumnIndexToSort).SubColumnSort)
End If
Return lintReturnValue
Case Else 'No Sort here - go to subcolumn sorts, if any
lintReturnValue = CompareSubColumns(row1, row2, Me.mobjGridColumnSortRules(mintColumnIndexToSort).SubColumnSort)
Return lintReturnValue
End Select
Return 0
End Function
Private Function CompareString(ByVal lstrString1 As String, ByVal lstrString2 As String) As Integer
Return String.Compare(lstrString1, lstrString2)
End Function
Private Function CompareDouble(ByVal ldblDouble1 As Double, ByVal ldblDouble2 As Double) As Integer
If ldblDouble1 < ldblDouble2 Then
Return -1
Else
If ldblDouble2 < ldblDouble1 Then
Return 1
Else
Return 0
End If
End If
End Function
Private Function CompareSubColumns(ByVal row1 As ListViewItem, ByVal row2 As ListViewItem, ByVal lobjSubColumnSort As clsGridSubColumnSortRule) As Integer
Dim lintReturnValue As Integer
If lobjSubColumnSort Is Nothing Then
Return 0
Else
If lobjSubColumnSort.ColumnIndex > row1.SubItems.Count Then
Return -1
End If
Select Case lobjSubColumnSort.SortType
Case clsGridSubColumnSortRule.enumSortType.SortAsNumber
Dim ldblValue1 As Double = Val(row1.SubItems(lobjSubColumnSort.ColumnIndex).Text)
Dim ldblValue2 As Double = Val(row2.SubItems(lobjSubColumnSort.ColumnIndex).Text)
lintReturnValue = CompareDouble(ldblValue1, ldblValue2)
If lintReturnValue = 0 Then
lintReturnValue = CompareSubColumns(row1, row2, lobjSubColumnSort.SubColumnSortRule)
End If
Return lintReturnValue
Case clsGridSubColumnSortRule.enumSortType.SortAsString
Dim lstrValue1 As String = row1.SubItems(lobjSubColumnSort.ColumnIndex).Text
Dim lstrValue2 As String = row2.SubItems(lobjSubColumnSort.ColumnIndex).Text
lintReturnValue = CompareString(lstrValue1, lstrValue2)
If lintReturnValue = 0 Then
lintReturnValue = CompareSubColumns(row1, row2, lobjSubColumnSort.SubColumnSortRule)
End If
Return lintReturnValue
Case Else 'No Sort here - go to subcolumn sorts, if any
lintReturnValue = CompareSubColumns(row1, row2, lobjSubColumnSort.SubColumnSortRule)
Return lintReturnValue
End Select
End If
End Function
End Class
Public Class clsGridColumnSortRule
Public Enum enumSortType
SortAsString
SortAsNumber
SortNone
End Enum
Private menumSortType As enumSortType
Private mobjSubColumnSort As clsGridSubColumnSortRule
Public Sub New()
menumSortType = enumSortType.SortAsString
End Sub
Public Sub New(ByVal lenumSortType As enumSortType)
menumSortType = lenumSortType
End Sub
Public Property SortType() As enumSortType
Get
Return menumSortType
End Get
Set(ByVal iValue As enumSortType)
menumSortType = iValue
End Set
End Property
Public Property SubColumnSort() As clsGridSubColumnSortRule
Get
Return mobjSubColumnSort
End Get
Set(ByVal iValue As clsGridSubColumnSortRule)
mobjSubColumnSort = iValue
End Set
End Property
End Class
Public Class clsGridSubColumnSortRule
Public Enum enumSortType
SortAsString
SortAsNumber
End Enum
Private menumSortType As enumSortType
Private mintColumnIndex As Integer
Private mobjSubColumnSortRule As clsGridSubColumnSortRule
Public Sub New(ByVal lintColumnIndex As Integer)
mintColumnIndex = lintColumnIndex
menumSortType = enumSortType.SortAsString
End Sub
Public Sub New(ByVal lintColumnIndex As Integer, ByVal lobjSubColumnSortRule As clsGridSubColumnSortRule)
mintColumnIndex = lintColumnIndex
mobjSubColumnSortRule = lobjSubColumnSortRule
menumSortType = enumSortType.SortAsString
End Sub
Public Sub New(ByVal lintColumnIndex As Integer, ByVal lenumSortType As enumSortType, ByVal lobjSubColumnSortRule As clsGridSubColumnSortRule)
mintColumnIndex = lintColumnIndex
mobjSubColumnSortRule = lobjSubColumnSortRule
menumSortType = lenumSortType
End Sub
Public Property ColumnIndex() As Integer
Get
Return mintColumnIndex
End Get
Set(ByVal iValue As Integer)
mintColumnIndex = iValue
End Set
End Property
Public Property SortType() As enumSortType
Get
Return menumSortType
End Get
Set(ByVal iValue As enumSortType)
menumSortType = iValue
End Set
End Property
Public Property SubColumnSortRule() As clsGridSubColumnSortRule
Get
Return mobjSubColumnSortRule
End Get
Set(ByVal iValue As clsGridSubColumnSortRule)
mobjSubColumnSortRule = iValue
End Set
End Property
End Class

487
clsHymn.vb Normal file
View File

@@ -0,0 +1,487 @@
Imports System.Data
Imports System.Text
Imports System.Windows.Forms
Imports System.Xml
Public Class clsHymn
Implements ICloneable
Private mguidHymnID As Guid
Private m_objHymnal As clsHymnal
Private m_intHymnNumber As Integer
Private m_strHymnName As String
Private m_objHymnTuneName As clsHymnTuneName
Private m_blnObjectAlreadyPersisted As Boolean
Public Sub New()
mguidHymnID = Guid.NewGuid
m_objHymnal = Nothing
m_intHymnNumber = 0
m_strHymnName = ""
m_objHymnTuneName = Nothing
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal objHymnal As clsHymnal, ByVal intHymnNumber As Integer, ByVal strHymnName As String, ByVal objHymnTuneName As clsHymnTuneName)
mguidHymnID = Guid.NewGuid
m_objHymnal = objHymnal
m_intHymnNumber = intHymnNumber
m_strHymnName = strHymnName
m_objHymnTuneName = objHymnTuneName
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal guidHymnID As Guid)
mguidHymnID = guidHymnID
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymn"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnID As New SqlClient.SqlParameter
prmHymnID.ParameterName = "@hymn_id"
prmHymnID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnID.Size = 5
prmHymnID.Value = guidHymnID
ldbcmdCommand.Parameters.Add(prmHymnID)
Dim ldbdsHymns As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymns.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsHymns.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.HymnID.ToString)
End If
ldbdsHymns.Clear()
End Sub
Public Sub New(ByVal ldbrwRow As DataRow)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.HymnID.ToString)
End Sub
Private Sub PopulateFromDBRow(ByVal ldbrwRow As DataRow)
mguidHymnID = CType(ldbrwRow.Item("hymn_id"), Guid)
If ldbrwRow.IsNull("hymnal_id") Then
m_objHymnal = Nothing
Else
Dim guidHymnalID As Guid = CType(ldbrwRow.Item("hymnal_id"), Guid)
If MyGlobals.CachedObjectExists(guidHymnalID.ToString) Then
m_objHymnal = CType(MyGlobals.CachedObjectRetrieve(guidHymnalID.ToString), clsHymnal)
Else
m_objHymnal = New clsHymnal(guidHymnalID)
End If
End If
m_intHymnNumber = CType(ldbrwRow.Item("hymn_number"), Integer)
m_strHymnName = CType(ldbrwRow.Item("hymn_name"), String)
If ldbrwRow.IsNull("hymn_tune_name_id") Then
m_objHymnTuneName = Nothing
Else
Dim guidHymnTuneNameID As Guid = CType(ldbrwRow.Item("hymn_tune_name_id"), Guid)
If MyGlobals.CachedObjectExists(guidHymnTuneNameID.ToString) Then
m_objHymnTuneName = CType(MyGlobals.CachedObjectRetrieve(guidHymnTuneNameID.ToString), clsHymnTuneName)
Else
m_objHymnTuneName = New clsHymnTuneName(guidHymnTuneNameID)
End If
End If
End Sub
Public Function Delete() As Boolean
Try
MyGlobals.RemoveCachedObject(Me.HymnID.ToString)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "del_hymn"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnID As New SqlClient.SqlParameter
prmHymnID.ParameterName = "@hymn_id"
prmHymnID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnID.Size = 5
prmHymnID.Value = mguidHymnID
ldbcmdCommand.Parameters.Add(prmHymnID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Catch
Return False
End Try
End Function
Public Function Save() As Boolean
Try
If Not m_objHymnal Is Nothing Then
If Not m_objHymnal.ItemAlreadyPersisted Then
m_objHymnal.Save()
End If
End If
If Not m_objHymnTuneName Is Nothing Then
If Not m_objHymnTuneName.ItemAlreadyPersisted Then
m_objHymnTuneName.Save()
End If
End If
MyGlobals.AddCachedObject(Me, Me.HymnID.ToString)
If m_blnObjectAlreadyPersisted Then
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "upd_hymn"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnID As New SqlClient.SqlParameter
prmHymnID.ParameterName = "@hymn_id"
prmHymnID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnalID.Size = 5
prmHymnID.Value = mguidHymnID
ldbcmdCommand.Parameters.Add(prmHymnID)
' Set up parameter for stored procedure
Dim prmHymnalID As New SqlClient.SqlParameter
prmHymnalID.ParameterName = "@hymnal_id"
prmHymnalID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnalID.Size = 5
If m_objHymnal Is Nothing Then
prmHymnalID.Value = DBNull.Value
Else
prmHymnalID.Value = m_objHymnal.HymnalID
End If
ldbcmdCommand.Parameters.Add(prmHymnalID)
' Set up parameter for stored procedure
Dim prmHymnNumber As New SqlClient.SqlParameter
prmHymnNumber.ParameterName = "@hymn_number"
prmHymnNumber.SqlDbType = SqlDbType.Int
'prmHymnNumber.Size = 5
prmHymnNumber.Value = m_intHymnNumber
ldbcmdCommand.Parameters.Add(prmHymnNumber)
' Set up parameter for stored procedure
Dim prmHymnName As New SqlClient.SqlParameter
prmHymnName.ParameterName = "@hymn_name"
prmHymnName.SqlDbType = SqlDbType.VarChar
prmHymnName.Size = MyGlobals.HYMN_NAME_SIZE
prmHymnName.Value = m_strHymnName
ldbcmdCommand.Parameters.Add(prmHymnName)
' Set up parameter for stored procedure
Dim prmHymnTuneNameID As New SqlClient.SqlParameter
prmHymnTuneNameID.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameID.Size = 5
If m_objHymnTuneName Is Nothing Then
prmHymnTuneNameID.Value = DBNull.Value
Else
prmHymnTuneNameID.Value = m_objHymnTuneName.HymnTuneNameID
End If
ldbcmdCommand.Parameters.Add(prmHymnTuneNameID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Else
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "ins_hymn"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnID As New SqlClient.SqlParameter
prmHymnID.ParameterName = "@hymn_id"
prmHymnID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnalID.Size = 5
prmHymnID.Value = mguidHymnID
ldbcmdCommand.Parameters.Add(prmHymnID)
' Set up parameter for stored procedure
Dim prmHymnalID As New SqlClient.SqlParameter
prmHymnalID.ParameterName = "@hymnal_id"
prmHymnalID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnalID.Size = 5
If m_objHymnal Is Nothing Then
prmHymnalID.Value = DBNull.Value
Else
prmHymnalID.Value = m_objHymnal.HymnalID
End If
ldbcmdCommand.Parameters.Add(prmHymnalID)
Dim prmHymnNumber As New SqlClient.SqlParameter
prmHymnNumber.ParameterName = "@hymn_number"
prmHymnNumber.SqlDbType = SqlDbType.Int
'prmHymnNumber.Size = 5
prmHymnNumber.Value = m_intHymnNumber
ldbcmdCommand.Parameters.Add(prmHymnNumber)
' Set up parameter for stored procedure
Dim prmHymnName As New SqlClient.SqlParameter
prmHymnName.ParameterName = "@hymn_name"
prmHymnName.SqlDbType = SqlDbType.VarChar
prmHymnName.Size = MyGlobals.HYMN_NAME_SIZE
prmHymnName.Value = m_strHymnName
ldbcmdCommand.Parameters.Add(prmHymnName)
' Set up parameter for stored procedure
Dim prmHymnTuneNameID As New SqlClient.SqlParameter
prmHymnTuneNameID.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameID.Size = 5
If m_objHymnTuneName Is Nothing Then
prmHymnTuneNameID.Value = DBNull.Value
Else
prmHymnTuneNameID.Value = m_objHymnTuneName.HymnTuneNameID
End If
ldbcmdCommand.Parameters.Add(prmHymnTuneNameID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = True
Return True
Else
Return False
End If
End If
Catch e As SqlClient.SqlException
MessageBox.Show(e.Message)
Return False
Catch
Return False
End Try
End Function
Public Property HymnID() As Guid
Get
Return mguidHymnID
End Get
Set(ByVal Value As Guid)
mguidHymnID = Value
End Set
End Property
Public Property Hymnal() As clsHymnal
Get
Return m_objHymnal
End Get
Set(ByVal Value As clsHymnal)
m_objHymnal = Value
End Set
End Property
Public Property HymnNumber() As Integer
Get
Return m_intHymnNumber
End Get
Set(ByVal Value As Integer)
m_intHymnNumber = Value
End Set
End Property
Public Property HymnNumberAsString() As String
Get
Return m_intHymnNumber.ToString
End Get
Set(ByVal Value As String)
If Val(Value) > 0 Then
m_intHymnNumber = CType(Value, Integer)
Else
m_intHymnNumber = 0
End If
End Set
End Property
Public Property HymnName() As String
Get
Return m_strHymnName
End Get
Set(ByVal Value As String)
m_strHymnName = Value.Trim
End Set
End Property
Public Property HymnTuneName() As clsHymnTuneName
Get
Return m_objHymnTuneName
End Get
Set(ByVal Value As clsHymnTuneName)
m_objHymnTuneName = Value
End Set
End Property
Public Property ItemAlreadyPersisted() As Boolean
Get
Return m_blnObjectAlreadyPersisted
End Get
Set(ByVal Value As Boolean)
m_blnObjectAlreadyPersisted = Value
End Set
End Property
Public Function Clone() As Object Implements ICloneable.Clone
Dim lobjReturnValue As New clsHymn
lobjReturnValue.HymnID = Me.HymnID
lobjReturnValue.Hymnal = Me.Hymnal
lobjReturnValue.HymnNumber = Me.HymnNumber
lobjReturnValue.HymnName = Me.HymnName
lobjReturnValue.HymnTuneName = Me.HymnTuneName
lobjReturnValue.ItemAlreadyPersisted = Me.ItemAlreadyPersisted
Return lobjReturnValue
End Function
Public Function StateIsIdentical(ByVal lobjOtherHymn As clsHymn) As Boolean
Dim blnResult As Boolean
If Me.HymnID.Equals(lobjOtherHymn.HymnID) _
AndAlso Me.HymnNumber = lobjOtherHymn.HymnNumber _
AndAlso Me.HymnName = lobjOtherHymn.HymnName Then
blnResult = True
If Me.Hymnal Is Nothing Then
If lobjOtherHymn.Hymnal Is Nothing Then
'OK
Else
Return False
End If
Else
If lobjOtherHymn.Hymnal Is Nothing Then
Return False
Else
blnResult = Me.Hymnal.HymnalID.Equals(lobjOtherHymn.Hymnal.HymnalID)
End If
End If
If Not blnResult Then
Return False
End If
If Me.HymnTuneName Is Nothing Then
If lobjOtherHymn.HymnTuneName Is Nothing Then
'OK
Else
Return False
End If
Else
If lobjOtherHymn.HymnTuneName Is Nothing Then
Return False
Else
blnResult = Me.HymnTuneName.HymnTuneNameID.Equals(lobjOtherHymn.HymnTuneName.HymnTuneNameID)
End If
End If
Else
Return False
End If
Return blnResult
End Function
Public Function Validate(ByRef lstrErrorString As String) As Boolean
lstrErrorString = ""
If Me.Hymnal Is Nothing Then
lstrErrorString = "Hymnal is required"
Return False
End If
If Me.HymnNumber = 0 Then
lstrErrorString = "Hymn Number is required and must be numeric"
Return False
End If
If Me.HymnName.Length = 0 Then
lstrErrorString = "Hymn Name is required"
Return False
End If
If Me.HymnTuneName Is Nothing Then
lstrErrorString = "HymnTuneName is required"
Return False
End If
Return True
End Function
Public Function OKToDelete(ByRef lstrReferencedByString As String) As Boolean
lstrReferencedByString = ""
Return True
End Function
Public Overrides Function ToString() As String
Dim strReturnString As New StringBuilder
If m_objHymnal Is Nothing Then
'strReturnString.Append(MyGlobals.COLLECTION_STRING)
Else
strReturnString.Append(m_objHymnal.HymnalAbbreviation)
End If
strReturnString.Append(m_intHymnNumber)
strReturnString.Append(" - ")
strReturnString.Append(m_strHymnName)
Return strReturnString.ToString
End Function
Public Sub WriteXML(ByRef objXMLWriter As XmlTextWriter)
objXMLWriter.WriteStartElement("Hymn")
objXMLWriter.WriteElementString("HymnID", Me.HymnID.ToString)
objXMLWriter.WriteElementString("HymnName", Me.HymnName)
objXMLWriter.WriteElementString("HymnNumber", Me.HymnNumberAsString)
objXMLWriter.WriteElementString("HymnalID", Me.Hymnal.HymnalID.ToString)
Me.Hymnal.WriteXML(objXMLWriter)
If Me.HymnTuneName Is Nothing Then
objXMLWriter.WriteElementString("HymnTuneNameID", "")
Else
objXMLWriter.WriteElementString("HymnTuneNameID", Me.HymnTuneName.HymnTuneNameID.ToString)
Me.HymnTuneName.WriteXML(objXMLWriter)
End If
objXMLWriter.WriteEndElement()
End Sub
Public Shared Function GetAllHymns() As System.Collections.Generic.List(Of clsHymn)
'Preload to cache
clsHymnTuneName.AddAllHymnTuneNamesToCache()
clsHymnal.AddAllHymnalsToCache()
Dim lguidHymnID As Guid
Dim ldbcmdCommand As New SqlClient.SqlCommand
Dim lobjHymn As clsHymn
Dim lcolHymns As New System.Collections.Generic.List(Of clsHymn)
ldbcmdCommand.CommandText = "sel_hymn_all"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
Dim ldbdsHymns As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymns.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsHymns.Tables(0).Rows
lguidHymnID = CType(ldbrwRow.Item("hymn_id"), Guid)
If MyGlobals.CachedObjectExists(lguidHymnID.ToString) Then
lobjHymn = CType(MyGlobals.CachedObjectRetrieve(lguidHymnID.ToString), clsHymn)
Else
'lobjHymn = New clsHymn(lguidHymnID)
lobjHymn = New clsHymn(ldbrwRow)
End If
lcolHymns.Add(lobjHymn)
Next
End If
ldbdsHymns.Clear()
Return lcolHymns
End Function
End Class

686
clsHymnTuneName.vb Normal file
View File

@@ -0,0 +1,686 @@
Imports System.Data
Imports System.Xml
Public Class clsHymnTuneName
Implements ICloneable
Private mguidHymnTuneNameID As Guid
Private mstrHymnTuneName As String
Private mguidHymnTuneID As Guid
Private m_OtherHymnTuneNamesForTune As SortedList
Private m_blnObjectAlreadyPersisted As Boolean
Public Sub New()
mguidHymnTuneNameID = Guid.NewGuid
mstrHymnTuneName = ""
mguidHymnTuneID = Guid.NewGuid
m_OtherHymnTuneNamesForTune = New SortedList
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal lstrHymnTuneName As String)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymn_tune_name_by_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneName As New SqlClient.SqlParameter
prmHymnTuneName.ParameterName = "@hymn_tune_name"
prmHymnTuneName.SqlDbType = SqlDbType.VarChar
prmHymnTuneName.Size = MyGlobals.HYMN_TUNE_NAME_SIZE
prmHymnTuneName.Value = lstrHymnTuneName
ldbcmdCommand.Parameters.Add(prmHymnTuneName)
Dim ldbdsHymnTuneNames As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnTuneNames.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsHymnTuneNames.Tables(0).Rows(0)
mguidHymnTuneNameID = CType(ldbrwRow.Item("hymn_tune_name_id"), Guid)
mstrHymnTuneName = CType(ldbrwRow.Item("hymn_tune_name"), String)
mguidHymnTuneID = CType(ldbrwRow.Item("hymn_tune_id"), Guid)
m_OtherHymnTuneNamesForTune = GetOtherTuneNamesForTune(mguidHymnTuneNameID)
ldbdsHymnTuneNames.Clear()
m_blnObjectAlreadyPersisted = True
Else
ldbdsHymnTuneNames.Clear()
mguidHymnTuneNameID = Guid.NewGuid
mstrHymnTuneName = lstrHymnTuneName.Trim
mguidHymnTuneID = Guid.NewGuid
m_OtherHymnTuneNamesForTune = New SortedList
m_blnObjectAlreadyPersisted = False
End If
End Sub
Public Sub New(ByVal lguidHymnTuneNameID As Guid)
LoadByHymnTuneNameId(lguidHymnTuneNameID, True)
End Sub
Protected Sub New(ByVal lguidHymnTuneNameID As Guid, ByVal lblnLoadOtherTuneNamesForTune As Boolean)
LoadByHymnTuneNameId(lguidHymnTuneNameID, lblnLoadOtherTuneNamesForTune)
End Sub
Public Sub New(ByVal ldbrwRow As DataRow)
PopulateFromDBRow(ldbrwRow, True)
m_blnObjectAlreadyPersisted = True
End Sub
Protected Sub New(ByVal ldbrwRow As DataRow, ByVal lblnLoadOtherTuneNamesForTune As Boolean)
PopulateFromDBRow(ldbrwRow, lblnLoadOtherTuneNamesForTune)
m_blnObjectAlreadyPersisted = True
End Sub
Private Sub LoadByHymnTuneNameId(ByVal lguidHymnTuneNameID As Guid, ByVal lblnLoadOtherTuneNamesForTune As Boolean)
mguidHymnTuneNameID = lguidHymnTuneNameID
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymn_tune_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneNameID As New SqlClient.SqlParameter
prmHymnTuneNameID.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameID.Size = 5
prmHymnTuneNameID.Value = lguidHymnTuneNameID
ldbcmdCommand.Parameters.Add(prmHymnTuneNameID)
Dim ldbdsHymnTuneNames As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnTuneNames.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsHymnTuneNames.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow, lblnLoadOtherTuneNamesForTune)
m_blnObjectAlreadyPersisted = True
If lblnLoadOtherTuneNamesForTune Then
MyGlobals.AddCachedObject(Me, Me.HymnTuneID.ToString)
End If
End If
ldbdsHymnTuneNames.Clear()
End Sub
Private Sub PopulateFromDBRow(ByVal ldbrwRow As DataRow, ByVal lblnLoadOtherTuneNamesForTune As Boolean)
mguidHymnTuneNameID = CType(ldbrwRow.Item("hymn_tune_name_id"), Guid)
mstrHymnTuneName = CType(ldbrwRow.Item("hymn_tune_name"), String)
mguidHymnTuneID = CType(ldbrwRow.Item("hymn_tune_id"), Guid)
If lblnLoadOtherTuneNamesForTune Then
m_OtherHymnTuneNamesForTune = GetOtherTuneNamesForTune(mguidHymnTuneNameID)
Else
m_OtherHymnTuneNamesForTune = New SortedList
End If
If lblnLoadOtherTuneNamesForTune Then
MyGlobals.AddCachedObject(Me, Me.HymnTuneID.ToString)
End If
End Sub
Public Sub Refresh()
LoadByHymnTuneNameId(mguidHymnTuneNameID, True)
End Sub
Public Function Delete() As Boolean
MyGlobals.RemoveCachedObject(Me.HymnTuneNameID.ToString)
Try
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "del_hymn_tune_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneNameID As New SqlClient.SqlParameter
prmHymnTuneNameID.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameID.Size = 5
prmHymnTuneNameID.Value = mguidHymnTuneNameID
ldbcmdCommand.Parameters.Add(prmHymnTuneNameID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = False
Return True
Else
Return False
End If
Catch
Return False
End Try
End Function
Public Function Save() As Boolean
Try
MyGlobals.AddCachedObject(Me, Me.HymnTuneNameID.ToString)
If m_blnObjectAlreadyPersisted Then
Dim objPersisted_OtherHymnTuneNamesForTune As SortedList = GetOtherTuneNamesForTune(mguidHymnTuneNameID)
Dim objAddedOtherHymnTuneNamesForTune As SortedList = Nothing
Dim objDroppedOtherHymnTuneNamesForTune As SortedList = Nothing
Dim objRemainingOtherHymnTuneNamesForTune As SortedList = Nothing
GetAddedDroppedRemainingOtherHymnTuneNamesForTune(objPersisted_OtherHymnTuneNamesForTune, m_OtherHymnTuneNamesForTune, objAddedOtherHymnTuneNamesForTune, objDroppedOtherHymnTuneNamesForTune, objRemainingOtherHymnTuneNamesForTune)
'If alternate tune names were droped from the list, then we need to change
'the current hymn tune name and all alternate hymn tune names that remained
'on the list to a new hymn tune ID
If objDroppedOtherHymnTuneNamesForTune.Count > 0 Then
'Get a new Hymn Tune ID for THIS hymn tune name
mguidHymnTuneID = Guid.NewGuid
Dim objDictionaryEntry As DictionaryEntry
Dim objOtherHymnTuneName As clsHymnTuneName
'Update the hymn tune ID for all hymn tune names which should REMAIN
'matched with THIS hymn tune name
For Each objDictionaryEntry In objRemainingOtherHymnTuneNamesForTune
objOtherHymnTuneName = CType(objDictionaryEntry.Value, clsHymnTuneName)
objOtherHymnTuneName.HymnTuneID = mguidHymnTuneID
Dim ldbcmdCommandSaveOtherRemaining As New SqlClient.SqlCommand
ldbcmdCommandSaveOtherRemaining.CommandText = "upd_hymn_tune_name_with_tune_id"
ldbcmdCommandSaveOtherRemaining.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneNameIDSaveOtherRemaining As New SqlClient.SqlParameter
prmHymnTuneNameIDSaveOtherRemaining.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameIDSaveOtherRemaining.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameIDSaveOtherRemaining.Size = 5
prmHymnTuneNameIDSaveOtherRemaining.Value = objOtherHymnTuneName.HymnTuneNameID
ldbcmdCommandSaveOtherRemaining.Parameters.Add(prmHymnTuneNameIDSaveOtherRemaining)
' Set up parameter for stored procedure
Dim prmHymnTuneIDSaveOtherRemaining As New SqlClient.SqlParameter
prmHymnTuneIDSaveOtherRemaining.ParameterName = "@hymn_tune_id"
prmHymnTuneIDSaveOtherRemaining.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneIDSaveOtherRemaining.Size = 5
prmHymnTuneIDSaveOtherRemaining.Value = mguidHymnTuneID
ldbcmdCommandSaveOtherRemaining.Parameters.Add(prmHymnTuneIDSaveOtherRemaining)
Dim lintRowsAffectedSaveOtherRemaining As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommandSaveOtherRemaining)
Next
End If
'If alternate hymn tune names were added, we need to change the hymn tune ID for all
'hymn tune names that were added (along with THEIR matches) to the hymn tune ID of
'the current hymn tune name
If objAddedOtherHymnTuneNamesForTune.Count > 0 Then
Dim objDictionaryEntry As DictionaryEntry
Dim objOtherHymnTuneName As clsHymnTuneName
For Each objDictionaryEntry In objAddedOtherHymnTuneNamesForTune
objOtherHymnTuneName = CType(objDictionaryEntry.Value, clsHymnTuneName)
objOtherHymnTuneName.HymnTuneID = mguidHymnTuneID
Dim ldbcmdCommandSaveOtherAdded As New SqlClient.SqlCommand
ldbcmdCommandSaveOtherAdded.CommandText = "upd_hymn_tune_name_with_tune_id_with_matches"
ldbcmdCommandSaveOtherAdded.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneNameIDSaveOtherAdded As New SqlClient.SqlParameter
prmHymnTuneNameIDSaveOtherAdded.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameIDSaveOtherAdded.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameID.Size = 5
prmHymnTuneNameIDSaveOtherAdded.Value = objOtherHymnTuneName.HymnTuneNameID
ldbcmdCommandSaveOtherAdded.Parameters.Add(prmHymnTuneNameIDSaveOtherAdded)
' Set up parameter for stored procedure
Dim prmHymnTuneIDSaveOtherAdded As New SqlClient.SqlParameter
prmHymnTuneIDSaveOtherAdded.ParameterName = "@hymn_tune_id"
prmHymnTuneIDSaveOtherAdded.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneID.Size = 5
prmHymnTuneIDSaveOtherAdded.Value = mguidHymnTuneID
ldbcmdCommandSaveOtherAdded.Parameters.Add(prmHymnTuneIDSaveOtherAdded)
Dim lintRowsAffectedSaveOtherAdded As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommandSaveOtherAdded)
Next
End If
Dim ldbcmdCommandUpdateThis As New SqlClient.SqlCommand
ldbcmdCommandUpdateThis.CommandText = "upd_hymn_tune_name"
ldbcmdCommandUpdateThis.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneNameIDUpdateThis As New SqlClient.SqlParameter
prmHymnTuneNameIDUpdateThis.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameIDUpdateThis.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameIDUpdateThis.Size = 5
prmHymnTuneNameIDUpdateThis.Value = mguidHymnTuneNameID
ldbcmdCommandUpdateThis.Parameters.Add(prmHymnTuneNameIDUpdateThis)
' Set up parameter for stored procedure
Dim prmHymnTuneNameUpdateThis As New SqlClient.SqlParameter
prmHymnTuneNameUpdateThis.ParameterName = "@hymn_tune_name"
prmHymnTuneNameUpdateThis.SqlDbType = SqlDbType.VarChar
prmHymnTuneNameUpdateThis.Size = MyGlobals.HYMN_TUNE_NAME_SIZE
prmHymnTuneNameUpdateThis.Value = mstrHymnTuneName
ldbcmdCommandUpdateThis.Parameters.Add(prmHymnTuneNameUpdateThis)
' Set up parameter for stored procedure
Dim prmHymnTuneIDUpdateThis As New SqlClient.SqlParameter
prmHymnTuneIDUpdateThis.ParameterName = "@hymn_tune_id"
prmHymnTuneIDUpdateThis.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneIDUpdateThis.Size = 5
prmHymnTuneIDUpdateThis.Value = mguidHymnTuneID
ldbcmdCommandUpdateThis.Parameters.Add(prmHymnTuneIDUpdateThis)
Dim lintRowsAffectedUpdateThis As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommandUpdateThis)
If lintRowsAffectedUpdateThis > 0 Then
Return True
Else
Return False
End If
Else
'If alternate tune names listed, grab hymn tune ID from first one listed,
'and update tune ID for all others, including THIS object
If m_OtherHymnTuneNamesForTune.Count > 0 Then
Dim objguidFirstTuneID As Guid
Dim blnFirstAlternameTuneName As Boolean = True
Dim objDictionaryEntry As DictionaryEntry
Dim objOtherHymnTuneName As clsHymnTuneName
For Each objDictionaryEntry In m_OtherHymnTuneNamesForTune
objOtherHymnTuneName = CType(objDictionaryEntry.Value, clsHymnTuneName)
If blnFirstAlternameTuneName Then
blnFirstAlternameTuneName = False
objguidFirstTuneID = objOtherHymnTuneName.HymnTuneID
mguidHymnTuneID = objguidFirstTuneID
Else
objOtherHymnTuneName.HymnTuneID = objguidFirstTuneID
Dim ldbcmdCommandUpdateOtherAdding As New SqlClient.SqlCommand
ldbcmdCommandUpdateOtherAdding.CommandText = "upd_hymn_tune_name_with_tune_id_with_matches"
ldbcmdCommandUpdateOtherAdding.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneNameIDUpdateOtherAdding As New SqlClient.SqlParameter
prmHymnTuneNameIDUpdateOtherAdding.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameIDUpdateOtherAdding.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameIDUpdateOtherAdding.Size = 5
prmHymnTuneNameIDUpdateOtherAdding.Value = objOtherHymnTuneName.HymnTuneNameID
ldbcmdCommandUpdateOtherAdding.Parameters.Add(prmHymnTuneNameIDUpdateOtherAdding)
' Set up parameter for stored procedure
Dim prmHymnTuneIDUpdateOtherAdding As New SqlClient.SqlParameter
prmHymnTuneIDUpdateOtherAdding.ParameterName = "@hymn_tune_id"
prmHymnTuneIDUpdateOtherAdding.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneIDUpdateOtherAdding.Size = 5
prmHymnTuneIDUpdateOtherAdding.Value = objguidFirstTuneID
ldbcmdCommandUpdateOtherAdding.Parameters.Add(prmHymnTuneIDUpdateOtherAdding)
Dim lintRowsAffectedUpdateOtherAdding As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommandUpdateOtherAdding)
End If
Next
End If
Dim ldbcmdCommandAddThis As New SqlClient.SqlCommand
ldbcmdCommandAddThis.CommandText = "ins_hymn_tune_name"
ldbcmdCommandAddThis.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneNameIDAddThis As New SqlClient.SqlParameter
prmHymnTuneNameIDAddThis.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameIDAddThis.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameID.Size = 5
prmHymnTuneNameIDAddThis.Value = mguidHymnTuneNameID
ldbcmdCommandAddThis.Parameters.Add(prmHymnTuneNameIDAddThis)
' Set up parameter for stored procedure
Dim prmHymnTuneNameAddThis As New SqlClient.SqlParameter
prmHymnTuneNameAddThis.ParameterName = "@hymn_tune_name"
prmHymnTuneNameAddThis.SqlDbType = SqlDbType.VarChar
prmHymnTuneNameAddThis.Size = MyGlobals.HYMN_TUNE_NAME_SIZE
prmHymnTuneNameAddThis.Value = mstrHymnTuneName
ldbcmdCommandAddThis.Parameters.Add(prmHymnTuneNameAddThis)
' Set up parameter for stored procedure
Dim prmHymnTuneIDAddThis As New SqlClient.SqlParameter
prmHymnTuneIDAddThis.ParameterName = "@hymn_tune_id"
prmHymnTuneIDAddThis.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneIDAddThis.Size = 5
prmHymnTuneIDAddThis.Value = mguidHymnTuneID
ldbcmdCommandAddThis.Parameters.Add(prmHymnTuneIDAddThis)
Dim lintRowsAffectedAddThis As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommandAddThis)
If lintRowsAffectedAddThis > 0 Then
m_blnObjectAlreadyPersisted = True
Return True
Else
Return False
End If
End If
Catch
Return False
End Try
End Function
Public Function DuplicateExists(ByVal lstrHymnTuneNameToCheck As String) As Boolean
Try
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymn_tune_name_by_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneName As New SqlClient.SqlParameter
prmHymnTuneName.ParameterName = "@hymn_tune_name"
prmHymnTuneName.SqlDbType = SqlDbType.VarChar
prmHymnTuneName.Size = MyGlobals.HYMN_TUNE_NAME_SIZE
prmHymnTuneName.Value = lstrHymnTuneNameToCheck
ldbcmdCommand.Parameters.Add(prmHymnTuneName)
Dim ldbdsHymnTuneNames As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnTuneNames.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsHymnTuneNames.Tables(0).Rows
If mguidHymnTuneNameID.Equals(CType(ldbrwRow.Item("hymn_tune_name_id"), Guid)) Then
'OK
Else
ldbdsHymnTuneNames.Clear()
Return True
End If
Next
End If
ldbdsHymnTuneNames.Clear()
Return False
Catch
Return False
End Try
End Function
Public Property HymnTuneNameID() As Guid
Get
Return mguidHymnTuneNameID
End Get
Set(ByVal lguidValue As Guid)
mguidHymnTuneNameID = lguidValue
End Set
End Property
Public Property HymnTuneName() As String
Get
Return mstrHymnTuneName
End Get
Set(ByVal sValue As String)
mstrHymnTuneName = sValue.Trim
End Set
End Property
Public Property HymnTuneID() As Guid
Get
Return mguidHymnTuneID
End Get
Set(ByVal lguidValue As Guid)
mguidHymnTuneID = lguidValue
End Set
End Property
Public ReadOnly Property OtherHymnTuneNamesForTune() As SortedList
Get
Return m_OtherHymnTuneNamesForTune
End Get
End Property
Protected WriteOnly Property OtherHymnTuneNamesForTuneForCloning() As SortedList
Set(ByVal Value As SortedList)
m_OtherHymnTuneNamesForTune = Value
End Set
End Property
Public Sub AddAlternateHymnTuneName(ByVal lobjHymnTuneName As clsHymnTuneName)
AddAlternateTuneNameToList(lobjHymnTuneName, m_OtherHymnTuneNamesForTune)
End Sub
Public Sub RemoveAlternateHymnTuneName(ByVal lobjHymnTuneName As clsHymnTuneName)
RemoveAlternateTuneNameFromList(lobjHymnTuneName, m_OtherHymnTuneNamesForTune)
End Sub
Public Sub RemoveAlternateHymnTuneName(ByVal lstrHymnTuneName As String)
RemoveAlternateTuneNameFromList(lstrHymnTuneName, m_OtherHymnTuneNamesForTune)
End Sub
Public Property ItemAlreadyPersisted() As Boolean
Get
Return m_blnObjectAlreadyPersisted
End Get
Set(ByVal Value As Boolean)
m_blnObjectAlreadyPersisted = Value
End Set
End Property
Public Function Clone() As Object Implements ICloneable.Clone
Dim lobjReturnValue As New clsHymnTuneName
lobjReturnValue.HymnTuneNameID = Me.HymnTuneNameID
lobjReturnValue.HymnTuneName = Me.HymnTuneName
lobjReturnValue.HymnTuneID = Me.HymnTuneID
lobjReturnValue.OtherHymnTuneNamesForTuneForCloning = CType(Me.OtherHymnTuneNamesForTune.Clone, SortedList)
lobjReturnValue.ItemAlreadyPersisted = Me.ItemAlreadyPersisted
Return lobjReturnValue
End Function
Public Function StateIsIdentical(ByVal lobjOtherHymnTuneName As clsHymnTuneName) As Boolean
If Me.HymnTuneNameID.Equals(lobjOtherHymnTuneName.HymnTuneNameID) _
AndAlso Me.HymnTuneName = lobjOtherHymnTuneName.HymnTuneName _
AndAlso Me.HymnTuneID.Equals(lobjOtherHymnTuneName.HymnTuneID) Then
If Me.OtherHymnTuneNamesForTune.Count <> lobjOtherHymnTuneName.OtherHymnTuneNamesForTune.Count Then
Return False
End If
'We have the same number of alternate tune names.
'Just need to check from one side to see if all are on the other
' - If none were added, and the number is the same, then none could have been deleted
Dim objDictionaryEntry As DictionaryEntry
Dim objMeOtherHymnTuneNameForTune As clsHymnTuneName
For Each objDictionaryEntry In Me.OtherHymnTuneNamesForTune
objMeOtherHymnTuneNameForTune = CType(objDictionaryEntry.Value, clsHymnTuneName)
If Not lobjOtherHymnTuneName.OtherHymnTuneNamesForTune.ContainsKey(objMeOtherHymnTuneNameForTune.HymnTuneName) Then
Return False
End If
Next
Return True
Else
Return False
End If
End Function
Public Function Validate(ByRef lstrErrorString As String) As Boolean
lstrErrorString = ""
If Me.HymnTuneName.Length = 0 Then
lstrErrorString = "Hymn Tune Name is required"
Return False
End If
If Me.DuplicateExists(Me.HymnTuneName) Then
lstrErrorString = "Given Hymn Tune Name already exists"
Return False
End If
Return True
End Function
Public Function OKToDelete(ByRef lstrReferencedByString As String) As Boolean
Dim lblnReturnValue As Boolean
lblnReturnValue = True
lstrReferencedByString = ""
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymn_tune_name_isreferenced"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneNameID As New SqlClient.SqlParameter
prmHymnTuneNameID.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameID.Size = 5
prmHymnTuneNameID.Value = mguidHymnTuneNameID
ldbcmdCommand.Parameters.Add(prmHymnTuneNameID)
Dim ldbdsHymnTuneNames As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnTuneNames.Tables(0).Rows.Count > 0 Then
lblnReturnValue = False
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsHymnTuneNames.Tables(0).Rows
If Not ldbrwRow.IsNull("table_referencing_instance") Then
If lstrReferencedByString.Length = 0 Then
lstrReferencedByString = CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
Else
lstrReferencedByString = lstrReferencedByString + " and " + CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
End If
End If
Next
End If
ldbdsHymnTuneNames.Clear()
Return lblnReturnValue
End Function
Public Overrides Function ToString() As String
Return mstrHymnTuneName
End Function
Public Function GetOtherTuneNamesForTune(ByVal lguidHymnTuneNameId As Guid) As SortedList
Dim objSortedListToReturn As New SortedList
Try
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymn_tune_name_others_by_hymn_tune_name_id"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnTuneNameID As New SqlClient.SqlParameter
prmHymnTuneNameID.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameID.Size = 5
prmHymnTuneNameID.Value = lguidHymnTuneNameId
ldbcmdCommand.Parameters.Add(prmHymnTuneNameID)
Dim ldbdsHymnTuneNames As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnTuneNames.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
Dim lobjHymnTuneName As clsHymnTuneName
For Each ldbrwRow In ldbdsHymnTuneNames.Tables(0).Rows
lguidHymnTuneNameId = CType(ldbrwRow.Item("hymn_tune_name_id"), Guid)
lobjHymnTuneName = New clsHymnTuneName(lguidHymnTuneNameId, False)
AddAlternateTuneNameToList(lobjHymnTuneName, objSortedListToReturn)
Next
End If
ldbdsHymnTuneNames.Clear()
Return objSortedListToReturn
Catch
Return objSortedListToReturn
End Try
End Function
Private Sub AddAlternateTuneNameToList(ByVal lobjHymnTuneName As clsHymnTuneName, ByRef lobjSortedListToReturn As SortedList)
If lobjSortedListToReturn.ContainsKey(lobjHymnTuneName.HymnTuneName) Then
Return
End If
lobjSortedListToReturn.Add(lobjHymnTuneName.HymnTuneName, lobjHymnTuneName)
End Sub
Private Sub RemoveAlternateTuneNameFromList(ByVal lobjHymnTuneName As clsHymnTuneName, ByRef lobjSortedListToReturn As SortedList)
If lobjSortedListToReturn.ContainsKey(lobjHymnTuneName.HymnTuneName) Then
lobjSortedListToReturn.Remove(lobjHymnTuneName.HymnTuneName)
End If
End Sub
Private Sub RemoveAlternateTuneNameFromList(ByVal lstrHymnTuneName As String, ByRef lobjSortedListToReturn As SortedList)
If lobjSortedListToReturn.ContainsKey(lstrHymnTuneName) Then
lobjSortedListToReturn.Remove(lstrHymnTuneName)
End If
End Sub
Private Sub GetAddedDroppedRemainingOtherHymnTuneNamesForTune(ByVal objPersisted_OtherHymnTuneNamesForTune As SortedList, ByVal objCurrentOtherHymnTuneNamesForTune As SortedList, ByRef objAddedOtherHymnTuneNamesForTune As SortedList, ByRef objDroppedOtherHymnTuneNamesForTune As SortedList, ByRef objRemainingOtherHymnTuneNamesForTune As SortedList)
Dim objDictionaryEntry As DictionaryEntry
Dim objHymnTuneNameToCheck As clsHymnTuneName
Dim strHymnTuneNameToCheck As String
objAddedOtherHymnTuneNamesForTune = New SortedList
objDroppedOtherHymnTuneNamesForTune = New SortedList
objRemainingOtherHymnTuneNamesForTune = New SortedList
For Each objDictionaryEntry In objPersisted_OtherHymnTuneNamesForTune
objHymnTuneNameToCheck = CType(objDictionaryEntry.Value, clsHymnTuneName)
strHymnTuneNameToCheck = objHymnTuneNameToCheck.HymnTuneName
If objCurrentOtherHymnTuneNamesForTune.ContainsKey(strHymnTuneNameToCheck) Then
objRemainingOtherHymnTuneNamesForTune.Add(strHymnTuneNameToCheck, objHymnTuneNameToCheck)
Else
objDroppedOtherHymnTuneNamesForTune.Add(strHymnTuneNameToCheck, objHymnTuneNameToCheck)
End If
Next
For Each objDictionaryEntry In objCurrentOtherHymnTuneNamesForTune
objHymnTuneNameToCheck = CType(objDictionaryEntry.Value, clsHymnTuneName)
strHymnTuneNameToCheck = objHymnTuneNameToCheck.HymnTuneName
If objPersisted_OtherHymnTuneNamesForTune.ContainsKey(strHymnTuneNameToCheck) Then
'Not necessary to save to REMAINING list, as it should already be there from above
'objRemainingOtherHymnTuneNamesForTune.Add(strHymnTuneNameToCheck, objHymnTuneNameToCheck)
Else
objAddedOtherHymnTuneNamesForTune.Add(strHymnTuneNameToCheck, objHymnTuneNameToCheck)
End If
Next
End Sub
Public Sub WriteXML(ByRef objXMLWriter As XmlTextWriter)
objXMLWriter.WriteStartElement("HymnTuneName")
objXMLWriter.WriteElementString("HymnTuneNameID", Me.HymnTuneNameID.ToString)
objXMLWriter.WriteElementString("HymnTuneID", Me.HymnTuneID.ToString)
objXMLWriter.WriteElementString("HymnTuneName", Me.HymnTuneName)
objXMLWriter.WriteEndElement()
End Sub
Public Shared Function GetAllHymnTuneNames() As System.Collections.Generic.List(Of clsHymnTuneName)
Dim lguidHymnTuneNameID As Guid
Dim ldbcmdCommand As New SqlClient.SqlCommand
Dim lobjHymnTuneName As clsHymnTuneName
Dim lcolHymnTuneNames As New System.Collections.Generic.List(Of clsHymnTuneName)
ldbcmdCommand.CommandText = "sel_hymn_tune_name_all"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
Dim ldbdsHymnTuneNames As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnTuneNames.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsHymnTuneNames.Tables(0).Rows
lguidHymnTuneNameID = CType(ldbrwRow.Item("hymn_tune_name_id"), Guid)
If MyGlobals.CachedObjectExists(lguidHymnTuneNameID.ToString) Then
lobjHymnTuneName = CType(MyGlobals.CachedObjectRetrieve(lguidHymnTuneNameID.ToString), clsHymnTuneName)
Else
'lobjHymnTuneName = New clsHymnTuneName(lguidHymnTuneNameID)
lobjHymnTuneName = New clsHymnTuneName(ldbrwRow)
End If
lcolHymnTuneNames.Add(lobjHymnTuneName)
Next
End If
ldbdsHymnTuneNames.Clear()
Return lcolHymnTuneNames
End Function
Public Shared Sub AddAllHymnTuneNamesToCache()
If MyGlobals.g_objObjectTypesCached.Contains("HymnTuneNames") = False Then
GetAllHymnTuneNames()
MyGlobals.g_objObjectTypesCached.Add("HymnTuneNames")
End If
End Sub
End Class

437
clsHymnal.vb Normal file
View File

@@ -0,0 +1,437 @@
Imports System.Data
Imports System.Xml
Public Class clsHymnal
Implements ICloneable
Private mguidHymnalID As Guid
Private mstrHymnalName As String
Private mstrHymnalAbbreviation As String
Private m_blnObjectAlreadyPersisted As Boolean
Public Sub New()
mguidHymnalID = Guid.NewGuid
mstrHymnalName = ""
mstrHymnalAbbreviation = ""
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal lstrHymnalName As String)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymnal_by_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnalName As New SqlClient.SqlParameter
prmHymnalName.ParameterName = "@hymnal_name"
prmHymnalName.SqlDbType = SqlDbType.VarChar
prmHymnalName.Size = MyGlobals.HYMNAL_NAME_SIZE
prmHymnalName.Value = lstrHymnalName
ldbcmdCommand.Parameters.Add(prmHymnalName)
Dim ldbdsHymnals As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnals.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsHymnals.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
ldbdsHymnals.Clear()
m_blnObjectAlreadyPersisted = True
Else
ldbdsHymnals.Clear()
mguidHymnalID = Guid.NewGuid
mstrHymnalName = lstrHymnalName.Trim
m_blnObjectAlreadyPersisted = False
End If
End Sub
Public Sub New(ByVal lguidHymnalID As Guid)
mguidHymnalID = lguidHymnalID
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymnal"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnalID As New SqlClient.SqlParameter
prmHymnalID.ParameterName = "@hymnal_id"
prmHymnalID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnalID.Size = 5
prmHymnalID.Value = lguidHymnalID
ldbcmdCommand.Parameters.Add(prmHymnalID)
Dim ldbdsHymnals As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnals.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsHymnals.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.HymnalID.ToString)
End If
ldbdsHymnals.Clear()
End Sub
Public Sub New(ByVal ldbrwRow As DataRow)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.HymnalID.ToString)
End Sub
Private Sub PopulateFromDBRow(ByVal ldbrwRow As DataRow)
mguidHymnalID = CType(ldbrwRow.Item("hymnal_id"), Guid)
mstrHymnalName = CType(ldbrwRow.Item("hymnal_name"), String)
mstrHymnalAbbreviation = CType(ldbrwRow.Item("hymnal_abbreviation"), String)
End Sub
Public Function Delete() As Boolean
Try
MyGlobals.RemoveCachedObject(Me.HymnalID.ToString)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "del_hymnal"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnalID As New SqlClient.SqlParameter
prmHymnalID.ParameterName = "@hymnal_id"
prmHymnalID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnalID.Size = 5
prmHymnalID.Value = mguidHymnalID
ldbcmdCommand.Parameters.Add(prmHymnalID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = False
Return True
Else
Return False
End If
Catch
Return False
End Try
End Function
Public Function Save() As Boolean
Try
MyGlobals.AddCachedObject(Me, Me.HymnalID.ToString)
If m_blnObjectAlreadyPersisted Then
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "upd_hymnal"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnalID As New SqlClient.SqlParameter
prmHymnalID.ParameterName = "@hymnal_id"
prmHymnalID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnalID.Size = 5
prmHymnalID.Value = mguidHymnalID
ldbcmdCommand.Parameters.Add(prmHymnalID)
' Set up parameter for stored procedure
Dim prmHymnalName As New SqlClient.SqlParameter
prmHymnalName.ParameterName = "@hymnal_name"
prmHymnalName.SqlDbType = SqlDbType.VarChar
prmHymnalName.Size = MyGlobals.HYMNAL_NAME_SIZE
prmHymnalName.Value = mstrHymnalName
Dim prmHymnalAbbreviation As New SqlClient.SqlParameter
prmHymnalAbbreviation.ParameterName = "@hymnal_abbreviation"
prmHymnalAbbreviation.SqlDbType = SqlDbType.VarChar
prmHymnalAbbreviation.Size = MyGlobals.HYMNAL_ABBREVIATION_SIZE
prmHymnalAbbreviation.Value = mstrHymnalAbbreviation
ldbcmdCommand.Parameters.Add(prmHymnalAbbreviation)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Else
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "ins_hymnal"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnalID As New SqlClient.SqlParameter
prmHymnalID.ParameterName = "@hymnal_id"
prmHymnalID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnalID.Size = 5
prmHymnalID.Value = mguidHymnalID
ldbcmdCommand.Parameters.Add(prmHymnalID)
' Set up parameter for stored procedure
Dim prmHymnalName As New SqlClient.SqlParameter
prmHymnalName.ParameterName = "@hymnal_name"
prmHymnalName.SqlDbType = SqlDbType.VarChar
prmHymnalName.Size = MyGlobals.HYMNAL_NAME_SIZE
prmHymnalName.Value = mstrHymnalName
ldbcmdCommand.Parameters.Add(prmHymnalName)
Dim prmHymnalAbbreviation As New SqlClient.SqlParameter
prmHymnalAbbreviation.ParameterName = "@hymnal_abbreviation"
prmHymnalAbbreviation.SqlDbType = SqlDbType.VarChar
prmHymnalAbbreviation.Size = MyGlobals.HYMNAL_ABBREVIATION_SIZE
prmHymnalAbbreviation.Value = mstrHymnalAbbreviation
ldbcmdCommand.Parameters.Add(prmHymnalAbbreviation)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = True
Return True
Else
Return False
End If
End If
Catch
Return False
End Try
End Function
Public Function DuplicateHymnalNameExists(ByVal lstrHymnalNameToCheck As String) As Boolean
Try
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymnal_by_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnalName As New SqlClient.SqlParameter
prmHymnalName.ParameterName = "@hymnal_name"
prmHymnalName.SqlDbType = SqlDbType.VarChar
prmHymnalName.Size = MyGlobals.HYMNAL_NAME_SIZE
prmHymnalName.Value = lstrHymnalNameToCheck
ldbcmdCommand.Parameters.Add(prmHymnalName)
Dim ldbdsHymnals As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnals.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsHymnals.Tables(0).Rows
If mguidHymnalID.Equals(CType(ldbrwRow.Item("hymnal_id"), Guid)) Then
'OK
Else
ldbdsHymnals.Clear()
Return True
End If
Next
End If
ldbdsHymnals.Clear()
Return False
Catch
Return False
End Try
End Function
Public Function DuplicateHymnalAbbreviationExists(ByVal lstrHymnalAbbreviationToCheck As String) As Boolean
Try
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymnal_by_abbreviation"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnalAbbreviation As New SqlClient.SqlParameter
prmHymnalAbbreviation.ParameterName = "@hymnal_abbreviation"
prmHymnalAbbreviation.SqlDbType = SqlDbType.VarChar
prmHymnalAbbreviation.Size = MyGlobals.HYMNAL_ABBREVIATION_SIZE
prmHymnalAbbreviation.Value = mstrHymnalAbbreviation
ldbcmdCommand.Parameters.Add(prmHymnalAbbreviation)
Dim ldbdsHymnals As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnals.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsHymnals.Tables(0).Rows
If mguidHymnalID.Equals(CType(ldbrwRow.Item("hymnal_id"), Guid)) Then
'OK
Else
ldbdsHymnals.Clear()
Return True
End If
Next
End If
ldbdsHymnals.Clear()
Return False
Catch
Return False
End Try
End Function
Public Property HymnalID() As Guid
Get
Return mguidHymnalID
End Get
Set(ByVal lguidValue As Guid)
mguidHymnalID = lguidValue
End Set
End Property
Public Property HymnalName() As String
Get
Return mstrHymnalName
End Get
Set(ByVal sValue As String)
mstrHymnalName = sValue.Trim
End Set
End Property
Public Property HymnalAbbreviation() As String
Get
Return mstrHymnalAbbreviation
End Get
Set(ByVal sValue As String)
mstrHymnalAbbreviation = sValue.Trim
End Set
End Property
Public Property ItemAlreadyPersisted() As Boolean
Get
Return m_blnObjectAlreadyPersisted
End Get
Set(ByVal Value As Boolean)
m_blnObjectAlreadyPersisted = Value
End Set
End Property
Public Function Clone() As Object Implements ICloneable.Clone
Dim lobjReturnValue As New clsHymnal
lobjReturnValue.HymnalID = Me.HymnalID
lobjReturnValue.HymnalName = Me.HymnalName
lobjReturnValue.HymnalAbbreviation = Me.HymnalAbbreviation
lobjReturnValue.ItemAlreadyPersisted = Me.ItemAlreadyPersisted
Return lobjReturnValue
End Function
Public Function StateIsIdentical(ByVal lobjOtherHymnal As clsHymnal) As Boolean
If Me.HymnalID.Equals(lobjOtherHymnal.HymnalID) _
AndAlso Me.HymnalName = lobjOtherHymnal.HymnalName _
AndAlso Me.HymnalAbbreviation = lobjOtherHymnal.HymnalAbbreviation Then
Return True
Else
Return False
End If
End Function
Public Function Validate(ByRef lstrErrorString As String) As Boolean
lstrErrorString = ""
If Me.HymnalName.Length = 0 Then
lstrErrorString = "Hymnal Name is required"
Return False
End If
If Me.DuplicateHymnalNameExists(Me.HymnalName) Then
lstrErrorString = "Given Hymnal Name already exists"
Return False
End If
If Me.DuplicateHymnalAbbreviationExists(Me.HymnalAbbreviation) Then
lstrErrorString = "Given Hymnal Abbreviation already exists"
Return False
End If
Return True
End Function
Public Function OKToDelete(ByRef lstrReferencedByString As String) As Boolean
Dim lblnReturnValue As Boolean
lblnReturnValue = True
lstrReferencedByString = ""
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_hymnal_isreferenced"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmHymnalID As New SqlClient.SqlParameter
prmHymnalID.ParameterName = "@hymnal_id"
prmHymnalID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnalID.Size = 5
prmHymnalID.Value = mguidHymnalID
ldbcmdCommand.Parameters.Add(prmHymnalID)
Dim ldbdsHymnals As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnals.Tables(0).Rows.Count > 0 Then
lblnReturnValue = False
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsHymnals.Tables(0).Rows
If Not ldbrwRow.IsNull("table_referencing_instance") Then
If lstrReferencedByString.Length = 0 Then
lstrReferencedByString = CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
Else
lstrReferencedByString = lstrReferencedByString + " and " + CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
End If
End If
Next
End If
ldbdsHymnals.Clear()
Return lblnReturnValue
End Function
Public Overrides Function ToString() As String
Return mstrHymnalName
End Function
Public Sub WriteXML(ByRef objXMLWriter As XmlTextWriter)
objXMLWriter.WriteStartElement("Hymnal")
objXMLWriter.WriteElementString("HymnalID", Me.HymnalID.ToString)
objXMLWriter.WriteElementString("HymnalName", Me.HymnalName)
objXMLWriter.WriteElementString("HymnalAbbreviation", Me.HymnalAbbreviation)
objXMLWriter.WriteEndElement()
End Sub
Public Shared Function GetAllHymnals() As System.Collections.Generic.List(Of clsHymnal)
Dim lguidHymnalID As Guid
Dim ldbcmdCommand As New SqlClient.SqlCommand
Dim lobjHymnal As clsHymnal
Dim lcolHymnals As New System.Collections.Generic.List(Of clsHymnal)
ldbcmdCommand.CommandText = "sel_hymnal_all"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
Dim ldbdsHymnals As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsHymnals.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsHymnals.Tables(0).Rows
lguidHymnalID = CType(ldbrwRow.Item("hymnal_id"), Guid)
If MyGlobals.CachedObjectExists(lguidHymnalID.ToString) Then
lobjHymnal = CType(MyGlobals.CachedObjectRetrieve(lguidHymnalID.ToString), clsHymnal)
Else
'lobjHymnal = New clsHymnal(lguidHymnalID)
lobjHymnal = New clsHymnal(ldbrwRow)
End If
lcolHymnals.Add(lobjHymnal)
Next
End If
ldbdsHymnals.Clear()
Return lcolHymnals
End Function
Public Shared Sub AddAllHymnalsToCache()
If MyGlobals.g_objObjectTypesCached.Contains("Hymnals") = False Then
GetAllHymnals()
MyGlobals.g_objObjectTypesCached.Add("Hymnals")
End If
End Sub
End Class

370
clsInstrumentation.vb Normal file
View File

@@ -0,0 +1,370 @@
Imports System.Data
Imports System.Xml
Public Class clsInstrumentation
Implements ICloneable
Private mguidInstrumentationID As Guid
Private mstrInstrumentationName As String
Private m_blnObjectAlreadyPersisted As Boolean
Public Sub New()
mguidInstrumentationID = Guid.NewGuid
mstrInstrumentationName = ""
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal lstrInstrumentationName As String)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_instrumentation_by_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmInstrumentationName As New SqlClient.SqlParameter
prmInstrumentationName.ParameterName = "@instrumentation_name"
prmInstrumentationName.SqlDbType = SqlDbType.VarChar
prmInstrumentationName.Size = MyGlobals.INSTRUMENTATION_NAME_SIZE
prmInstrumentationName.Value = lstrInstrumentationName
ldbcmdCommand.Parameters.Add(prmInstrumentationName)
Dim ldbdsInstrumentations As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsInstrumentations.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsInstrumentations.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
ldbdsInstrumentations.Clear()
m_blnObjectAlreadyPersisted = True
Else
ldbdsInstrumentations.Clear()
mguidInstrumentationID = Guid.NewGuid
mstrInstrumentationName = lstrInstrumentationName.Trim
m_blnObjectAlreadyPersisted = False
End If
End Sub
Public Sub New(ByVal lguidInstrumentationID As Guid)
mguidInstrumentationID = lguidInstrumentationID
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_instrumentation"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmInstrumentationID As New SqlClient.SqlParameter
prmInstrumentationID.ParameterName = "@instrumentation_id"
prmInstrumentationID.SqlDbType = SqlDbType.UniqueIdentifier
'prmInstrumentationID.Size = 5
prmInstrumentationID.Value = lguidInstrumentationID
ldbcmdCommand.Parameters.Add(prmInstrumentationID)
Dim ldbdsInstrumentations As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsInstrumentations.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsInstrumentations.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.InstrumentationID.ToString)
End If
ldbdsInstrumentations.Clear()
End Sub
Public Sub New(ByVal ldbrwRow As DataRow)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.InstrumentationID.ToString)
End Sub
Private Sub PopulateFromDBRow(ByVal ldbrwRow As DataRow)
mguidInstrumentationID = CType(ldbrwRow.Item("instrumentation_id"), Guid)
mstrInstrumentationName = CType(ldbrwRow.Item("instrumentation_name"), String)
End Sub
Public Function Delete() As Boolean
Try
MyGlobals.RemoveCachedObject(Me.InstrumentationID.ToString)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "del_instrumentation"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmInstrumentationID As New SqlClient.SqlParameter
prmInstrumentationID.ParameterName = "@instrumentation_id"
prmInstrumentationID.SqlDbType = SqlDbType.UniqueIdentifier
'prmInstrumentationID.Size = 5
prmInstrumentationID.Value = mguidInstrumentationID
ldbcmdCommand.Parameters.Add(prmInstrumentationID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = False
Return True
Else
Return False
End If
Catch
Return False
End Try
End Function
Public Function Save() As Boolean
Try
MyGlobals.AddCachedObject(Me, Me.InstrumentationID.ToString)
If m_blnObjectAlreadyPersisted Then
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "upd_instrumentation"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmInstrumentationID As New SqlClient.SqlParameter
prmInstrumentationID.ParameterName = "@instrumentation_id"
prmInstrumentationID.SqlDbType = SqlDbType.UniqueIdentifier
'prmInstrumentationID.Size = 5
prmInstrumentationID.Value = mguidInstrumentationID
ldbcmdCommand.Parameters.Add(prmInstrumentationID)
' Set up parameter for stored procedure
Dim prmInstrumentationName As New SqlClient.SqlParameter
prmInstrumentationName.ParameterName = "@instrumentation_name"
prmInstrumentationName.SqlDbType = SqlDbType.VarChar
prmInstrumentationName.Size = MyGlobals.INSTRUMENTATION_NAME_SIZE
prmInstrumentationName.Value = mstrInstrumentationName
ldbcmdCommand.Parameters.Add(prmInstrumentationName)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Else
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "ins_instrumentation"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmInstrumentationID As New SqlClient.SqlParameter
prmInstrumentationID.ParameterName = "@instrumentation_id"
prmInstrumentationID.SqlDbType = SqlDbType.UniqueIdentifier
'prmInstrumentationID.Size = 5
prmInstrumentationID.Value = mguidInstrumentationID
ldbcmdCommand.Parameters.Add(prmInstrumentationID)
' Set up parameter for stored procedure
Dim prmInstrumentationName As New SqlClient.SqlParameter
prmInstrumentationName.ParameterName = "@instrumentation_name"
prmInstrumentationName.SqlDbType = SqlDbType.VarChar
prmInstrumentationName.Size = MyGlobals.INSTRUMENTATION_NAME_SIZE
prmInstrumentationName.Value = mstrInstrumentationName
ldbcmdCommand.Parameters.Add(prmInstrumentationName)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = True
Return True
Else
Return False
End If
End If
Catch
Return False
End Try
End Function
Public Function DuplicateExists(ByVal lstrInstrumentationNameToCheck As String) As Boolean
Try
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_instrumentation_by_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmInstrumentationName As New SqlClient.SqlParameter
prmInstrumentationName.ParameterName = "@instrumentation_name"
prmInstrumentationName.SqlDbType = SqlDbType.VarChar
prmInstrumentationName.Size = MyGlobals.INSTRUMENTATION_NAME_SIZE
prmInstrumentationName.Value = lstrInstrumentationNameToCheck
ldbcmdCommand.Parameters.Add(prmInstrumentationName)
Dim ldbdsInstrumentations As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsInstrumentations.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsInstrumentations.Tables(0).Rows
If mguidInstrumentationID.Equals(CType(ldbrwRow.Item("instrumentation_id"), Guid)) Then
'OK
Else
ldbdsInstrumentations.Clear()
Return True
End If
Next
End If
ldbdsInstrumentations.Clear()
Return False
Catch
Return False
End Try
End Function
Public Property InstrumentationID() As Guid
Get
Return mguidInstrumentationID
End Get
Set(ByVal lguidValue As Guid)
mguidInstrumentationID = lguidValue
End Set
End Property
Public Property InstrumentationName() As String
Get
Return mstrInstrumentationName
End Get
Set(ByVal sValue As String)
mstrInstrumentationName = sValue.Trim
End Set
End Property
Public Property ItemAlreadyPersisted() As Boolean
Get
Return m_blnObjectAlreadyPersisted
End Get
Set(ByVal Value As Boolean)
m_blnObjectAlreadyPersisted = Value
End Set
End Property
Public Function Clone() As Object Implements ICloneable.Clone
Dim lobjReturnValue As New clsInstrumentation
lobjReturnValue.InstrumentationID = Me.InstrumentationID
lobjReturnValue.InstrumentationName = Me.InstrumentationName
lobjReturnValue.ItemAlreadyPersisted = Me.ItemAlreadyPersisted
Return lobjReturnValue
End Function
Public Function StateIsIdentical(ByVal lobjOtherInstrumentation As clsInstrumentation) As Boolean
If Me.InstrumentationID.Equals(lobjOtherInstrumentation.InstrumentationID) _
AndAlso Me.InstrumentationName = lobjOtherInstrumentation.InstrumentationName Then
Return True
Else
Return False
End If
End Function
Public Function Validate(ByRef lstrErrorString As String) As Boolean
lstrErrorString = ""
If Me.InstrumentationName.Length = 0 Then
lstrErrorString = "Instrumentation Name is required"
Return False
End If
If Me.DuplicateExists(Me.InstrumentationName) Then
lstrErrorString = "Given Instrumentation Name already exists"
Return False
End If
Return True
End Function
Public Function OKToDelete(ByRef lstrReferencedByString As String) As Boolean
Dim lblnReturnValue As Boolean
lblnReturnValue = True
lstrReferencedByString = ""
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_instrumentation_isreferenced"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmInstrumentationID As New SqlClient.SqlParameter
prmInstrumentationID.ParameterName = "@instrumentation_id"
prmInstrumentationID.SqlDbType = SqlDbType.UniqueIdentifier
'prmInstrumentationID.Size = 5
prmInstrumentationID.Value = mguidInstrumentationID
ldbcmdCommand.Parameters.Add(prmInstrumentationID)
Dim ldbdsInstrumentations As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsInstrumentations.Tables(0).Rows.Count > 0 Then
lblnReturnValue = False
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsInstrumentations.Tables(0).Rows
If Not ldbrwRow.IsNull("table_referencing_instance") Then
If lstrReferencedByString.Length = 0 Then
lstrReferencedByString = CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
Else
lstrReferencedByString = lstrReferencedByString + " and " + CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
End If
End If
Next
End If
ldbdsInstrumentations.Clear()
Return lblnReturnValue
End Function
Public Overrides Function ToString() As String
Return mstrInstrumentationName
End Function
Public Sub WriteXML(ByRef objXMLWriter As XmlTextWriter)
objXMLWriter.WriteStartElement("Instrumentation")
objXMLWriter.WriteElementString("InstrumentationID", Me.InstrumentationID.ToString)
objXMLWriter.WriteElementString("InstrumentationName", Me.InstrumentationName)
objXMLWriter.WriteEndElement()
End Sub
Public Shared Function GetAllInstrumentations() As System.Collections.Generic.List(Of clsInstrumentation)
Dim lguidInstrumentationID As Guid
Dim ldbcmdCommand As New SqlClient.SqlCommand
Dim lobjInstrumentation As clsInstrumentation
Dim lcolInstrumentations As New System.Collections.Generic.List(Of clsInstrumentation)
ldbcmdCommand.CommandText = "sel_instrumentation_all"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
Dim ldbdsInstrumentations As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsInstrumentations.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsInstrumentations.Tables(0).Rows
lguidInstrumentationID = CType(ldbrwRow.Item("instrumentation_id"), Guid)
If MyGlobals.CachedObjectExists(lguidInstrumentationID.ToString) Then
lobjInstrumentation = CType(MyGlobals.CachedObjectRetrieve(lguidInstrumentationID.ToString), clsInstrumentation)
Else
'lobjInstrumentation = New clsInstrumentation(lguidInstrumentationID)
lobjInstrumentation = New clsInstrumentation(ldbrwRow)
End If
lcolInstrumentations.Add(lobjInstrumentation)
Next
End If
ldbdsInstrumentations.Clear()
Return lcolInstrumentations
End Function
Public Shared Sub AddAllInstrumentationsToCache()
If MyGlobals.g_objObjectTypesCached.Contains("Instrumentations") = False Then
GetAllInstrumentations()
MyGlobals.g_objObjectTypesCached.Add("Instrumentations")
End If
End Sub
End Class

398
clsPublisher.vb Normal file
View File

@@ -0,0 +1,398 @@
Imports System.Data
Imports System.Xml
Public Class clsPublisher
Implements ICloneable
Private mguidPublisherID As Guid
Private mstrPublisherName As String
Private mstrPublisherStreamingAllowed As String
Private m_blnObjectAlreadyPersisted As Boolean
Public Sub New()
mguidPublisherID = Guid.NewGuid
mstrPublisherName = String.Empty
mstrPublisherStreamingAllowed = "Unknown"
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal lstrPublisherName As String, ByVal lstrPublisherStreamingAllowed As String)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_publisher_by_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmPublisherName As New SqlClient.SqlParameter
prmPublisherName.ParameterName = "@publisher_name"
prmPublisherName.SqlDbType = SqlDbType.VarChar
prmPublisherName.Size = MyGlobals.PUBLISHER_NAME_SIZE
prmPublisherName.Value = lstrPublisherName
ldbcmdCommand.Parameters.Add(prmPublisherName)
Dim ldbdsPublishers As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsPublishers.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsPublishers.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
ldbdsPublishers.Clear()
m_blnObjectAlreadyPersisted = True
Else
ldbdsPublishers.Clear()
mguidPublisherID = Guid.NewGuid
mstrPublisherName = lstrPublisherName
mstrPublisherStreamingAllowed = lstrPublisherStreamingAllowed
m_blnObjectAlreadyPersisted = False
End If
End Sub
Public Sub New(ByVal lguidPublisherID As Guid)
mguidPublisherID = lguidPublisherID
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_publisher"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmPublisherID As New SqlClient.SqlParameter
prmPublisherID.ParameterName = "@publisher_id"
prmPublisherID.SqlDbType = SqlDbType.UniqueIdentifier
'prmPublisherID.Size = 5
prmPublisherID.Value = lguidPublisherID
ldbcmdCommand.Parameters.Add(prmPublisherID)
Dim ldbdsPublishers As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsPublishers.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsPublishers.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.PublisherID.ToString)
End If
ldbdsPublishers.Clear()
End Sub
Public Sub New(ByVal ldbrwRow As DataRow)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.PublisherID.ToString)
End Sub
Private Sub PopulateFromDBRow(ByVal ldbrwRow As DataRow)
mguidPublisherID = CType(ldbrwRow.Item("publisher_id"), Guid)
mstrPublisherName = CType(ldbrwRow.Item("publisher_name"), String)
mstrPublisherStreamingAllowed = CType(ldbrwRow.Item("publisher_streaming_allowed"), String)
End Sub
Public Function Delete() As Boolean
Try
MyGlobals.RemoveCachedObject(Me.PublisherID.ToString)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "del_publisher"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmPublisherID As New SqlClient.SqlParameter
prmPublisherID.ParameterName = "@publisher_id"
prmPublisherID.SqlDbType = SqlDbType.UniqueIdentifier
'prmPublisherID.Size = 5
prmPublisherID.Value = mguidPublisherID
ldbcmdCommand.Parameters.Add(prmPublisherID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Catch
Return False
End Try
End Function
Public Function Save() As Boolean
Try
MyGlobals.AddCachedObject(Me, Me.PublisherID.ToString)
If m_blnObjectAlreadyPersisted Then
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "upd_publisher"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmPublisherID As New SqlClient.SqlParameter
prmPublisherID.ParameterName = "@publisher_id"
prmPublisherID.SqlDbType = SqlDbType.UniqueIdentifier
'prmPublisherID.Size = 5
prmPublisherID.Value = mguidPublisherID
ldbcmdCommand.Parameters.Add(prmPublisherID)
' Set up parameter for stored procedure
Dim prmPublisherName As New SqlClient.SqlParameter
prmPublisherName.ParameterName = "@publisher_name"
prmPublisherName.SqlDbType = SqlDbType.VarChar
prmPublisherName.Size = MyGlobals.PUBLISHER_NAME_SIZE
prmPublisherName.Value = mstrPublisherName
ldbcmdCommand.Parameters.Add(prmPublisherName)
Dim prmPublisherStreamingAllowed As New SqlClient.SqlParameter
prmPublisherStreamingAllowed.ParameterName = "@publisher_streaming_allowed"
prmPublisherStreamingAllowed.SqlDbType = SqlDbType.VarChar
prmPublisherStreamingAllowed.Size = MyGlobals.PUBLISHER_STREAMING_ALLOWED_SIZE
prmPublisherStreamingAllowed.Value = mstrPublisherStreamingAllowed
ldbcmdCommand.Parameters.Add(prmPublisherStreamingAllowed)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Else
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "ins_publisher"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmPublisherID As New SqlClient.SqlParameter
prmPublisherID.ParameterName = "@publisher_id"
prmPublisherID.SqlDbType = SqlDbType.UniqueIdentifier
'prmPublisherID.Size = 5
prmPublisherID.Value = mguidPublisherID
ldbcmdCommand.Parameters.Add(prmPublisherID)
' Set up parameter for stored procedure
Dim prmPublisherName As New SqlClient.SqlParameter
prmPublisherName.ParameterName = "@publisher_name"
prmPublisherName.SqlDbType = SqlDbType.VarChar
prmPublisherName.Size = MyGlobals.PUBLISHER_NAME_SIZE
prmPublisherName.Value = mstrPublisherName
ldbcmdCommand.Parameters.Add(prmPublisherName)
Dim prmPublisherStreamingAllowed As New SqlClient.SqlParameter
prmPublisherStreamingAllowed.ParameterName = "@publisher_streaming_allowed"
prmPublisherStreamingAllowed.SqlDbType = SqlDbType.VarChar
prmPublisherStreamingAllowed.Size = MyGlobals.PUBLISHER_STREAMING_ALLOWED_SIZE
prmPublisherStreamingAllowed.Value = mstrPublisherStreamingAllowed
ldbcmdCommand.Parameters.Add(prmPublisherStreamingAllowed)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = True
Return True
Else
Return False
End If
End If
Catch
Return False
End Try
End Function
Public Function DuplicateExists(ByVal lstrPublisherNameToCheck As String) As Boolean
Try
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_publisher_by_name"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmPublisherName As New SqlClient.SqlParameter
prmPublisherName.ParameterName = "@publisher_name"
prmPublisherName.SqlDbType = SqlDbType.VarChar
prmPublisherName.Size = MyGlobals.PUBLISHER_NAME_SIZE
prmPublisherName.Value = lstrPublisherNameToCheck
ldbcmdCommand.Parameters.Add(prmPublisherName)
Dim ldbdsPublishers As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsPublishers.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsPublishers.Tables(0).Rows
If mguidPublisherID.Equals(CType(ldbrwRow.Item("publisher_id"), Guid)) Then
'OK
Else
ldbdsPublishers.Clear()
Return True
End If
Next
End If
ldbdsPublishers.Clear()
Return False
Catch
Return False
End Try
End Function
Public Property PublisherID() As Guid
Get
Return mguidPublisherID
End Get
Set(ByVal lguidValue As Guid)
mguidPublisherID = lguidValue
End Set
End Property
Public Property PublisherName() As String
Get
Return mstrPublisherName
End Get
Set(ByVal sValue As String)
mstrPublisherName = sValue.Trim
End Set
End Property
Public Property PublisherStreamingAllowed() As String
Get
Return mstrPublisherStreamingAllowed
End Get
Set(ByVal sValue As String)
mstrPublisherStreamingAllowed = sValue.Trim
End Set
End Property
Public Property ItemAlreadyPersisted() As Boolean
Get
Return m_blnObjectAlreadyPersisted
End Get
Set(ByVal Value As Boolean)
m_blnObjectAlreadyPersisted = Value
End Set
End Property
Public Function Clone() As Object Implements ICloneable.Clone
Dim lobjReturnValue As New clsPublisher
lobjReturnValue.PublisherID = Me.PublisherID
lobjReturnValue.PublisherName = Me.PublisherName
lobjReturnValue.PublisherStreamingAllowed = Me.PublisherStreamingAllowed
lobjReturnValue.ItemAlreadyPersisted = Me.ItemAlreadyPersisted
Return lobjReturnValue
End Function
Public Function StateIsIdentical(ByVal lobjOtherPublisher As clsPublisher) As Boolean
If Me.PublisherID.Equals(lobjOtherPublisher.PublisherID) _
AndAlso Me.PublisherName = lobjOtherPublisher.PublisherName _
AndAlso Me.PublisherStreamingAllowed = lobjOtherPublisher.PublisherStreamingAllowed Then
Return True
Else
Return False
End If
End Function
Public Function Validate(ByRef lstrErrorString As String) As Boolean
lstrErrorString = ""
If Me.PublisherName.Length = 0 Then
lstrErrorString = "Publisher Name is required"
Return False
End If
If Me.DuplicateExists(Me.PublisherName) Then
lstrErrorString = "Given Publisher Name already exists"
Return False
End If
Return True
End Function
Public Function OKToDelete(ByRef lstrReferencedByString As String) As Boolean
Dim lblnReturnValue As Boolean
lblnReturnValue = True
lstrReferencedByString = ""
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_publisher_isreferenced"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmPublisherID As New SqlClient.SqlParameter
prmPublisherID.ParameterName = "@publisher_id"
prmPublisherID.SqlDbType = SqlDbType.UniqueIdentifier
'prmPublisherID.Size = 5
prmPublisherID.Value = mguidPublisherID
ldbcmdCommand.Parameters.Add(prmPublisherID)
Dim ldbdsPublishers As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsPublishers.Tables(0).Rows.Count > 0 Then
lblnReturnValue = False
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsPublishers.Tables(0).Rows
If Not ldbrwRow.IsNull("table_referencing_instance") Then
If lstrReferencedByString.Length = 0 Then
lstrReferencedByString = CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
Else
lstrReferencedByString = lstrReferencedByString + " and " + CType(ldbrwRow.Item("table_referencing_instance"), String) + "(s)"
End If
End If
Next
End If
ldbdsPublishers.Clear()
Return lblnReturnValue
End Function
Public Overrides Function ToString() As String
Return mstrPublisherName
End Function
Public Sub WriteXML(ByRef objXMLWriter As XmlTextWriter)
objXMLWriter.WriteStartElement("Publisher")
objXMLWriter.WriteElementString("PublisherID", Me.PublisherID.ToString)
objXMLWriter.WriteElementString("PublisherName", Me.PublisherName)
objXMLWriter.WriteElementString("PublisherStreamingAllowed", Me.PublisherStreamingAllowed)
objXMLWriter.WriteEndElement()
End Sub
Public Shared Function GetAllPublishers() As System.Collections.Generic.List(Of clsPublisher)
Dim lguidPublisherID As Guid
Dim ldbcmdCommand As New SqlClient.SqlCommand
Dim lobjPublisher As clsPublisher
Dim lcolPublishers As New System.Collections.Generic.List(Of clsPublisher)
ldbcmdCommand.CommandText = "sel_publisher_all"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
Dim ldbdsPublishers As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsPublishers.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsPublishers.Tables(0).Rows
lguidPublisherID = CType(ldbrwRow.Item("publisher_id"), Guid)
If MyGlobals.CachedObjectExists(lguidPublisherID.ToString) Then
lobjPublisher = CType(MyGlobals.CachedObjectRetrieve(lguidPublisherID.ToString), clsPublisher)
Else
'lobjPublisher = New clsPublisher(lguidPublisherID)
lobjPublisher = New clsPublisher(ldbrwRow)
End If
lcolPublishers.Add(lobjPublisher)
Next
End If
ldbdsPublishers.Clear()
Return lcolPublishers
End Function
Public Shared Sub AddAllPublishersToCache()
If MyGlobals.g_objObjectTypesCached.Contains("Publishers") = False Then
GetAllPublishers()
MyGlobals.g_objObjectTypesCached.Add("Publishers")
End If
End Sub
End Class

672
clsWork.vb Normal file
View File

@@ -0,0 +1,672 @@
Imports System.Data
Imports System.Text
Imports System.Windows.Forms
Imports System.Xml
Public Class clsWork
Implements ICloneable
Private m_guidWorkID As Guid
Private m_objComposer As clsComposer
Private m_objBook As clsBook
Private m_intPageNumber As Integer
Private m_strWorkName As String
Private m_strOpusInfo As String
Private m_objInstrumentation As clsInstrumentation
Private m_objHymnTuneName As clsHymnTuneName
Private m_blnObjectAlreadyPersisted As Boolean
Public Sub New()
m_guidWorkID = Guid.NewGuid
m_objComposer = Nothing
m_objBook = Nothing
m_intPageNumber = 0
m_strWorkName = ""
m_strOpusInfo = ""
m_objInstrumentation = Nothing
m_objHymnTuneName = Nothing
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal objComposer As clsComposer, ByVal objInstrumentation As clsInstrumentation, ByVal objBook As clsBook, ByVal intPageNumber As Integer, ByVal strWorkName As String, ByVal strOpusInfo As String, ByVal objHymnTuneName As clsHymnTuneName)
m_guidWorkID = Guid.NewGuid
m_objComposer = objComposer
m_objInstrumentation = objInstrumentation
m_objBook = objBook
m_intPageNumber = intPageNumber
m_strWorkName = strWorkName
m_strOpusInfo = strOpusInfo
m_objHymnTuneName = objHymnTuneName
m_blnObjectAlreadyPersisted = False
End Sub
Public Sub New(ByVal guidWorkID As Guid)
'm_guidWorkID = guidWorkID
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "sel_work"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmWorkID As New SqlClient.SqlParameter
prmWorkID.ParameterName = "@work_id"
prmWorkID.SqlDbType = SqlDbType.UniqueIdentifier
'prmWorkID.Size = 5
prmWorkID.Value = guidWorkID
ldbcmdCommand.Parameters.Add(prmWorkID)
Dim ldbdsWorks As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsWorks.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
ldbrwRow = ldbdsWorks.Tables(0).Rows(0)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.WorkID.ToString)
Else
m_guidWorkID = Guid.NewGuid
End If
ldbdsWorks.Clear()
End Sub
Public Sub New(ByVal ldbrwRow As DataRow)
PopulateFromDBRow(ldbrwRow)
m_blnObjectAlreadyPersisted = True
MyGlobals.AddCachedObject(Me, Me.WorkID.ToString)
End Sub
Private Sub PopulateFromDBRow(ByVal ldbrwRow As DataRow)
m_guidWorkID = CType(ldbrwRow.Item("work_id"), Guid)
If ldbrwRow.IsNull("composer_id") Then
m_objComposer = Nothing
Else
Dim guidComposerID As Guid = CType(ldbrwRow.Item("composer_id"), Guid)
If MyGlobals.CachedObjectExists(guidComposerID.ToString) Then
m_objComposer = CType(MyGlobals.CachedObjectRetrieve(guidComposerID.ToString), clsComposer)
Else
m_objComposer = New clsComposer(guidComposerID)
End If
End If
If ldbrwRow.IsNull("book_id") Then
m_objBook = Nothing
Else
Dim guidBookID As Guid = CType(ldbrwRow.Item("book_id"), Guid)
If MyGlobals.CachedObjectExists(guidBookID.ToString) Then
m_objBook = CType(MyGlobals.CachedObjectRetrieve(guidBookID.ToString), clsBook)
Else
m_objBook = New clsBook(guidBookID)
End If
End If
m_intPageNumber = CType(ldbrwRow.Item("page_number"), Integer)
m_strWorkName = CType(ldbrwRow.Item("work_name"), String)
m_strOpusInfo = CType(ldbrwRow.Item("opus_info"), String)
If ldbrwRow.IsNull("instrumentation_id") Then
m_objInstrumentation = Nothing
Else
Dim guidInstrumentationID As Guid = CType(ldbrwRow.Item("instrumentation_id"), Guid)
If MyGlobals.CachedObjectExists(guidInstrumentationID.ToString) Then
m_objInstrumentation = CType(MyGlobals.CachedObjectRetrieve(guidInstrumentationID.ToString), clsInstrumentation)
Else
m_objInstrumentation = New clsInstrumentation(guidInstrumentationID)
End If
End If
If ldbrwRow.IsNull("hymn_tune_name_id") Then
m_objHymnTuneName = Nothing
Else
Dim guidHymnTuneNameID As Guid = CType(ldbrwRow.Item("hymn_tune_name_id"), Guid)
If MyGlobals.CachedObjectExists(guidHymnTuneNameID.ToString) Then
m_objHymnTuneName = CType(MyGlobals.CachedObjectRetrieve(guidHymnTuneNameID.ToString), clsHymnTuneName)
Else
m_objHymnTuneName = New clsHymnTuneName(guidHymnTuneNameID)
End If
End If
End Sub
Public Function Delete() As Boolean
Try
MyGlobals.RemoveCachedObject(Me.WorkID.ToString)
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "del_work"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmWorkID As New SqlClient.SqlParameter
prmWorkID.ParameterName = "@work_id"
prmWorkID.SqlDbType = SqlDbType.UniqueIdentifier
'prmWorkID.Size = 5
prmWorkID.Value = m_guidWorkID
ldbcmdCommand.Parameters.Add(prmWorkID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Catch
Return False
End Try
End Function
Public Function Save() As Boolean
Try
If Not m_objComposer Is Nothing Then
If Not m_objComposer.ItemAlreadyPersisted Then
m_objComposer.Save()
End If
End If
If Not m_objBook Is Nothing Then
If Not m_objBook.ItemAlreadyPersisted Then
m_objBook.Save()
End If
End If
If Not m_objHymnTuneName Is Nothing Then
If Not m_objHymnTuneName.ItemAlreadyPersisted Then
m_objHymnTuneName.Save()
End If
End If
If Not m_objInstrumentation Is Nothing Then
If Not m_objInstrumentation.ItemAlreadyPersisted Then
m_objInstrumentation.Save()
End If
End If
MyGlobals.AddCachedObject(Me, Me.WorkID.ToString)
If m_blnObjectAlreadyPersisted Then
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "upd_work"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmWorkID As New SqlClient.SqlParameter
prmWorkID.ParameterName = "@work_id"
prmWorkID.SqlDbType = SqlDbType.UniqueIdentifier
'prmWorkID.Size = 5
prmWorkID.Value = m_guidWorkID
ldbcmdCommand.Parameters.Add(prmWorkID)
' Set up parameter for stored procedure
Dim prmComposerID As New SqlClient.SqlParameter
prmComposerID.ParameterName = "@composer_id"
prmComposerID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
If m_objComposer Is Nothing Then
prmComposerID.Value = DBNull.Value
Else
prmComposerID.Value = m_objComposer.ComposerID
End If
ldbcmdCommand.Parameters.Add(prmComposerID)
' Set up parameter for stored procedure
Dim prmBookID As New SqlClient.SqlParameter
prmBookID.ParameterName = "@book_id"
prmBookID.SqlDbType = SqlDbType.UniqueIdentifier
'prmBookID.Size = 5
If m_objBook Is Nothing Then
prmBookID.Value = DBNull.Value
Else
prmBookID.Value = m_objBook.BookID
End If
ldbcmdCommand.Parameters.Add(prmBookID)
' Set up parameter for stored procedure
Dim prmPageNumber As New SqlClient.SqlParameter
prmPageNumber.ParameterName = "@page_number"
prmPageNumber.SqlDbType = SqlDbType.Int
'prmPageNumber.Size = 5
prmPageNumber.Value = m_intPageNumber
ldbcmdCommand.Parameters.Add(prmPageNumber)
' Set up parameter for stored procedure
Dim prmWorkName As New SqlClient.SqlParameter
prmWorkName.ParameterName = "@work_name"
prmWorkName.SqlDbType = SqlDbType.VarChar
prmWorkName.Size = MyGlobals.WORK_NAME_SIZE
prmWorkName.Value = m_strWorkName
ldbcmdCommand.Parameters.Add(prmWorkName)
' Set up parameter for stored procedure
Dim prmOpusInfo As New SqlClient.SqlParameter
prmOpusInfo.ParameterName = "@opus_info"
prmOpusInfo.SqlDbType = SqlDbType.VarChar
prmOpusInfo.Size = MyGlobals.OPUS_INFO_SIZE
prmOpusInfo.Value = m_strOpusInfo
ldbcmdCommand.Parameters.Add(prmOpusInfo)
' Set up parameter for stored procedure
Dim prmInstrumentationID As New SqlClient.SqlParameter
prmInstrumentationID.ParameterName = "@instrumentation_id"
prmInstrumentationID.SqlDbType = SqlDbType.UniqueIdentifier
'prmInstrumentationID.Size = MyGlobals.INSTRUMENTATION_SIZE
If m_objInstrumentation Is Nothing Then
prmInstrumentationID.Value = DBNull.Value
Else
prmInstrumentationID.Value = m_objInstrumentation.InstrumentationID
End If
ldbcmdCommand.Parameters.Add(prmInstrumentationID)
' Set up parameter for stored procedure
Dim prmHymnTuneNameID As New SqlClient.SqlParameter
prmHymnTuneNameID.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameID.Size = 5
If m_objHymnTuneName Is Nothing Then
prmHymnTuneNameID.Value = DBNull.Value
Else
prmHymnTuneNameID.Value = m_objHymnTuneName.HymnTuneNameID
End If
ldbcmdCommand.Parameters.Add(prmHymnTuneNameID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
Return True
Else
Return False
End If
Else
Dim ldbcmdCommand As New SqlClient.SqlCommand
ldbcmdCommand.CommandText = "ins_work"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
' Set up parameter for stored procedure
Dim prmWorkID As New SqlClient.SqlParameter
prmWorkID.ParameterName = "@work_id"
prmWorkID.SqlDbType = SqlDbType.UniqueIdentifier
'prmWorkID.Size = 5
prmWorkID.Value = m_guidWorkID
ldbcmdCommand.Parameters.Add(prmWorkID)
' Set up parameter for stored procedure
Dim prmComposerID As New SqlClient.SqlParameter
prmComposerID.ParameterName = "@composer_id"
prmComposerID.SqlDbType = SqlDbType.UniqueIdentifier
'prmComposerID.Size = 5
If m_objComposer Is Nothing Then
prmComposerID.Value = DBNull.Value
Else
prmComposerID.Value = m_objComposer.ComposerID
End If
ldbcmdCommand.Parameters.Add(prmComposerID)
' Set up parameter for stored procedure
Dim prmBookID As New SqlClient.SqlParameter
prmBookID.ParameterName = "@book_id"
prmBookID.SqlDbType = SqlDbType.UniqueIdentifier
'prmBookID.Size = 5
If m_objBook Is Nothing Then
prmBookID.Value = DBNull.Value
Else
prmBookID.Value = m_objBook.BookID
End If
ldbcmdCommand.Parameters.Add(prmBookID)
' Set up parameter for stored procedure
Dim prmPageNumber As New SqlClient.SqlParameter
prmPageNumber.ParameterName = "@page_number"
prmPageNumber.SqlDbType = SqlDbType.Int
'prmPageNumber.Size = 5
prmPageNumber.Value = m_intPageNumber
ldbcmdCommand.Parameters.Add(prmPageNumber)
' Set up parameter for stored procedure
Dim prmWorkName As New SqlClient.SqlParameter
prmWorkName.ParameterName = "@work_name"
prmWorkName.SqlDbType = SqlDbType.VarChar
prmWorkName.Size = MyGlobals.WORK_NAME_SIZE
prmWorkName.Value = m_strWorkName
ldbcmdCommand.Parameters.Add(prmWorkName)
' Set up parameter for stored procedure
Dim prmOpusInfo As New SqlClient.SqlParameter
prmOpusInfo.ParameterName = "@opus_info"
prmOpusInfo.SqlDbType = SqlDbType.VarChar
prmOpusInfo.Size = MyGlobals.OPUS_INFO_SIZE
prmOpusInfo.Value = m_strOpusInfo
ldbcmdCommand.Parameters.Add(prmOpusInfo)
' Set up parameter for stored procedure
Dim prmInstrumentationID As New SqlClient.SqlParameter
prmInstrumentationID.ParameterName = "@instrumentation_id"
prmInstrumentationID.SqlDbType = SqlDbType.UniqueIdentifier
'prmInstrumentationID.Size = MyGlobals.INSTRUMENTATION_SIZE
If m_objInstrumentation Is Nothing Then
prmInstrumentationID.Value = DBNull.Value
Else
prmInstrumentationID.Value = m_objInstrumentation.InstrumentationID
End If
ldbcmdCommand.Parameters.Add(prmInstrumentationID)
' Set up parameter for stored procedure
Dim prmHymnTuneNameID As New SqlClient.SqlParameter
prmHymnTuneNameID.ParameterName = "@hymn_tune_name_id"
prmHymnTuneNameID.SqlDbType = SqlDbType.UniqueIdentifier
'prmHymnTuneNameID.Size = 5
If m_objHymnTuneName Is Nothing Then
prmHymnTuneNameID.Value = DBNull.Value
Else
prmHymnTuneNameID.Value = m_objHymnTuneName.HymnTuneNameID
End If
ldbcmdCommand.Parameters.Add(prmHymnTuneNameID)
Dim lintRowsAffected As Integer = MyGlobals.g_objDatabaseLayer.ExecuteNonQuery(ldbcmdCommand)
If lintRowsAffected > 0 Then
m_blnObjectAlreadyPersisted = True
Return True
Else
Return False
End If
End If
Catch e As SqlClient.SqlException
MessageBox.Show(e.Message)
Return False
Catch
Return False
End Try
End Function
Public Property WorkID() As Guid
Get
Return m_guidWorkID
End Get
Set(ByVal Value As Guid)
m_guidWorkID = Value
End Set
End Property
Public Property Composer() As clsComposer
Get
Return m_objComposer
End Get
Set(ByVal Value As clsComposer)
m_objComposer = Value
End Set
End Property
Public Property Book() As clsBook
Get
Return m_objBook
End Get
Set(ByVal Value As clsBook)
m_objBook = Value
End Set
End Property
Public Property PageNumber() As Integer
Get
Return m_intPageNumber
End Get
Set(ByVal Value As Integer)
m_intPageNumber = Value
End Set
End Property
Public Property PageNumberAsString() As String
Get
Return m_intPageNumber.ToString
End Get
Set(ByVal Value As String)
If Val(Value) > 0 Then
m_intPageNumber = CType(Value, Integer)
Else
m_intPageNumber = 0
End If
End Set
End Property
Public Property WorkName() As String
Get
Return m_strWorkName
End Get
Set(ByVal Value As String)
m_strWorkName = Value.Trim
End Set
End Property
Public Property OpusInfo() As String
Get
Return m_strOpusInfo
End Get
Set(ByVal Value As String)
m_strOpusInfo = Value.Trim
End Set
End Property
Public Property Instrumentation() As clsInstrumentation
Get
Return m_objInstrumentation
End Get
Set(ByVal Value As clsInstrumentation)
m_objInstrumentation = Value
End Set
End Property
Public Property HymnTuneName() As clsHymnTuneName
Get
Return m_objHymnTuneName
End Get
Set(ByVal Value As clsHymnTuneName)
m_objHymnTuneName = Value
End Set
End Property
Public Property ItemAlreadyPersisted() As Boolean
Get
Return m_blnObjectAlreadyPersisted
End Get
Set(ByVal Value As Boolean)
m_blnObjectAlreadyPersisted = Value
End Set
End Property
Public Function Clone() As Object Implements ICloneable.Clone
Dim lobjReturnValue As New clsWork
lobjReturnValue.WorkID = Me.WorkID
lobjReturnValue.Composer = Me.Composer
lobjReturnValue.Book = Me.Book
lobjReturnValue.PageNumber = Me.PageNumber
lobjReturnValue.WorkName = Me.WorkName
lobjReturnValue.OpusInfo = Me.OpusInfo
lobjReturnValue.Instrumentation = Me.Instrumentation
lobjReturnValue.HymnTuneName = Me.HymnTuneName
lobjReturnValue.ItemAlreadyPersisted = Me.ItemAlreadyPersisted
Return lobjReturnValue
End Function
Public Function StateIsIdentical(ByVal lobjOtherWork As clsWork) As Boolean
Dim blnResult As Boolean
If Me.WorkID.Equals(lobjOtherWork.WorkID) _
AndAlso Me.PageNumber = lobjOtherWork.PageNumber _
AndAlso Me.WorkName = lobjOtherWork.WorkName _
AndAlso Me.OpusInfo = lobjOtherWork.OpusInfo Then
blnResult = True
If Me.Composer Is Nothing Then
If lobjOtherWork.Composer Is Nothing Then
'OK
Else
Return False
End If
Else
If lobjOtherWork.Composer Is Nothing Then
Return False
Else
blnResult = Me.Composer.ComposerID.Equals(lobjOtherWork.Composer.ComposerID)
End If
End If
If Not blnResult Then
Return False
End If
If Me.Book Is Nothing Then
If lobjOtherWork.Book Is Nothing Then
'OK
Else
Return False
End If
Else
If lobjOtherWork.Book Is Nothing Then
Return False
Else
blnResult = Me.Book.BookID.Equals(lobjOtherWork.Book.BookID)
End If
End If
If Not blnResult Then
Return False
End If
If Me.Instrumentation Is Nothing Then
If lobjOtherWork.Instrumentation Is Nothing Then
'OK
Else
Return False
End If
Else
If lobjOtherWork.Instrumentation Is Nothing Then
Return False
Else
blnResult = Me.Instrumentation.InstrumentationID.Equals(lobjOtherWork.Instrumentation.InstrumentationID)
End If
End If
If Not blnResult Then
Return False
End If
If Me.HymnTuneName Is Nothing Then
If lobjOtherWork.HymnTuneName Is Nothing Then
'OK
Else
Return False
End If
Else
If lobjOtherWork.HymnTuneName Is Nothing Then
Return False
Else
blnResult = Me.HymnTuneName.HymnTuneNameID.Equals(lobjOtherWork.HymnTuneName.HymnTuneNameID)
End If
End If
Else
Return False
End If
Return blnResult
End Function
Public Function Validate(ByRef lstrErrorString As String) As Boolean
lstrErrorString = ""
If Me.Composer Is Nothing Then
lstrErrorString = "Composer is required"
Return False
End If
If Me.Book Is Nothing Then
lstrErrorString = "Book is required"
Return False
End If
If Me.WorkName.Length = 0 Then
lstrErrorString = "Work Name is required"
Return False
End If
If Me.Instrumentation Is Nothing Then
lstrErrorString = "Instrumentation is required"
Return False
End If
Return True
End Function
Public Function OKToDelete(ByRef lstrReferencedByString As String) As Boolean
lstrReferencedByString = ""
Return True
End Function
Public Overrides Function ToString() As String
Dim strReturnString As New StringBuilder
If m_objBook Is Nothing Then
'strReturnString.Append(MyGlobals.COLLECTION_STRING)
Else
strReturnString.Append(m_objBook.BookTitle)
End If
strReturnString.Append(m_intPageNumber)
strReturnString.Append(" - ")
strReturnString.Append(m_strWorkName)
If m_objComposer Is Nothing Then
'strReturnString.Append(MyGlobals.COLLECTION_STRING)
Else
strReturnString.Append(m_objComposer.ComposerName)
End If
Return strReturnString.ToString
End Function
Public Sub WriteXML(ByRef objXMLWriter As XmlTextWriter)
objXMLWriter.WriteStartElement("Work")
objXMLWriter.WriteElementString("WorkID", Me.WorkID.ToString)
objXMLWriter.WriteElementString("WorkName", Me.WorkName)
objXMLWriter.WriteElementString("ComposerID", Me.Composer.ComposerID.ToString)
Me.Composer.WriteXML(objXMLWriter)
objXMLWriter.WriteElementString("BookID", Me.Book.BookID.ToString)
Me.Book.WriteXML(objXMLWriter)
If Me.HymnTuneName Is Nothing Then
objXMLWriter.WriteElementString("HymnTuneNameID", "")
Else
objXMLWriter.WriteElementString("HymnTuneNameID", Me.HymnTuneName.HymnTuneNameID.ToString)
Me.HymnTuneName.WriteXML(objXMLWriter)
End If
objXMLWriter.WriteElementString("OpusInfo", Me.OpusInfo)
objXMLWriter.WriteElementString("InstrumentationID", Me.Instrumentation.InstrumentationID.ToString)
Me.Instrumentation.WriteXML(objXMLWriter)
objXMLWriter.WriteElementString("PageNumber", Me.PageNumberAsString)
objXMLWriter.WriteEndElement()
End Sub
Public Shared Function GetAllWorks() As System.Collections.Generic.List(Of clsWork)
'Preload to cache
clsHymnTuneName.AddAllHymnTuneNamesToCache()
clsComposer.AddAllComposersToCache()
clsInstrumentation.AddAllInstrumentationsToCache()
clsPublisher.AddAllPublishersToCache()
clsBook.AddAllBooksToCache()
Dim lguidWorkID As Guid
Dim ldbcmdCommand As New SqlClient.SqlCommand
Dim lobjWork As clsWork
Dim lcolWorks As New System.Collections.Generic.List(Of clsWork)
ldbcmdCommand.CommandText = "sel_work_all"
ldbcmdCommand.CommandType = CommandType.StoredProcedure
Dim ldbdsWorks As DataSet = MyGlobals.g_objDatabaseLayer.ExecuteDataSet(ldbcmdCommand)
If ldbdsWorks.Tables(0).Rows.Count > 0 Then
Dim ldbrwRow As DataRow
For Each ldbrwRow In ldbdsWorks.Tables(0).Rows
lguidWorkID = CType(ldbrwRow.Item("work_id"), Guid)
If MyGlobals.CachedObjectExists(lguidWorkID.ToString) Then
lobjWork = CType(MyGlobals.CachedObjectRetrieve(lguidWorkID.ToString), clsWork)
Else
'lobjWork = New clsWork(lguidWorkID)
lobjWork = New clsWork(ldbrwRow)
End If
lcolWorks.Add(lobjWork)
Next
End If
ldbdsWorks.Clear()
Return lcolWorks
End Function
End Class

View File

@@ -0,0 +1,166 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 1.3
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object]
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object]
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used forserialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="lblAlternateHymnTuneName.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="lblAlternateHymnTuneName.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Assembly</value>
</data>
<data name="lblAlternateHymnTuneName.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Assembly</value>
</data>
<data name="lstAlternateHymnTuneNames.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Assembly</value>
</data>
<data name="lstAlternateHymnTuneNames.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="lstAlternateHymnTuneNames.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Assembly</value>
</data>
<data name="btnOK.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="btnOK.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Assembly</value>
</data>
<data name="btnOK.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Assembly</value>
</data>
<data name="btnCancel.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="btnCancel.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Assembly</value>
</data>
<data name="btnCancel.Modifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Assembly</value>
</data>
<data name="$this.Locked" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="$this.Name">
<value>frmAddAlternateHymnTuneName</value>
</data>
<data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>(Default)</value>
</data>
<data name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="$this.Localizable" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</data>
<data name="$this.GridSize" type="System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>8, 8</value>
</data>
<data name="$this.DrawGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</data>
<data name="$this.TrayHeight" type="System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>80</value>
</data>
<data name="$this.SnapToGrid" type="System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</data>
<data name="$this.DefaultModifiers" type="System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>Assembly</value>
</data>
</root>

View File

@@ -0,0 +1,158 @@
Imports System.Windows.Forms
Public Class frmAddAlternateHymnTuneName
Inherits Windows.Forms.Form
Private m_objCurrentHymnTuneName As clsHymnTuneName
Private m_objAlternateHymnTuneNameChosen As clsHymnTuneName
#Region " Windows Form Designer generated code "
Protected Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents lblAlternateHymnTuneName As Windows.Forms.Label
Friend WithEvents lstAlternateHymnTuneNames As Windows.Forms.ListBox
Friend WithEvents btnOK As Windows.Forms.Button
Friend WithEvents btnCancel As Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.lblAlternateHymnTuneName = New Windows.Forms.Label
Me.lstAlternateHymnTuneNames = New Windows.Forms.ListBox
Me.btnOK = New Windows.Forms.Button
Me.btnCancel = New Windows.Forms.Button
Me.SuspendLayout()
'
'lblAlternateHymnTuneName
'
Me.lblAlternateHymnTuneName.Location = New System.Drawing.Point(8, 8)
Me.lblAlternateHymnTuneName.Name = "lblAlternateHymnTuneName"
Me.lblAlternateHymnTuneName.Size = New System.Drawing.Size(448, 16)
Me.lblAlternateHymnTuneName.TabIndex = 0
'
'lstAlternateHymnTuneNames
'
Me.lstAlternateHymnTuneNames.Location = New System.Drawing.Point(8, 24)
Me.lstAlternateHymnTuneNames.Name = "lstAlternateHymnTuneNames"
Me.lstAlternateHymnTuneNames.Size = New System.Drawing.Size(456, 433)
Me.lstAlternateHymnTuneNames.Sorted = True
Me.lstAlternateHymnTuneNames.TabIndex = 1
'
'btnOK
'
Me.btnOK.DialogResult = Windows.Forms.DialogResult.OK
Me.btnOK.Location = New System.Drawing.Point(480, 8)
Me.btnOK.Name = "btnOK"
Me.btnOK.Size = New System.Drawing.Size(112, 24)
Me.btnOK.TabIndex = 2
Me.btnOK.Text = "&OK"
'
'btnCancel
'
Me.btnCancel.DialogResult = Windows.Forms.DialogResult.Cancel
Me.btnCancel.Location = New System.Drawing.Point(480, 40)
Me.btnCancel.Name = "btnCancel"
Me.btnCancel.Size = New System.Drawing.Size(112, 24)
Me.btnCancel.TabIndex = 3
Me.btnCancel.Text = "&Cancel"
'
'frmAddAlternateHymnTuneName
'
Me.AcceptButton = Me.btnOK
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.CancelButton = Me.btnCancel
Me.ClientSize = New System.Drawing.Size(600, 462)
Me.ControlBox = False
Me.Controls.Add(Me.btnCancel)
Me.Controls.Add(Me.btnOK)
Me.Controls.Add(Me.lstAlternateHymnTuneNames)
Me.Controls.Add(Me.lblAlternateHymnTuneName)
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "frmAddAlternateHymnTuneName"
Me.Text = "Add Alternate Hymn Tune Name"
Me.ResumeLayout(False)
End Sub
#End Region
Public Property CurrentHymnTuneName() As clsHymnTuneName
Get
Return m_objCurrentHymnTuneName
End Get
Set(ByVal Value As clsHymnTuneName)
m_objCurrentHymnTuneName = Value
End Set
End Property
Public ReadOnly Property AlternateHymnTuneNameChosen() As clsHymnTuneName
Get
Return m_objAlternateHymnTuneNameChosen
End Get
End Property
Public Sub LoadGUI(ByVal objCurrentHymnTuneName As clsHymnTuneName)
CurrentHymnTuneName = objCurrentHymnTuneName
lblAlternateHymnTuneName.Text = "Select Alternate Hymn Tune Name for: " + objCurrentHymnTuneName.HymnTuneName
Dim objHymnTuneNames As System.Collections.Generic.List(Of clsHymnTuneName) = clsHymnTuneName.GetAllHymnTuneNames()
Dim objHymnTuneName As clsHymnTuneName
For Each objHymnTuneName In objHymnTuneNames
If objHymnTuneName.HymnTuneName = objCurrentHymnTuneName.HymnTuneName Then
'Do not load this one - it is the one we are comparing to
Else
If objHymnTuneName.OtherHymnTuneNamesForTune.ContainsKey(objHymnTuneName.HymnTuneName) Then
'Do not load this one - it already matches
Else
lstAlternateHymnTuneNames.Items.Add(objHymnTuneName)
End If
End If
Next
m_objAlternateHymnTuneNameChosen = Nothing
End Sub
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
If lstAlternateHymnTuneNames.SelectedItems.Count = 0 Then
MessageBox.Show("Must select an alternate hymn tune name")
Me.DialogResult = Windows.Forms.DialogResult.None
Exit Sub
End If
m_objAlternateHymnTuneNameChosen = CType(lstAlternateHymnTuneNames.SelectedItem, clsHymnTuneName)
'This button will close the form with Dialog Result OK
End Sub
Public Shared Function GetAlternateHymnTuneNameChosen(ByVal objCurrentHymnTuneName As clsHymnTuneName) As clsHymnTuneName
Dim objFrmAddAlternateHymnTuneName As New frmAddAlternateHymnTuneName
objFrmAddAlternateHymnTuneName.LoadGUI(objCurrentHymnTuneName)
objFrmAddAlternateHymnTuneName.ShowDialog()
Dim lobjReturnValue As clsHymnTuneName = objFrmAddAlternateHymnTuneName.AlternateHymnTuneNameChosen
objFrmAddAlternateHymnTuneName.Dispose()
Return lobjReturnValue
End Function
End Class

120
frmEditBook.resx Normal file
View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

588
frmEditBook.vb Normal file
View File

@@ -0,0 +1,588 @@
Imports System.Windows.Forms
Public Class frmEditBook
Inherits OrganLit.BaseEditForm
Private mobjDetailBook As New clsBook
Private m_objComposersHash As Hashtable
Private m_objInstrumentationsHash As Hashtable
Private m_objPublishersHash As Hashtable
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents lblBookTitle As Windows.Forms.Label
Friend WithEvents txtBookTitle As Windows.Forms.TextBox
Friend WithEvents lblComposer As Windows.Forms.Label
Friend WithEvents cboComposer As ComboTypeAhead.ComboTypeAhead
Friend WithEvents lblPublisher As Windows.Forms.Label
Friend WithEvents cboPublisher As ComboTypeAhead.ComboTypeAhead
Friend WithEvents cboInstrumentation As ComboTypeAhead.ComboTypeAhead
Friend WithEvents lblInstrumentation As Windows.Forms.Label
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.lblBookTitle = New Windows.Forms.Label
Me.txtBookTitle = New Windows.Forms.TextBox
Me.lblComposer = New Windows.Forms.Label
Me.cboComposer = New ComboTypeAhead.ComboTypeAhead
Me.lblPublisher = New Windows.Forms.Label
Me.cboPublisher = New ComboTypeAhead.ComboTypeAhead
Me.cboInstrumentation = New ComboTypeAhead.ComboTypeAhead
Me.lblInstrumentation = New Windows.Forms.Label
Me.fraAddEdit.SuspendLayout()
Me.SuspendLayout()
'
'fraAddEdit
'
Me.fraAddEdit.Controls.Add(Me.cboInstrumentation)
Me.fraAddEdit.Controls.Add(Me.lblInstrumentation)
Me.fraAddEdit.Controls.Add(Me.cboPublisher)
Me.fraAddEdit.Controls.Add(Me.lblPublisher)
Me.fraAddEdit.Controls.Add(Me.cboComposer)
Me.fraAddEdit.Controls.Add(Me.lblComposer)
Me.fraAddEdit.Controls.Add(Me.txtBookTitle)
Me.fraAddEdit.Controls.Add(Me.lblBookTitle)
Me.fraAddEdit.Location = New System.Drawing.Point(10, 438)
Me.fraAddEdit.Size = New System.Drawing.Size(1064, 142)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblBookTitle, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtBookTitle, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblComposer, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.cboComposer, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblPublisher, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.cboPublisher, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblInstrumentation, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.cboInstrumentation, 0)
'
'lblBookTitle
'
Me.lblBookTitle.Location = New System.Drawing.Point(16, 24)
Me.lblBookTitle.Name = "lblBookTitle"
Me.lblBookTitle.Size = New System.Drawing.Size(96, 16)
Me.lblBookTitle.TabIndex = 3
Me.lblBookTitle.Text = "Book Title"
'
'txtBookTitle
'
Me.txtBookTitle.Location = New System.Drawing.Point(109, 24)
Me.txtBookTitle.Name = "txtBookTitle"
Me.txtBookTitle.Size = New System.Drawing.Size(424, 20)
Me.txtBookTitle.TabIndex = 4
'
'lblComposer
'
Me.lblComposer.Location = New System.Drawing.Point(16, 48)
Me.lblComposer.Name = "lblComposer"
Me.lblComposer.Size = New System.Drawing.Size(80, 16)
Me.lblComposer.TabIndex = 5
Me.lblComposer.Text = "Composer"
'
'cboComposer
'
Me.cboComposer.Location = New System.Drawing.Point(109, 48)
Me.cboComposer.Name = "cboComposer"
Me.cboComposer.Size = New System.Drawing.Size(288, 21)
Me.cboComposer.Sorted = True
Me.cboComposer.TabIndex = 6
'
'lblPublisher
'
Me.lblPublisher.Location = New System.Drawing.Point(16, 107)
Me.lblPublisher.Name = "lblPublisher"
Me.lblPublisher.Size = New System.Drawing.Size(80, 16)
Me.lblPublisher.TabIndex = 9
Me.lblPublisher.Text = "Publisher"
'
'cboPublisher
'
Me.cboPublisher.Location = New System.Drawing.Point(109, 107)
Me.cboPublisher.Name = "cboPublisher"
Me.cboPublisher.Size = New System.Drawing.Size(288, 21)
Me.cboPublisher.Sorted = True
Me.cboPublisher.TabIndex = 10
'
'cboInstrumentation
'
Me.cboInstrumentation.Location = New System.Drawing.Point(109, 80)
Me.cboInstrumentation.Name = "cboInstrumentation"
Me.cboInstrumentation.Size = New System.Drawing.Size(288, 21)
Me.cboInstrumentation.Sorted = True
Me.cboInstrumentation.TabIndex = 8
'
'lblInstrumentation
'
Me.lblInstrumentation.Location = New System.Drawing.Point(16, 80)
Me.lblInstrumentation.Name = "lblInstrumentation"
Me.lblInstrumentation.Size = New System.Drawing.Size(96, 16)
Me.lblInstrumentation.TabIndex = 7
Me.lblInstrumentation.Text = "Instrumentation"
'
'frmEditBook
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(1080, 586)
Me.Name = "frmEditBook"
Me.StartPosition = Windows.Forms.FormStartPosition.Manual
Me.Text = "Edit Book"
Me.fraAddEdit.ResumeLayout(False)
Me.fraAddEdit.PerformLayout()
Me.ResumeLayout(False)
End Sub
#End Region
Protected Overrides Sub LoadExistingItemsList()
Dim lobjBook As clsBook
Dim lobjBooks As System.Collections.Generic.List(Of clsBook)
SetUpExistingItemsHeaders()
lobjBooks = clsBook.GetAllBooks
Me.ExistingItemsListSuspendLayout()
For Each lobjBook In lobjBooks
Me.ExistingObjectsListItems.Add(ConvertBookToListViewItem(lobjBook))
Next
Me.ExistingItemsListResumeLayout()
End Sub
Private Sub SetUpExistingItemsHeaders()
Me.ExistingObjectsListColumns.Add("Composer", 300, HorizontalAlignment.Left)
Me.ExistingObjectsListColumns.Add("Book Title", 400, HorizontalAlignment.Left)
Me.ExistingObjectsListColumns.Add("Publisher", 200, HorizontalAlignment.Left)
'Set up sorting rules
Dim lobjBaseEditFormColumnSortRules(2) As clsGridColumnSortRule
lobjBaseEditFormColumnSortRules(0) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
lobjBaseEditFormColumnSortRules(0).SubColumnSort = New clsGridSubColumnSortRule(1, clsGridSubColumnSortRule.enumSortType.SortAsString, Nothing)
lobjBaseEditFormColumnSortRules(1) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
lobjBaseEditFormColumnSortRules(1).SubColumnSort = New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, Nothing)
lobjBaseEditFormColumnSortRules(2) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
lobjBaseEditFormColumnSortRules(2).SubColumnSort = New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, Nothing))
MyBaseEditFormColumnSortRules = lobjBaseEditFormColumnSortRules
End Sub
Protected Overrides Sub InitializeDetailControls()
'Load data to detail controls here at form load time
txtBookTitle.MaxLength = MyGlobals.BOOK_TITLE_SIZE
cboComposer.MaxLength = MyGlobals.COMPOSER_NAME_SIZE
cboInstrumentation.MaxLength = MyGlobals.INSTRUMENTATION_NAME_SIZE
cboPublisher.MaxLength = MyGlobals.PUBLISHER_NAME_SIZE
txtBookTitle.Text = ""
Dim objComposer As clsComposer
Dim objComposers As System.Collections.Generic.List(Of clsComposer)
If cboComposer.Items.Count = 0 Then
Me.cboComposer.Items.Clear()
m_objComposersHash = New Hashtable
objComposers = clsComposer.GetAllComposers
For Each objComposer In objComposers
AddComposerToForm(objComposer)
Next
Me.cboComposer.Items.Add(MyGlobals.COLLECTION_STRING)
End If
Dim objInstrumentation As clsInstrumentation
Dim objInstrumentations As System.Collections.Generic.List(Of clsInstrumentation)
If cboInstrumentation.Items.Count = 0 Then
Me.cboInstrumentation.Items.Clear()
m_objInstrumentationsHash = New Hashtable
objInstrumentations = clsInstrumentation.GetAllInstrumentations
For Each objInstrumentation In objInstrumentations
AddInstrumentationToForm(objInstrumentation)
Next
End If
If cboPublisher.Items.Count = 0 Then
Dim objPublisher As clsPublisher
Dim objPublishers As System.Collections.Generic.List(Of clsPublisher)
Me.cboPublisher.Items.Clear()
m_objPublishersHash = New Hashtable
objPublishers = clsPublisher.GetAllPublishers
For Each objPublisher In objPublishers
AddPublisherToForm(objPublisher)
Next
Me.cboPublisher.Items.Add(MyGlobals.NONE_STRING)
End If
End Sub
Protected Overrides Sub SetFocusToFirstDetailControlForEdit()
txtBookTitle.Focus()
End Sub
Protected Overrides Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjSavedBook As clsBook
Dim lblnReturnValue As Boolean = False
lobjSavedBook = CType(lstvwExistingItem.Tag, clsBook)
Dim objComposer As clsComposer
Select Case cboComposer.Text.ToUpper.Trim
Case MyGlobals.COLLECTION_STRING.ToUpper, ""
objComposer = Nothing
Case Else
objComposer = CType(MyGlobals.GetItemFromHashWithStringKey(cboComposer.Text.ToUpper.Trim, m_objComposersHash), clsComposer)
If objComposer Is Nothing Then
objComposer = New clsComposer(cboComposer.Text.Trim)
End If
End Select
Dim objInstrumentation As clsInstrumentation
Select Case cboInstrumentation.Text.ToUpper.Trim
Case ""
objInstrumentation = Nothing
Case Else
objInstrumentation = CType(MyGlobals.GetItemFromHashWithStringKey(cboInstrumentation.Text.ToUpper.Trim, m_objInstrumentationsHash), clsInstrumentation)
If objInstrumentation Is Nothing Then
objInstrumentation = New clsInstrumentation(cboInstrumentation.Text.Trim)
End If
End Select
Dim objPublisher As clsPublisher
Select Case cboPublisher.Text.ToUpper.Trim
Case MyGlobals.NONE_STRING.ToUpper, ""
objPublisher = Nothing
Case Else
objPublisher = CType(MyGlobals.GetItemFromHashWithStringKey(cboPublisher.Text.ToUpper.Trim, m_objPublishersHash), clsPublisher)
If objPublisher Is Nothing Then
objPublisher = New clsPublisher(cboPublisher.Text.Trim, MyGlobals.PUBLISHER_STREAMING_ALLOWED_UNKNOWN)
End If
End Select
mobjDetailBook.BookTitle = txtBookTitle.Text
mobjDetailBook.Composer = objComposer
mobjDetailBook.Instrumentation = objInstrumentation
mobjDetailBook.Publisher = objPublisher
If lobjSavedBook.StateIsIdentical(mobjDetailBook) Then
Return False
Else
Return True
End If
End Function
Protected Overrides Function DetailControlsHaveSignificantData() As Boolean
If txtBookTitle.Text.Trim.Length > 0 Then
Return True
End If
Return False
End Function
Protected Overrides Sub EmptyOutDetailControls()
InitializeDetailControls()
txtBookTitle.Text = ""
mobjDetailBook = New clsBook
End Sub
Protected Overrides Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjBook As clsBook
Dim lblnReturnValue As Boolean = False
lobjBook = CType(lstvwExistingItem.Tag, clsBook)
txtBookTitle.Text = lobjBook.BookTitle
If lobjBook.Composer Is Nothing Then
cboComposer.Text = MyGlobals.COLLECTION_STRING
Else
cboComposer.Text = lobjBook.Composer.ComposerName
End If
If lobjBook.Instrumentation Is Nothing Then
cboInstrumentation.Text = ""
Else
cboInstrumentation.Text = lobjBook.Instrumentation.InstrumentationName
End If
If lobjBook.Publisher Is Nothing Then
cboPublisher.Text = MyGlobals.NONE_STRING
Else
cboPublisher.Text = lobjBook.Publisher.PublisherName
End If
mobjDetailBook = CType(lobjBook.Clone(), clsBook)
Return True
End Function
Protected Overrides Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjBook As clsBook
Dim lstrReferencedBy As String = ""
lobjBook = CType(lstvwItemToDelete.Tag, clsBook)
If Not lobjBook.OKToDelete(lstrReferencedBy) Then
MessageBox.Show("Can't delete book: " + lobjBook.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 book: " + lobjBook.ToString + "?", "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
If ldrDialogResult = Windows.Forms.DialogResult.No Then
Return False
End If
Return True
End Function
Protected Overrides Function DeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjBook As clsBook
lobjBook = CType(lstvwItemToDelete.Tag, clsBook)
Return lobjBook.Delete()
End Function
Protected Overrides Function SaveNewItem() As Boolean
Dim lstrErrorString As String = ""
Dim lblnAddedComposer As Boolean
Dim lblnAddedInstrumentation As Boolean
Dim lblnAddedPublisher As Boolean
lblnAddedComposer = False
lblnAddedInstrumentation = False
lblnAddedPublisher = False
Dim objComposer As clsComposer
Select Case cboComposer.Text.ToUpper.Trim
Case MyGlobals.COLLECTION_STRING.ToUpper, ""
objComposer = Nothing
Case Else
objComposer = CType(MyGlobals.GetItemFromHashWithStringKey(cboComposer.Text.ToUpper.Trim, m_objComposersHash), clsComposer)
If objComposer Is Nothing Then
objComposer = New clsComposer(cboComposer.Text.Trim)
lblnAddedComposer = True
End If
End Select
Dim objInstrumentation As clsInstrumentation
Select Case cboInstrumentation.Text.ToUpper.Trim
Case ""
objInstrumentation = Nothing
Case Else
objInstrumentation = CType(MyGlobals.GetItemFromHashWithStringKey(cboInstrumentation.Text.ToUpper.Trim, m_objInstrumentationsHash), clsInstrumentation)
If objInstrumentation Is Nothing Then
objInstrumentation = New clsInstrumentation(cboInstrumentation.Text.Trim)
lblnAddedInstrumentation = True
End If
End Select
Dim objPublisher As clsPublisher
Select Case cboPublisher.Text.ToUpper.Trim
Case MyGlobals.NONE_STRING.ToUpper, ""
objPublisher = Nothing
Case Else
objPublisher = CType(MyGlobals.GetItemFromHashWithStringKey(cboPublisher.Text.ToUpper.Trim, m_objPublishersHash), clsPublisher)
If objPublisher Is Nothing Then
objPublisher = New clsPublisher(cboPublisher.Text.Trim, MyGlobals.PUBLISHER_STREAMING_ALLOWED_UNKNOWN)
lblnAddedPublisher = True
End If
End Select
mobjDetailBook.BookTitle = txtBookTitle.Text
mobjDetailBook.Composer = objComposer
mobjDetailBook.Instrumentation = objInstrumentation
mobjDetailBook.Publisher = objPublisher
If Not mobjDetailBook.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailBook.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Add(ConvertBookToListViewItem(mobjDetailBook))
If lblnAddedComposer Then
AddComposerToForm(objComposer)
End If
If lblnAddedInstrumentation Then
AddInstrumentationToForm(objInstrumentation)
End If
If lblnAddedPublisher Then
AddPublisherToForm(objPublisher)
End If
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 ConvertBookToListViewItem(ByVal lobjBook As clsBook) As ListViewItem
Dim lobjItem As ListViewItem
If lobjBook.Composer Is Nothing Then
lobjItem = New ListViewItem(MyGlobals.COLLECTION_STRING)
Else
lobjItem = New ListViewItem(lobjBook.Composer.ComposerName)
End If
lobjItem.SubItems.Add(lobjBook.BookTitle)
If lobjBook.Publisher Is Nothing Then
lobjItem.SubItems.Add(MyGlobals.NONE_STRING)
Else
lobjItem.SubItems.Add(lobjBook.Publisher.PublisherName)
End If
lobjItem.Tag = lobjBook
Return lobjItem
End Function
Protected Overrides Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lstrErrorString As String = ""
Dim lblnAddedComposer As Boolean
Dim lblnAddedInstrumentation As Boolean
Dim lblnAddedPublisher As Boolean
lblnAddedComposer = False
lblnAddedInstrumentation = False
lblnAddedPublisher = False
Dim objComposer As clsComposer
Select Case cboComposer.Text.ToUpper.Trim
Case MyGlobals.COLLECTION_STRING.ToUpper, ""
objComposer = Nothing
Case Else
objComposer = CType(MyGlobals.GetItemFromHashWithStringKey(cboComposer.Text.ToUpper.Trim, m_objComposersHash), clsComposer)
If objComposer Is Nothing Then
objComposer = New clsComposer(cboComposer.Text.Trim)
lblnAddedComposer = True
End If
End Select
Dim objInstrumentation As clsInstrumentation
Select Case cboInstrumentation.Text.ToUpper.Trim
Case ""
objInstrumentation = Nothing
Case Else
objInstrumentation = CType(MyGlobals.GetItemFromHashWithStringKey(cboInstrumentation.Text.ToUpper.Trim, m_objInstrumentationsHash), clsInstrumentation)
If objInstrumentation Is Nothing Then
objInstrumentation = New clsInstrumentation(cboInstrumentation.Text.Trim)
lblnAddedInstrumentation = True
End If
End Select
Dim objPublisher As clsPublisher
Select Case cboPublisher.Text.ToUpper.Trim
Case MyGlobals.NONE_STRING.ToUpper, ""
objPublisher = Nothing
Case Else
objPublisher = CType(MyGlobals.GetItemFromHashWithStringKey(cboPublisher.Text.ToUpper.Trim, m_objPublishersHash), clsPublisher)
If objPublisher Is Nothing Then
objPublisher = New clsPublisher(cboPublisher.Text.Trim, MyGlobals.PUBLISHER_STREAMING_ALLOWED_UNKNOWN)
lblnAddedPublisher = True
End If
End Select
mobjDetailBook.BookTitle = txtBookTitle.Text
mobjDetailBook.Composer = objComposer
mobjDetailBook.Instrumentation = objInstrumentation
mobjDetailBook.Publisher = objPublisher
If Not mobjDetailBook.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailBook.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Remove(lstvwExistingItem)
Me.ExistingObjectsListItems.Add(ConvertBookToListViewItem(mobjDetailBook))
If lblnAddedComposer Then
AddComposerToForm(objComposer)
End If
If lblnAddedInstrumentation Then
AddInstrumentationToForm(objInstrumentation)
End If
If lblnAddedPublisher Then
AddPublisherToForm(objPublisher)
End If
Return True
End Function
Private Sub txtBookTitle_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtBookTitle.TextChanged
MyBase.DetailDataHasChanged()
End Sub
Private Sub cboComposer_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboComposer.TextChanged
MyBase.DetailDataHasChanged()
End Sub
Private Sub cboInstrumentation_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboInstrumentation.TextChanged
MyBase.DetailDataHasChanged()
End Sub
Private Sub cboPublisher_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboPublisher.TextChanged
MyBase.DetailDataHasChanged()
End Sub
Protected Sub AddComposerToForm(ByVal objComposer As clsComposer)
Me.cboComposer.Items.Add(objComposer.ComposerName)
m_objComposersHash.Add(objComposer.ComposerName.ToUpper, objComposer)
End Sub
Protected Sub AddInstrumentationToForm(ByVal objInstrumentation As clsInstrumentation)
Me.cboInstrumentation.Items.Add(objInstrumentation.InstrumentationName)
m_objInstrumentationsHash.Add(objInstrumentation.InstrumentationName.ToUpper, objInstrumentation)
End Sub
Protected Sub AddPublisherToForm(ByVal objPublisher As clsPublisher)
Me.cboPublisher.Items.Add(objPublisher.PublisherName)
m_objPublishersHash.Add(objPublisher.PublisherName.ToUpper, objPublisher)
End Sub
End Class

120
frmEditComposer.resx Normal file
View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

250
frmEditComposer.vb Normal file
View File

@@ -0,0 +1,250 @@
Imports System.Windows.Forms
Public Class frmEditComposer
Inherits BaseEditForm
Private mobjDetailComposer As New clsComposer
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents lblComposerName As Windows.Forms.Label
Friend WithEvents txtComposerName As Windows.Forms.TextBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.lblComposerName = New Windows.Forms.Label
Me.txtComposerName = New Windows.Forms.TextBox
Me.fraAddEdit.SuspendLayout()
Me.SuspendLayout()
'
'fraAddEdit
'
Me.fraAddEdit.Controls.Add(Me.txtComposerName)
Me.fraAddEdit.Controls.Add(Me.lblComposerName)
Me.fraAddEdit.Location = New System.Drawing.Point(8, 412)
Me.fraAddEdit.Size = New System.Drawing.Size(1072, 116)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblComposerName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtComposerName, 0)
'
'lblComposerName
'
Me.lblComposerName.Location = New System.Drawing.Point(16, 24)
Me.lblComposerName.Name = "lblComposerName"
Me.lblComposerName.Size = New System.Drawing.Size(96, 16)
Me.lblComposerName.TabIndex = 3
Me.lblComposerName.Text = "Composer Name"
'
'txtComposerName
'
Me.txtComposerName.Location = New System.Drawing.Point(112, 24)
Me.txtComposerName.Name = "txtComposerName"
Me.txtComposerName.Size = New System.Drawing.Size(448, 20)
Me.txtComposerName.TabIndex = 4
'
'frmEditComposer
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(1088, 534)
Me.Name = "frmEditComposer"
Me.StartPosition = Windows.Forms.FormStartPosition.Manual
Me.Text = "Edit Composer"
Me.fraAddEdit.ResumeLayout(False)
Me.fraAddEdit.PerformLayout()
Me.ResumeLayout(False)
End Sub
#End Region
Protected Overrides Sub LoadExistingItemsList()
Dim lobjComposer As clsComposer
Dim lobjComposers As System.Collections.Generic.List(Of clsComposer)
SetUpExistingItemsHeaders()
lobjComposers = clsComposer.GetAllComposers
Me.ExistingItemsListSuspendLayout()
For Each lobjComposer In lobjComposers
Me.ExistingObjectsListItems.Add(ConvertComposerToListViewItem(lobjComposer))
Next
Me.ExistingItemsListResumeLayout()
End Sub
Private Sub SetUpExistingItemsHeaders()
Me.ExistingObjectsListColumns.Add("Composer Name", 800, HorizontalAlignment.Left)
'Me.ExistingObjectsListColumns.Add("Column2", 0, HorizontalAlignment.Left)
'Me.ExistingObjectsListColumns.Add("Column3", 200, HorizontalAlignment.Left)
'Set up sorting rules
Dim lobjBaseEditFormColumnSortRules(0) As clsGridColumnSortRule
lobjBaseEditFormColumnSortRules(0) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
MyBaseEditFormColumnSortRules = lobjBaseEditFormColumnSortRules
End Sub
Protected Overrides Sub InitializeDetailControls()
'Load data to detail controls here at form load time
txtComposerName.MaxLength = MyGlobals.COMPOSER_NAME_SIZE
End Sub
Protected Overrides Sub SetFocusToFirstDetailControlForEdit()
txtComposerName.Focus()
End Sub
Protected Overrides Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjSavedComposer As clsComposer
Dim lblnReturnValue As Boolean = False
lobjSavedComposer = CType(lstvwExistingItem.Tag, clsComposer)
mobjDetailComposer.ComposerName = txtComposerName.Text
If lobjSavedComposer.StateIsIdentical(mobjDetailComposer) Then
Return False
Else
Return True
End If
End Function
Protected Overrides Function DetailControlsHaveSignificantData() As Boolean
If txtComposerName.Text.Trim.Length > 0 Then
Return True
End If
Return False
End Function
Protected Overrides Sub EmptyOutDetailControls()
txtComposerName.Text = ""
mobjDetailComposer = New clsComposer
End Sub
Protected Overrides Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjComposer As clsComposer
Dim lblnReturnValue As Boolean = False
lobjComposer = CType(lstvwExistingItem.Tag, clsComposer)
txtComposerName.Text = lobjComposer.ComposerName
mobjDetailComposer = CType(lobjComposer.Clone(), clsComposer)
Return True
End Function
Protected Overrides Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjComposer As clsComposer
Dim lstrReferencedBy As String = ""
lobjComposer = CType(lstvwItemToDelete.Tag, clsComposer)
If Not lobjComposer.OKToDelete(lstrReferencedBy) Then
MessageBox.Show("Can't delete composer: " + lobjComposer.ComposerName + ". 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 composer: " + lobjComposer.ComposerName + "?", "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
If ldrDialogResult = Windows.Forms.DialogResult.No Then
Return False
End If
Return True
End Function
Protected Overrides Function DeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjComposer As clsComposer
lobjComposer = CType(lstvwItemToDelete.Tag, clsComposer)
Return lobjComposer.Delete()
End Function
Protected Overrides Function SaveNewItem() As Boolean
Dim lstrErrorString As String = ""
mobjDetailComposer.ComposerName = txtComposerName.Text
If Not mobjDetailComposer.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailComposer.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Add(ConvertComposerToListViewItem(mobjDetailComposer))
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 ConvertComposerToListViewItem(ByVal lobjComposer As clsComposer) As ListViewItem
Dim lobjItem As ListViewItem
lobjItem = New ListViewItem(lobjComposer.ComposerName)
'lobjItem.SubItems.Add("Item1Col2")
'lobjItem.SubItems.Add("Item1Col3")
lobjItem.Tag = lobjComposer
Return lobjItem
End Function
Protected Overrides Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lstrErrorString As String = ""
mobjDetailComposer.ComposerName = txtComposerName.Text
If Not mobjDetailComposer.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailComposer.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Remove(lstvwExistingItem)
Me.ExistingObjectsListItems.Add(ConvertComposerToListViewItem(mobjDetailComposer))
Return True
End Function
Private Sub txtComposerName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtComposerName.TextChanged
MyBase.DetailDataHasChanged()
End Sub
End Class

120
frmEditHymn.resx Normal file
View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

481
frmEditHymn.vb Normal file
View File

@@ -0,0 +1,481 @@
Imports System.Windows.Forms
Public Class frmEditHymn
Inherits OrganLit.BaseEditForm
Private mobjDetailHymn As New clsHymn
Private m_objHymnTuneNamesHash As Hashtable
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents lblHymnName As Windows.Forms.Label
Friend WithEvents txtHymnName As Windows.Forms.TextBox
Friend WithEvents lblHymnTuneName As Windows.Forms.Label
Friend WithEvents cboHymnTuneName As ComboTypeAhead.ComboTypeAhead
Friend WithEvents lblHymnal As Windows.Forms.Label
Friend WithEvents lblHymnNumber As Windows.Forms.Label
Friend WithEvents txtHymnNumber As Windows.Forms.TextBox
Friend WithEvents cboHymnal As Windows.Forms.ComboBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.lblHymnName = New Windows.Forms.Label
Me.txtHymnName = New Windows.Forms.TextBox
Me.lblHymnal = New Windows.Forms.Label
Me.lblHymnTuneName = New Windows.Forms.Label
Me.cboHymnTuneName = New ComboTypeAhead.ComboTypeAhead
Me.lblHymnNumber = New Windows.Forms.Label
Me.txtHymnNumber = New Windows.Forms.TextBox
Me.cboHymnal = New Windows.Forms.ComboBox
Me.fraAddEdit.SuspendLayout()
Me.SuspendLayout()
'
'fraAddEdit
'
Me.fraAddEdit.Controls.Add(Me.cboHymnal)
Me.fraAddEdit.Controls.Add(Me.txtHymnNumber)
Me.fraAddEdit.Controls.Add(Me.lblHymnNumber)
Me.fraAddEdit.Controls.Add(Me.cboHymnTuneName)
Me.fraAddEdit.Controls.Add(Me.lblHymnTuneName)
Me.fraAddEdit.Controls.Add(Me.lblHymnal)
Me.fraAddEdit.Controls.Add(Me.txtHymnName)
Me.fraAddEdit.Controls.Add(Me.lblHymnName)
Me.fraAddEdit.Location = New System.Drawing.Point(10, 475)
Me.fraAddEdit.Size = New System.Drawing.Size(1064, 117)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblHymnName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtHymnName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblHymnal, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblHymnTuneName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.cboHymnTuneName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblHymnNumber, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtHymnNumber, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.cboHymnal, 0)
'
'lblHymnName
'
Me.lblHymnName.Location = New System.Drawing.Point(16, 64)
Me.lblHymnName.Name = "lblHymnName"
Me.lblHymnName.Size = New System.Drawing.Size(96, 16)
Me.lblHymnName.TabIndex = 4
Me.lblHymnName.Text = "Hymn Name"
'
'txtHymnName
'
Me.txtHymnName.Location = New System.Drawing.Point(112, 64)
Me.txtHymnName.Name = "txtHymnName"
Me.txtHymnName.Size = New System.Drawing.Size(424, 20)
Me.txtHymnName.TabIndex = 5
'
'lblHymnal
'
Me.lblHymnal.Location = New System.Drawing.Point(16, 16)
Me.lblHymnal.Name = "lblHymnal"
Me.lblHymnal.Size = New System.Drawing.Size(80, 16)
Me.lblHymnal.TabIndex = 0
Me.lblHymnal.Text = "Hymnal"
'
'lblHymnTuneName
'
Me.lblHymnTuneName.Location = New System.Drawing.Point(16, 88)
Me.lblHymnTuneName.Name = "lblHymnTuneName"
Me.lblHymnTuneName.Size = New System.Drawing.Size(96, 16)
Me.lblHymnTuneName.TabIndex = 6
Me.lblHymnTuneName.Text = "Hymn Tune Name"
'
'cboHymnTuneName
'
Me.cboHymnTuneName.Location = New System.Drawing.Point(112, 88)
Me.cboHymnTuneName.Name = "cboHymnTuneName"
Me.cboHymnTuneName.Size = New System.Drawing.Size(288, 21)
Me.cboHymnTuneName.Sorted = True
Me.cboHymnTuneName.TabIndex = 7
'
'lblHymnNumber
'
Me.lblHymnNumber.Location = New System.Drawing.Point(16, 40)
Me.lblHymnNumber.Name = "lblHymnNumber"
Me.lblHymnNumber.Size = New System.Drawing.Size(80, 16)
Me.lblHymnNumber.TabIndex = 2
Me.lblHymnNumber.Text = "Hymn Number"
'
'txtHymnNumber
'
Me.txtHymnNumber.Location = New System.Drawing.Point(112, 40)
Me.txtHymnNumber.Name = "txtHymnNumber"
Me.txtHymnNumber.Size = New System.Drawing.Size(64, 20)
Me.txtHymnNumber.TabIndex = 3
'
'cboHymnal
'
Me.cboHymnal.DropDownStyle = Windows.Forms.ComboBoxStyle.DropDownList
Me.cboHymnal.Location = New System.Drawing.Point(112, 16)
Me.cboHymnal.Name = "cboHymnal"
Me.cboHymnal.Size = New System.Drawing.Size(424, 21)
Me.cboHymnal.Sorted = True
Me.cboHymnal.TabIndex = 1
'
'frmEditHymn
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(1080, 598)
Me.Name = "frmEditHymn"
Me.StartPosition = Windows.Forms.FormStartPosition.Manual
Me.Text = "Edit Hymn"
Me.fraAddEdit.ResumeLayout(False)
Me.fraAddEdit.PerformLayout()
Me.ResumeLayout(False)
End Sub
#End Region
Protected Overrides Sub LoadExistingItemsList()
Dim lobjHymn As clsHymn
Dim lobjHymns As System.Collections.Generic.List(Of clsHymn)
SetUpExistingItemsHeaders()
lobjHymns = clsHymn.GetAllHymns
Me.ExistingItemsListSuspendLayout()
For Each lobjHymn In lobjHymns
Me.ExistingObjectsListItems.Add(ConvertHymnToListViewItem(lobjHymn))
Next
Me.ExistingItemsListResumeLayout()
End Sub
Private Sub SetUpExistingItemsHeaders()
Me.ExistingObjectsListColumns.Add("Hymnal", 100, HorizontalAlignment.Left)
Me.ExistingObjectsListColumns.Add("Hymn Number", 100, HorizontalAlignment.Left)
Me.ExistingObjectsListColumns.Add("Hymn Name", 400, HorizontalAlignment.Left)
Me.ExistingObjectsListColumns.Add("Hymn Tune Name", 200, HorizontalAlignment.Left)
'Set up sorting rules
Dim lobjBaseEditFormColumnSortRules(3) As clsGridColumnSortRule
'First column, sort by Hymnal, then Hymn Number
lobjBaseEditFormColumnSortRules(0) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
lobjBaseEditFormColumnSortRules(0).SubColumnSort = New clsGridSubColumnSortRule(1, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing)
'Second column, sort by Hymnal, then Hymn Number
lobjBaseEditFormColumnSortRules(1) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortNone)
lobjBaseEditFormColumnSortRules(1).SubColumnSort = New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(1, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing))
'Third column, sort by Hymn name, then Hymnal and Hymn Number
lobjBaseEditFormColumnSortRules(2) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
lobjBaseEditFormColumnSortRules(2).SubColumnSort = New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(1, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing))
'Fourth column, sort by Hymn Tune name, then Hymn Name, Hymnal and Hymn Number
lobjBaseEditFormColumnSortRules(3) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
lobjBaseEditFormColumnSortRules(3).SubColumnSort = New clsGridSubColumnSortRule(2, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(1, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing)))
MyBaseEditFormColumnSortRules = lobjBaseEditFormColumnSortRules
End Sub
Protected Overrides Sub InitializeDetailControls()
'Load data to detail controls here at form load time
txtHymnName.MaxLength = MyGlobals.HYMN_NAME_SIZE
cboHymnTuneName.MaxLength = MyGlobals.HYMN_TUNE_NAME_SIZE
txtHymnNumber.Text = ""
txtHymnName.Text = ""
'Only set up hymnal if first time in
If cboHymnal.Items.Count = 0 Then
Dim objHymnal As clsHymnal
Dim objHymnals As System.Collections.Generic.List(Of clsHymnal)
Me.cboHymnal.Items.Clear()
objHymnals = clsHymnal.GetAllHymnals
For Each objHymnal In objHymnals
Me.cboHymnal.Items.Add(objHymnal)
Next
'Select first hymnal if there is one
If Me.cboHymnal.Items.Count > 0 Then
Me.cboHymnal.SelectedIndex = 0
End If
End If
If cboHymnTuneName.Items.Count = 0 Then
Dim objHymnTuneName As clsHymnTuneName
Dim objHymnTuneNames As System.Collections.Generic.List(Of clsHymnTuneName)
'Dim objObject As Object
Me.cboHymnTuneName.Items.Clear()
m_objHymnTuneNamesHash = New Hashtable
objHymnTuneNames = clsHymnTuneName.GetAllHymnTuneNames
For Each objHymnTuneName In objHymnTuneNames
AddHymnTuneNameToForm(objHymnTuneName)
Next
End If
End Sub
Protected Overrides Sub SetFocusToFirstDetailControlForEdit()
cboHymnal.Focus()
End Sub
Protected Overrides Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjSavedHymn As clsHymn
Dim lblnReturnValue As Boolean = False
lobjSavedHymn = CType(lstvwExistingItem.Tag, clsHymn)
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
mobjDetailHymn.HymnNumberAsString = txtHymnNumber.Text
mobjDetailHymn.HymnName = txtHymnName.Text
mobjDetailHymn.Hymnal = CType(cboHymnal.SelectedItem, clsHymnal)
mobjDetailHymn.HymnTuneName = objHymnTuneName
If lobjSavedHymn.StateIsIdentical(mobjDetailHymn) Then
Return False
Else
Return True
End If
End Function
Protected Overrides Function DetailControlsHaveSignificantData() As Boolean
If txtHymnName.Text.Trim.Length > 0 _
OrElse txtHymnNumber.Text.Trim.Length > 0 Then
Return True
End If
Return False
End Function
Protected Overrides Sub EmptyOutDetailControls()
InitializeDetailControls()
txtHymnNumber.Text = ""
txtHymnName.Text = ""
cboHymnTuneName.Text = ""
mobjDetailHymn = New clsHymn
End Sub
Protected Overrides Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjHymn As clsHymn
Dim lblnReturnValue As Boolean = False
lobjHymn = CType(lstvwExistingItem.Tag, clsHymn)
txtHymnNumber.Text = lobjHymn.HymnNumberAsString
txtHymnName.Text = lobjHymn.HymnName
cboHymnal.Text = lobjHymn.Hymnal.ToString
If lobjHymn.HymnTuneName Is Nothing Then
cboHymnTuneName.Text = MyGlobals.NONE_STRING
Else
cboHymnTuneName.Text = lobjHymn.HymnTuneName.HymnTuneName
End If
mobjDetailHymn = CType(lobjHymn.Clone(), clsHymn)
Return True
End Function
Protected Overrides Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjHymn As clsHymn
Dim lstrReferencedBy As String = ""
lobjHymn = CType(lstvwItemToDelete.Tag, clsHymn)
If Not lobjHymn.OKToDelete(lstrReferencedBy) Then
MessageBox.Show("Can't delete hymn: " + lobjHymn.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 hymn: " + lobjHymn.ToString + "?", "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
If ldrDialogResult = Windows.Forms.DialogResult.No Then
Return False
End If
Return True
End Function
Protected Overrides Function DeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjHymn As clsHymn
lobjHymn = CType(lstvwItemToDelete.Tag, clsHymn)
Return lobjHymn.Delete()
End Function
Protected Overrides Function SaveNewItem() As Boolean
Dim lstrErrorString As String = ""
Dim lblnAddedNewHymnTuneName As Boolean
lblnAddedNewHymnTuneName = False
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
mobjDetailHymn.HymnNumberAsString = txtHymnNumber.Text
mobjDetailHymn.HymnName = txtHymnName.Text
mobjDetailHymn.Hymnal = CType(cboHymnal.SelectedItem, clsHymnal)
mobjDetailHymn.HymnTuneName = objHymnTuneName
If Not mobjDetailHymn.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailHymn.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Add(ConvertHymnToListViewItem(mobjDetailHymn))
If lblnAddedNewHymnTuneName Then
AddHymnTuneNameToForm(objHymnTuneName)
End If
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 ConvertHymnToListViewItem(ByVal lobjHymn As clsHymn) As ListViewItem
Dim lobjItem As ListViewItem
If lobjHymn.Hymnal Is Nothing Then
lobjItem = New ListViewItem("")
Else
lobjItem = New ListViewItem(lobjHymn.Hymnal.HymnalAbbreviation)
End If
lobjItem.SubItems.Add(lobjHymn.HymnNumberAsString)
lobjItem.SubItems.Add(lobjHymn.HymnName)
If lobjHymn.HymnTuneName Is Nothing Then
lobjItem.SubItems.Add(MyGlobals.NONE_STRING)
Else
lobjItem.SubItems.Add(lobjHymn.HymnTuneName.HymnTuneName)
End If
lobjItem.Tag = lobjHymn
Return lobjItem
End Function
Protected Overrides Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lstrErrorString As String = ""
Dim lblnAddedNewHymnTuneName As Boolean
lblnAddedNewHymnTuneName = False
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
mobjDetailHymn.HymnNumberAsString = txtHymnNumber.Text
mobjDetailHymn.HymnName = txtHymnName.Text
mobjDetailHymn.Hymnal = CType(cboHymnal.SelectedItem, clsHymnal)
mobjDetailHymn.HymnTuneName = objHymnTuneName
If Not mobjDetailHymn.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailHymn.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Remove(lstvwExistingItem)
Me.ExistingObjectsListItems.Add(ConvertHymnToListViewItem(mobjDetailHymn))
If lblnAddedNewHymnTuneName Then
AddHymnTuneNameToForm(objHymnTuneName)
End If
Return True
End Function
Private Sub txtHymnName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtHymnName.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 txtHymnNumber_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtHymnNumber.TextChanged
MyBase.DetailDataHasChanged()
End Sub
Private Sub cboHymnal_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboHymnal.SelectedIndexChanged
MyBase.DetailDataHasChanged()
End Sub
Private Sub txtHymnNumber_KeyPress(ByVal sender As Object, ByVal e As Windows.Forms.KeyPressEventArgs) Handles txtHymnNumber.KeyPress
If Not MyGlobals.AllowKeypressInNumericTextBox(e.KeyChar) Then
e.Handled = True
End If
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

120
frmEditHymnTuneName.resx Normal file
View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

354
frmEditHymnTuneName.vb Normal file
View File

@@ -0,0 +1,354 @@
Imports System.Windows.Forms
Public Class frmEditHymnTuneName
Inherits BaseEditForm
Private mobjDetailHymnTuneName As New clsHymnTuneName
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents lblHymnTuneName As Windows.Forms.Label
Friend WithEvents txtHymnTuneName As Windows.Forms.TextBox
Friend WithEvents grpAlternateTuneNames As Windows.Forms.GroupBox
Friend WithEvents lstAlternateTuneNames As Windows.Forms.ListBox
Friend WithEvents btnAddAlternateHymnTuneName As Windows.Forms.Button
Friend WithEvents btnRemoveAlternateHymnTuneName As Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.lblHymnTuneName = New Windows.Forms.Label
Me.txtHymnTuneName = New Windows.Forms.TextBox
Me.grpAlternateTuneNames = New Windows.Forms.GroupBox
Me.btnRemoveAlternateHymnTuneName = New Windows.Forms.Button
Me.btnAddAlternateHymnTuneName = New Windows.Forms.Button
Me.lstAlternateTuneNames = New Windows.Forms.ListBox
Me.fraAddEdit.SuspendLayout()
Me.grpAlternateTuneNames.SuspendLayout()
Me.SuspendLayout()
'
'fraAddEdit
'
Me.fraAddEdit.Controls.Add(Me.grpAlternateTuneNames)
Me.fraAddEdit.Controls.Add(Me.txtHymnTuneName)
Me.fraAddEdit.Controls.Add(Me.lblHymnTuneName)
Me.fraAddEdit.Location = New System.Drawing.Point(8, 300)
Me.fraAddEdit.Size = New System.Drawing.Size(1072, 228)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblHymnTuneName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtHymnTuneName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.grpAlternateTuneNames, 0)
'
'lblHymnTuneName
'
Me.lblHymnTuneName.Location = New System.Drawing.Point(16, 24)
Me.lblHymnTuneName.Name = "lblHymnTuneName"
Me.lblHymnTuneName.Size = New System.Drawing.Size(96, 16)
Me.lblHymnTuneName.TabIndex = 3
Me.lblHymnTuneName.Text = "Hymn Tune Name"
'
'txtHymnTuneName
'
Me.txtHymnTuneName.Location = New System.Drawing.Point(112, 24)
Me.txtHymnTuneName.Name = "txtHymnTuneName"
Me.txtHymnTuneName.Size = New System.Drawing.Size(448, 20)
Me.txtHymnTuneName.TabIndex = 4
'
'grpAlternateTuneNames
'
Me.grpAlternateTuneNames.Controls.Add(Me.btnRemoveAlternateHymnTuneName)
Me.grpAlternateTuneNames.Controls.Add(Me.btnAddAlternateHymnTuneName)
Me.grpAlternateTuneNames.Controls.Add(Me.lstAlternateTuneNames)
Me.grpAlternateTuneNames.Location = New System.Drawing.Point(8, 48)
Me.grpAlternateTuneNames.Name = "grpAlternateTuneNames"
Me.grpAlternateTuneNames.Size = New System.Drawing.Size(552, 168)
Me.grpAlternateTuneNames.TabIndex = 5
Me.grpAlternateTuneNames.TabStop = False
Me.grpAlternateTuneNames.Text = "Alternate Tune Names for this Tune"
'
'btnRemoveAlternateHymnTuneName
'
Me.btnRemoveAlternateHymnTuneName.Location = New System.Drawing.Point(464, 48)
Me.btnRemoveAlternateHymnTuneName.Name = "btnRemoveAlternateHymnTuneName"
Me.btnRemoveAlternateHymnTuneName.Size = New System.Drawing.Size(80, 24)
Me.btnRemoveAlternateHymnTuneName.TabIndex = 2
Me.btnRemoveAlternateHymnTuneName.Text = "Remove"
'
'btnAddAlternateHymnTuneName
'
Me.btnAddAlternateHymnTuneName.Location = New System.Drawing.Point(464, 16)
Me.btnAddAlternateHymnTuneName.Name = "btnAddAlternateHymnTuneName"
Me.btnAddAlternateHymnTuneName.Size = New System.Drawing.Size(80, 24)
Me.btnAddAlternateHymnTuneName.TabIndex = 1
Me.btnAddAlternateHymnTuneName.Text = "Add..."
'
'lstAlternateTuneNames
'
Me.lstAlternateTuneNames.Location = New System.Drawing.Point(8, 16)
Me.lstAlternateTuneNames.Name = "lstAlternateTuneNames"
Me.lstAlternateTuneNames.Size = New System.Drawing.Size(440, 147)
Me.lstAlternateTuneNames.TabIndex = 0
'
'frmEditHymnTuneName
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(1088, 534)
Me.Name = "frmEditHymnTuneName"
Me.StartPosition = Windows.Forms.FormStartPosition.Manual
Me.Text = "Edit Hymn Tune Name"
Me.fraAddEdit.ResumeLayout(False)
Me.fraAddEdit.PerformLayout()
Me.grpAlternateTuneNames.ResumeLayout(False)
Me.ResumeLayout(False)
End Sub
#End Region
Protected Overrides Sub LoadExistingItemsList()
Dim lobjHymnTuneName As clsHymnTuneName
Dim lobjHymnTuneNames As System.Collections.Generic.List(Of clsHymnTuneName)
SetUpExistingItemsHeaders()
lobjHymnTuneNames = clsHymnTuneName.GetAllHymnTuneNames
Me.ExistingItemsListSuspendLayout()
For Each lobjHymnTuneName In lobjHymnTuneNames
Me.ExistingObjectsListItems.Add(ConvertHymnTuneNameToListViewItem(lobjHymnTuneName))
Next
Me.ExistingItemsListResumeLayout()
End Sub
Private Sub SetUpExistingItemsHeaders()
Me.ExistingObjectsListColumns.Add("Hymn Tune Name", 800, HorizontalAlignment.Left)
'Me.ExistingObjectsListColumns.Add("Column2", 0, HorizontalAlignment.Left)
'Me.ExistingObjectsListColumns.Add("Column3", 200, HorizontalAlignment.Left)
'Set up sorting rules
Dim lobjBaseEditFormColumnSortRules(0) As clsGridColumnSortRule
lobjBaseEditFormColumnSortRules(0) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
MyBaseEditFormColumnSortRules = lobjBaseEditFormColumnSortRules
End Sub
Protected Overrides Sub InitializeDetailControls()
'Load data to detail controls here at form load time
txtHymnTuneName.MaxLength = MyGlobals.HYMN_TUNE_NAME_SIZE
End Sub
Protected Overrides Sub SetFocusToFirstDetailControlForEdit()
txtHymnTuneName.Focus()
End Sub
Protected Overrides Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjSavedHymnTuneName As clsHymnTuneName
Dim lblnReturnValue As Boolean = False
lobjSavedHymnTuneName = CType(lstvwExistingItem.Tag, clsHymnTuneName)
mobjDetailHymnTuneName.HymnTuneName = txtHymnTuneName.Text
'Alternate tune names should already be in mobjDetailHymnTuneName
If lobjSavedHymnTuneName.StateIsIdentical(mobjDetailHymnTuneName) Then
Return False
Else
Return True
End If
End Function
Protected Overrides Function DetailControlsHaveSignificantData() As Boolean
If txtHymnTuneName.Text.Trim.Length > 0 Then
Return True
End If
Return False
End Function
Protected Overrides Sub EmptyOutDetailControls()
txtHymnTuneName.Text = ""
lstAlternateTuneNames.Items.Clear()
mobjDetailHymnTuneName = New clsHymnTuneName
End Sub
Protected Overrides Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjHymnTuneName As clsHymnTuneName
Dim lblnReturnValue As Boolean = False
lobjHymnTuneName = CType(lstvwExistingItem.Tag, clsHymnTuneName)
lobjHymnTuneName.Refresh()
txtHymnTuneName.Text = lobjHymnTuneName.HymnTuneName
Dim objDictionaryEntry As DictionaryEntry
Dim objOtherHymnTuneName As clsHymnTuneName
For Each objDictionaryEntry In lobjHymnTuneName.OtherHymnTuneNamesForTune
objOtherHymnTuneName = CType(objDictionaryEntry.Value, clsHymnTuneName)
lstAlternateTuneNames.Items.Add(objOtherHymnTuneName)
Next
mobjDetailHymnTuneName = CType(lobjHymnTuneName.Clone(), clsHymnTuneName)
Return True
End Function
Protected Overrides Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjHymnTuneName As clsHymnTuneName
Dim lstrReferencedBy As String = ""
lobjHymnTuneName = CType(lstvwItemToDelete.Tag, clsHymnTuneName)
If Not lobjHymnTuneName.OKToDelete(lstrReferencedBy) Then
MessageBox.Show("Can't delete hymn tune name: " + lobjHymnTuneName.HymnTuneName + ". 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 hymn tune name: " + lobjHymnTuneName.HymnTuneName + "?", "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
If ldrDialogResult = Windows.Forms.DialogResult.No Then
Return False
End If
Return True
End Function
Protected Overrides Function DeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjHymnTuneName As clsHymnTuneName
lobjHymnTuneName = CType(lstvwItemToDelete.Tag, clsHymnTuneName)
Return lobjHymnTuneName.Delete()
End Function
Protected Overrides Function SaveNewItem() As Boolean
Dim lstrErrorString As String = ""
mobjDetailHymnTuneName.HymnTuneName = txtHymnTuneName.Text
'Alternate tune names should already be in mobjDetailHymnTuneName
If Not mobjDetailHymnTuneName.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailHymnTuneName.Save() Then
Return False
End If
'Refresh to pick up any other alternate hymn tune names that
'may have gotten added by adding an entry
mobjDetailHymnTuneName.Refresh()
Me.ExistingObjectsListItems.Add(ConvertHymnTuneNameToListViewItem(mobjDetailHymnTuneName))
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 ConvertHymnTuneNameToListViewItem(ByVal lobjHymnTuneName As clsHymnTuneName) As ListViewItem
Dim lobjItem As ListViewItem
lobjItem = New ListViewItem(lobjHymnTuneName.HymnTuneName)
'lobjItem.SubItems.Add("Item1Col2")
'lobjItem.SubItems.Add("Item1Col3")
lobjItem.Tag = lobjHymnTuneName
Return lobjItem
End Function
Protected Overrides Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lstrErrorString As String = ""
mobjDetailHymnTuneName.HymnTuneName = txtHymnTuneName.Text
If Not mobjDetailHymnTuneName.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailHymnTuneName.Save() Then
Return False
End If
mobjDetailHymnTuneName.Refresh()
Me.ExistingObjectsListItems.Remove(lstvwExistingItem)
Me.ExistingObjectsListItems.Add(ConvertHymnTuneNameToListViewItem(mobjDetailHymnTuneName))
Return True
End Function
Private Sub txtHymnTuneName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtHymnTuneName.TextChanged
MyBase.DetailDataHasChanged()
End Sub
Private Sub btnAddAlternateHymnTuneName_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddAlternateHymnTuneName.Click
If txtHymnTuneName.Text.Trim.Length = 0 Then
MessageBox.Show("Cannot add alternate hymn tune name when no hymn tune name has been entered")
Exit Sub
End If
Dim objNewAlternateHymnTuneName As clsHymnTuneName
mobjDetailHymnTuneName.HymnTuneName = txtHymnTuneName.Text.Trim
objNewAlternateHymnTuneName = frmAddAlternateHymnTuneName.GetAlternateHymnTuneNameChosen(mobjDetailHymnTuneName)
If objNewAlternateHymnTuneName Is Nothing Then
'User cancelled
Else
lstAlternateTuneNames.Items.Add(objNewAlternateHymnTuneName)
mobjDetailHymnTuneName.AddAlternateHymnTuneName(objNewAlternateHymnTuneName)
MyBase.DetailDataHasChanged()
End If
End Sub
Private Sub btnRemoveAlternateHymnTuneName_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemoveAlternateHymnTuneName.Click
If txtHymnTuneName.Text.Trim.Length = 0 Then
MessageBox.Show("Cannot remove alternate hymn tune name when no hymn tune name has been entered")
Exit Sub
End If
If lstAlternateTuneNames.SelectedItems.Count = 0 Then
MessageBox.Show("Must select an alternate hymn tune name to remove")
Exit Sub
End If
Dim objHymnTuneNameToRemove As clsHymnTuneName
objHymnTuneNameToRemove = CType(lstAlternateTuneNames.SelectedItem, clsHymnTuneName)
mobjDetailHymnTuneName.RemoveAlternateHymnTuneName(objHymnTuneNameToRemove)
lstAlternateTuneNames.Items.RemoveAt(lstAlternateTuneNames.SelectedIndex)
MyBase.DetailDataHasChanged()
End Sub
End Class

120
frmEditHymnal.resx Normal file
View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

286
frmEditHymnal.vb Normal file
View File

@@ -0,0 +1,286 @@
Imports System.Windows.Forms
Public Class frmEditHymnal
Inherits OrganLit.BaseEditForm
Private mobjDetailHymnal As New clsHymnal
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents lblHymnalName As Windows.Forms.Label
Friend WithEvents txtHymnalName As Windows.Forms.TextBox
Friend WithEvents Label1 As Windows.Forms.Label
Friend WithEvents txtHymnalAbbreviation As Windows.Forms.TextBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.lblHymnalName = New Windows.Forms.Label
Me.txtHymnalName = New Windows.Forms.TextBox
Me.Label1 = New Windows.Forms.Label
Me.txtHymnalAbbreviation = New Windows.Forms.TextBox
Me.fraAddEdit.SuspendLayout()
Me.SuspendLayout()
'
'fraAddEdit
'
Me.fraAddEdit.Controls.Add(Me.txtHymnalAbbreviation)
Me.fraAddEdit.Controls.Add(Me.Label1)
Me.fraAddEdit.Controls.Add(Me.txtHymnalName)
Me.fraAddEdit.Controls.Add(Me.lblHymnalName)
Me.fraAddEdit.Location = New System.Drawing.Point(10, 481)
Me.fraAddEdit.Size = New System.Drawing.Size(1064, 111)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblHymnalName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtHymnalName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.Label1, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtHymnalAbbreviation, 0)
'
'lblHymnalName
'
Me.lblHymnalName.Location = New System.Drawing.Point(8, 24)
Me.lblHymnalName.Name = "lblHymnalName"
Me.lblHymnalName.Size = New System.Drawing.Size(80, 16)
Me.lblHymnalName.TabIndex = 3
Me.lblHymnalName.Text = "Hymnal Name"
'
'txtHymnalName
'
Me.txtHymnalName.Location = New System.Drawing.Point(128, 24)
Me.txtHymnalName.Name = "txtHymnalName"
Me.txtHymnalName.Size = New System.Drawing.Size(360, 20)
Me.txtHymnalName.TabIndex = 4
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(8, 56)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(112, 16)
Me.Label1.TabIndex = 5
Me.Label1.Text = "Hymnal Abbreviation"
'
'txtHymnalAbbreviation
'
Me.txtHymnalAbbreviation.Location = New System.Drawing.Point(128, 56)
Me.txtHymnalAbbreviation.Name = "txtHymnalAbbreviation"
Me.txtHymnalAbbreviation.Size = New System.Drawing.Size(88, 20)
Me.txtHymnalAbbreviation.TabIndex = 6
'
'frmEditHymnal
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(1080, 598)
Me.Name = "frmEditHymnal"
Me.StartPosition = Windows.Forms.FormStartPosition.Manual
Me.Text = "Edit Hymnal"
Me.fraAddEdit.ResumeLayout(False)
Me.fraAddEdit.PerformLayout()
Me.ResumeLayout(False)
End Sub
#End Region
Protected Overrides Sub LoadExistingItemsList()
Dim lobjHymnal As clsHymnal
Dim lcolHymnals As System.Collections.Generic.List(Of clsHymnal)
SetUpExistingItemsHeaders()
lcolHymnals = clsHymnal.GetAllHymnals
Me.ExistingItemsListSuspendLayout()
For Each lobjHymnal In lcolHymnals
Me.ExistingObjectsListItems.Add(ConvertHymnalToListViewItem(lobjHymnal))
Next
Me.ExistingItemsListResumeLayout()
End Sub
Private Sub SetUpExistingItemsHeaders()
Me.ExistingObjectsListColumns.Add("Hymnal Name", 400, HorizontalAlignment.Left)
Me.ExistingObjectsListColumns.Add("Hymnal Abbreviation", 150, HorizontalAlignment.Left)
'Me.ExistingObjectsListColumns.Add("Column3", 200, HorizontalAlignment.Left)
'Set up sorting rules
Dim lobjBaseEditFormColumnSortRules(1) As clsGridColumnSortRule
lobjBaseEditFormColumnSortRules(0) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
lobjBaseEditFormColumnSortRules(1) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
MyBaseEditFormColumnSortRules = lobjBaseEditFormColumnSortRules
End Sub
Protected Overrides Sub InitializeDetailControls()
'Load data to detail controls here at form load time
txtHymnalName.MaxLength = MyGlobals.HYMNAL_NAME_SIZE
txtHymnalAbbreviation.MaxLength = MyGlobals.HYMNAL_ABBREVIATION_SIZE
End Sub
Protected Overrides Sub SetFocusToFirstDetailControlForEdit()
txtHymnalName.Focus()
End Sub
Protected Overrides Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjSavedHymnal As clsHymnal
lobjSavedHymnal = CType(lstvwExistingItem.Tag, clsHymnal)
mobjDetailHymnal.HymnalName = txtHymnalName.Text
mobjDetailHymnal.HymnalAbbreviation = txtHymnalAbbreviation.Text
If lobjSavedHymnal.StateIsIdentical(mobjDetailHymnal) Then
Return False
Else
Return True
End If
End Function
Protected Overrides Function DetailControlsHaveSignificantData() As Boolean
If txtHymnalName.Text.Trim.Length > 0 Then
Return True
End If
If txtHymnalAbbreviation.Text.Trim.Length > 0 Then
Return True
End If
Return False
End Function
Protected Overrides Sub EmptyOutDetailControls()
txtHymnalName.Text = ""
txtHymnalAbbreviation.Text = ""
mobjDetailHymnal = New clsHymnal
End Sub
Protected Overrides Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjHymnal As clsHymnal
Dim lblnReturnValue As Boolean = False
lobjHymnal = CType(lstvwExistingItem.Tag, clsHymnal)
txtHymnalName.Text = lobjHymnal.HymnalName
mobjDetailHymnal = CType(lobjHymnal.Clone(), clsHymnal)
Return True
End Function
Protected Overrides Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjHymnal As clsHymnal
Dim lstrReferencedBy As String = ""
lobjHymnal = CType(lstvwItemToDelete.Tag, clsHymnal)
If Not lobjHymnal.OKToDelete(lstrReferencedBy) Then
MessageBox.Show("Can't delete hymnal: " + lobjHymnal.HymnalName + ". 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 hymnal: " + lobjHymnal.HymnalName + "?", "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
If ldrDialogResult = Windows.Forms.DialogResult.No Then
Return False
End If
Return True
End Function
Protected Overrides Function DeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjHymnal As clsHymnal
lobjHymnal = CType(lstvwItemToDelete.Tag, clsHymnal)
Return lobjHymnal.Delete()
End Function
Protected Overrides Function SaveNewItem() As Boolean
Dim lstrErrorString As String = ""
mobjDetailHymnal.HymnalName = txtHymnalName.Text
mobjDetailHymnal.HymnalAbbreviation = txtHymnalAbbreviation.Text
If Not mobjDetailHymnal.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailHymnal.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Add(ConvertHymnalToListViewItem(mobjDetailHymnal))
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 ConvertHymnalToListViewItem(ByVal lobjHymnal As clsHymnal) As ListViewItem
Dim lobjItem As ListViewItem
lobjItem = New ListViewItem(lobjHymnal.HymnalName)
lobjItem.SubItems.Add(lobjHymnal.HymnalAbbreviation)
'lobjItem.SubItems.Add("Item1Col3")
lobjItem.Tag = lobjHymnal
Return lobjItem
End Function
Protected Overrides Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lstrErrorString As String = ""
mobjDetailHymnal.HymnalName = txtHymnalName.Text
mobjDetailHymnal.HymnalAbbreviation = txtHymnalAbbreviation.Text
If Not mobjDetailHymnal.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailHymnal.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Remove(lstvwExistingItem)
Me.ExistingObjectsListItems.Add(ConvertHymnalToListViewItem(mobjDetailHymnal))
Return True
End Function
Private Sub txtHymnalName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtHymnalName.TextChanged
MyBase.DetailDataHasChanged()
End Sub
Private Sub txtHymnalAbbreviation_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtHymnalAbbreviation.TextChanged
MyBase.DetailDataHasChanged()
End Sub
End Class

120
frmEditInstrumentation.resx Normal file
View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

251
frmEditInstrumentation.vb Normal file
View File

@@ -0,0 +1,251 @@
Imports System.Windows.Forms
Public Class frmEditInstrumentation
Inherits BaseEditForm
Private mobjDetailInstrumentation As New clsInstrumentation
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents lblInstrumentationName As Windows.Forms.Label
Friend WithEvents txtInstrumentationName As Windows.Forms.TextBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.lblInstrumentationName = New Windows.Forms.Label
Me.txtInstrumentationName = New Windows.Forms.TextBox
Me.fraAddEdit.SuspendLayout()
Me.SuspendLayout()
'
'fraAddEdit
'
Me.fraAddEdit.Controls.Add(Me.txtInstrumentationName)
Me.fraAddEdit.Controls.Add(Me.lblInstrumentationName)
Me.fraAddEdit.Location = New System.Drawing.Point(8, 417)
Me.fraAddEdit.Size = New System.Drawing.Size(1072, 111)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblInstrumentationName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtInstrumentationName, 0)
'
'lblInstrumentationName
'
Me.lblInstrumentationName.Location = New System.Drawing.Point(16, 24)
Me.lblInstrumentationName.Name = "lblInstrumentationName"
Me.lblInstrumentationName.Size = New System.Drawing.Size(96, 16)
Me.lblInstrumentationName.TabIndex = 3
Me.lblInstrumentationName.Text = "Instrumentation"
'
'txtInstrumentationName
'
Me.txtInstrumentationName.Location = New System.Drawing.Point(112, 24)
Me.txtInstrumentationName.Name = "txtInstrumentationName"
Me.txtInstrumentationName.Size = New System.Drawing.Size(448, 20)
Me.txtInstrumentationName.TabIndex = 4
'
'frmEditInstrumentation
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(1088, 534)
Me.Name = "frmEditInstrumentation"
Me.StartPosition = Windows.Forms.FormStartPosition.Manual
Me.Text = "Edit Instrumentation"
Me.fraAddEdit.ResumeLayout(False)
Me.fraAddEdit.PerformLayout()
Me.ResumeLayout(False)
End Sub
#End Region
Protected Overrides Sub LoadExistingItemsList()
Dim lobjInstrumentation As clsInstrumentation
Dim lobjInstrumentations As System.Collections.Generic.List(Of clsInstrumentation)
SetUpExistingItemsHeaders()
lobjInstrumentations = clsInstrumentation.GetAllInstrumentations
Me.ExistingItemsListSuspendLayout()
For Each lobjInstrumentation In lobjInstrumentations
Me.ExistingObjectsListItems.Add(ConvertInstrumentationToListViewItem(lobjInstrumentation))
Next
Me.ExistingItemsListResumeLayout()
End Sub
Private Sub SetUpExistingItemsHeaders()
Me.ExistingObjectsListColumns.Add("Instrumentation Name", 800, HorizontalAlignment.Left)
'Me.ExistingObjectsListColumns.Add("Column2", 0, HorizontalAlignment.Left)
'Me.ExistingObjectsListColumns.Add("Column3", 200, HorizontalAlignment.Left)
'Set up sorting rules
Dim lobjBaseEditFormColumnSortRules(0) As clsGridColumnSortRule
lobjBaseEditFormColumnSortRules(0) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
MyBaseEditFormColumnSortRules = lobjBaseEditFormColumnSortRules
End Sub
Protected Overrides Sub InitializeDetailControls()
'Load data to detail controls here at form load time
txtInstrumentationName.MaxLength = MyGlobals.INSTRUMENTATION_NAME_SIZE
End Sub
Protected Overrides Sub SetFocusToFirstDetailControlForEdit()
txtInstrumentationName.Focus()
End Sub
Protected Overrides Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjSavedInstrumentation As clsInstrumentation
Dim lblnReturnValue As Boolean = False
lobjSavedInstrumentation = CType(lstvwExistingItem.Tag, clsInstrumentation)
mobjDetailInstrumentation.InstrumentationName = txtInstrumentationName.Text
If lobjSavedInstrumentation.StateIsIdentical(mobjDetailInstrumentation) Then
Return False
Else
Return True
End If
End Function
Protected Overrides Function DetailControlsHaveSignificantData() As Boolean
If txtInstrumentationName.Text.Trim.Length > 0 Then
Return True
End If
Return False
End Function
Protected Overrides Sub EmptyOutDetailControls()
txtInstrumentationName.Text = ""
mobjDetailInstrumentation = New clsInstrumentation
End Sub
Protected Overrides Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lobjInstrumentation As clsInstrumentation
Dim lblnReturnValue As Boolean = False
lobjInstrumentation = CType(lstvwExistingItem.Tag, clsInstrumentation)
txtInstrumentationName.Text = lobjInstrumentation.InstrumentationName
mobjDetailInstrumentation = CType(lobjInstrumentation.Clone(), clsInstrumentation)
Return True
End Function
Protected Overrides Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjInstrumentation As clsInstrumentation
Dim lstrReferencedBy As String = ""
lobjInstrumentation = CType(lstvwItemToDelete.Tag, clsInstrumentation)
If Not lobjInstrumentation.OKToDelete(lstrReferencedBy) Then
MessageBox.Show("Can't delete Instrumentation: " + lobjInstrumentation.InstrumentationName + ". 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 Instrumentation: " + lobjInstrumentation.InstrumentationName + "?", "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
If ldrDialogResult = Windows.Forms.DialogResult.No Then
Return False
End If
Return True
End Function
Protected Overrides Function DeleteExistingItem(ByVal lstvwItemToDelete As Windows.Forms.ListViewItem) As Boolean
Dim lobjInstrumentation As clsInstrumentation
lobjInstrumentation = CType(lstvwItemToDelete.Tag, clsInstrumentation)
Return lobjInstrumentation.Delete()
End Function
Protected Overrides Function SaveNewItem() As Boolean
Dim lstrErrorString As String = ""
mobjDetailInstrumentation.InstrumentationName = txtInstrumentationName.Text
If Not mobjDetailInstrumentation.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailInstrumentation.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Add(ConvertInstrumentationToListViewItem(mobjDetailInstrumentation))
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 ConvertInstrumentationToListViewItem(ByVal lobjInstrumentation As clsInstrumentation) As ListViewItem
Dim lobjItem As ListViewItem
lobjItem = New ListViewItem(lobjInstrumentation.InstrumentationName)
'lobjItem.SubItems.Add("Item1Col2")
'lobjItem.SubItems.Add("Item1Col3")
lobjItem.Tag = lobjInstrumentation
Return lobjItem
End Function
Protected Overrides Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As Windows.Forms.ListViewItem) As Boolean
Dim lstrErrorString As String = ""
mobjDetailInstrumentation.InstrumentationName = txtInstrumentationName.Text
If Not mobjDetailInstrumentation.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailInstrumentation.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Remove(lstvwExistingItem)
Me.ExistingObjectsListItems.Add(ConvertInstrumentationToListViewItem(mobjDetailInstrumentation))
Return True
End Function
Private Sub txtInstrumentationName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtInstrumentationName.TextChanged
MyBase.DetailDataHasChanged()
End Sub
End Class

60
frmEditPublisher.resx Normal file
View File

@@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

302
frmEditPublisher.vb Normal file
View File

@@ -0,0 +1,302 @@
Imports System.Windows.Forms
Public Class frmEditPublisher
Inherits BaseEditForm
Private mobjDetailPublisher As New clsPublisher
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents lblPublisherName As Windows.Forms.Label
Friend WithEvents cboStreamingAllowed As ComboBox
Friend WithEvents lblPublisherStreamingAllowed As Label
Friend WithEvents txtPublisherName As Windows.Forms.TextBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.lblPublisherName = New System.Windows.Forms.Label()
Me.txtPublisherName = New System.Windows.Forms.TextBox()
Me.lblPublisherStreamingAllowed = New System.Windows.Forms.Label()
Me.cboStreamingAllowed = New System.Windows.Forms.ComboBox()
Me.fraAddEdit.SuspendLayout()
Me.SuspendLayout()
'
'fraAddEdit
'
Me.fraAddEdit.Controls.Add(Me.cboStreamingAllowed)
Me.fraAddEdit.Controls.Add(Me.lblPublisherStreamingAllowed)
Me.fraAddEdit.Controls.Add(Me.txtPublisherName)
Me.fraAddEdit.Controls.Add(Me.lblPublisherName)
Me.fraAddEdit.Location = New System.Drawing.Point(8, 412)
Me.fraAddEdit.Size = New System.Drawing.Size(1072, 116)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblPublisherName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtPublisherName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblPublisherStreamingAllowed, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.cboStreamingAllowed, 0)
'
'lblPublisherName
'
Me.lblPublisherName.Location = New System.Drawing.Point(16, 24)
Me.lblPublisherName.Name = "lblPublisherName"
Me.lblPublisherName.Size = New System.Drawing.Size(96, 16)
Me.lblPublisherName.TabIndex = 3
Me.lblPublisherName.Text = "Publisher Name"
'
'txtPublisherName
'
Me.txtPublisherName.Location = New System.Drawing.Point(135, 24)
Me.txtPublisherName.Name = "txtPublisherName"
Me.txtPublisherName.Size = New System.Drawing.Size(448, 20)
Me.txtPublisherName.TabIndex = 4
'
'lblPublisherStreamingAllowed
'
Me.lblPublisherStreamingAllowed.Location = New System.Drawing.Point(16, 46)
Me.lblPublisherStreamingAllowed.Name = "lblPublisherStreamingAllowed"
Me.lblPublisherStreamingAllowed.Size = New System.Drawing.Size(130, 16)
Me.lblPublisherStreamingAllowed.TabIndex = 5
Me.lblPublisherStreamingAllowed.Text = "Publisher Streaming Allowed"
'
'cboPublisherStreamingAllowed
'
Me.cboStreamingAllowed.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
Me.cboStreamingAllowed.FormattingEnabled = True
Me.cboStreamingAllowed.Location = New System.Drawing.Point(135, 46)
Me.cboStreamingAllowed.Name = "cboStreamingAllowed"
Me.cboStreamingAllowed.Size = New System.Drawing.Size(120, 16)
Me.cboStreamingAllowed.TabIndex = 6
'
'frmEditComposer
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(1088, 534)
Me.Name = "frmEditComposer"
Me.StartPosition = Windows.Forms.FormStartPosition.Manual
Me.Text = "Edit Composer"
Me.fraAddEdit.ResumeLayout(False)
Me.fraAddEdit.PerformLayout()
Me.ResumeLayout(False)
End Sub
#End Region
Protected Overrides Sub LoadExistingItemsList()
Dim lobjPublisher As clsPublisher
Dim lobjPublishers As System.Collections.Generic.List(Of clsPublisher)
SetUpExistingItemsHeaders()
lobjPublishers = clsPublisher.GetAllPublishers
Me.ExistingItemsListSuspendLayout()
For Each lobjPublisher In lobjPublishers
Me.ExistingObjectsListItems.Add(ConvertPublisherToListViewItem(lobjPublisher))
Next
Me.ExistingItemsListResumeLayout()
End Sub
Private Sub SetUpExistingItemsHeaders()
Me.ExistingObjectsListColumns.Add("Publisher Name", 800, HorizontalAlignment.Left)
'Me.ExistingObjectsListColumns.Add("Column2", 0, HorizontalAlignment.Left)
'Me.ExistingObjectsListColumns.Add("Column3", 200, HorizontalAlignment.Left)
'Set up sorting rules
Dim lobjBaseEditFormColumnSortRules(0) As clsGridColumnSortRule
lobjBaseEditFormColumnSortRules(0) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString)
MyBaseEditFormColumnSortRules = lobjBaseEditFormColumnSortRules
End Sub
Protected Overrides Sub InitializeDetailControls()
'Load data to detail controls here at form load time
txtPublisherName.MaxLength = MyGlobals.PUBLISHER_NAME_SIZE
cboStreamingAllowed.Items.Clear()
cboStreamingAllowed.Items.Add(MyGlobals.PUBLISHER_STREAMING_ALLOWED_UNKNOWN)
cboStreamingAllowed.Items.Add("No")
cboStreamingAllowed.Items.Add("Yes")
cboStreamingAllowed.SelectedIndex = 0
End Sub
Protected Overrides Sub SetFocusToFirstDetailControlForEdit()
txtPublisherName.Focus()
End Sub
Protected Overrides Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As System.Windows.Forms.ListViewItem) As Boolean
Dim lobjSavedPublisher As clsPublisher
Dim lblnReturnValue As Boolean = False
lobjSavedPublisher = CType(lstvwExistingItem.Tag, clsPublisher)
mobjDetailPublisher.PublisherName = txtPublisherName.Text
mobjDetailPublisher.PublisherStreamingAllowed = cboStreamingAllowed.SelectedItem.ToString()
If lobjSavedPublisher.StateIsIdentical(mobjDetailPublisher) Then
Return False
Else
Return True
End If
End Function
Protected Overrides Function DetailControlsHaveSignificantData() As Boolean
If txtPublisherName.Text.Trim.Length > 0 Then
Return True
End If
Return False
End Function
Protected Overrides Sub EmptyOutDetailControls()
txtPublisherName.Text = String.Empty
cboStreamingAllowed.SelectedIndex = 0
mobjDetailPublisher = New clsPublisher
End Sub
Protected Overrides Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As System.Windows.Forms.ListViewItem) As Boolean
Dim lobjPublisher As clsPublisher
Dim lblnReturnValue As Boolean = False
lobjPublisher = CType(lstvwExistingItem.Tag, clsPublisher)
txtPublisherName.Text = lobjPublisher.PublisherName
Dim intSelectedIndex As Int32 = 0
Dim intIndex As Int32
For intIndex = 0 To cboStreamingAllowed.Items.Count
If String.Compare(cboStreamingAllowed.Items(intIndex).ToString, lobjPublisher.PublisherStreamingAllowed, True) = 0 Then
intSelectedIndex = intIndex
Exit For
End If
Next
cboStreamingAllowed.SelectedIndex = intSelectedIndex
mobjDetailPublisher = CType(lobjPublisher.Clone(), clsPublisher)
Return True
End Function
Protected Overrides Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As System.Windows.Forms.ListViewItem) As Boolean
Dim lobjPublisher As clsPublisher
Dim lstrReferencedBy As String = ""
lobjPublisher = CType(lstvwItemToDelete.Tag, clsPublisher)
If Not lobjPublisher.OKToDelete(lstrReferencedBy) Then
MessageBox.Show("Can't delete publisher: " + lobjPublisher.PublisherName + ". 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 publisher: " + lobjPublisher.PublisherName + "?", "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
If ldrDialogResult = 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 lobjPublisher As clsPublisher
lobjPublisher = CType(lstvwItemToDelete.Tag, clsPublisher)
Return lobjPublisher.Delete()
End Function
Protected Overrides Function SaveNewItem() As Boolean
Dim lstrErrorString As String = ""
mobjDetailPublisher.PublisherName = txtPublisherName.Text
mobjDetailPublisher.PublisherStreamingAllowed = cboStreamingAllowed.SelectedItem.ToString
If Not mobjDetailPublisher.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailPublisher.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Add(ConvertPublisherToListViewItem(mobjDetailPublisher))
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 ConvertPublisherToListViewItem(ByVal lobjPublisher As clsPublisher) As ListViewItem
Dim lobjItem As ListViewItem
lobjItem = New ListViewItem(lobjPublisher.PublisherName)
'lobjItem.SubItems.Add("Item1Col2")
'lobjItem.SubItems.Add("Item1Col3")
lobjItem.Tag = lobjPublisher
Return lobjItem
End Function
Protected Overrides Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As System.Windows.Forms.ListViewItem) As Boolean
Dim lstrErrorString As String = ""
mobjDetailPublisher.PublisherName = txtPublisherName.Text
mobjDetailPublisher.PublisherStreamingAllowed = cboStreamingAllowed.SelectedItem.ToString
If Not mobjDetailPublisher.Validate(lstrErrorString) Then
MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return False
End If
If Not mobjDetailPublisher.Save() Then
Return False
End If
Me.ExistingObjectsListItems.Remove(lstvwExistingItem)
Me.ExistingObjectsListItems.Add(ConvertPublisherToListViewItem(mobjDetailPublisher))
Return True
End Function
Private Sub txtPublisherName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtPublisherName.TextChanged
MyBase.DetailDataHasChanged()
End Sub
Private Sub cboStreamingAllowed_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboStreamingAllowed.SelectedIndexChanged
MyBase.DetailDataHasChanged()
End Sub
End Class

120
frmEditWork.resx Normal file
View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

779
frmEditWork.vb Normal file
View File

@@ -0,0 +1,779 @@
Imports System.Windows.Forms
Public Class frmEditWork
Inherits OrganLit.BaseEditForm
Private mobjDetailWork As New clsWork
Private m_objHymnTuneNamesHash As Hashtable
Private m_objComposersHash As Hashtable
Private m_objInstrumentationsHash As Hashtable
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents lblHymnTuneName As Windows.Forms.Label
Friend WithEvents cboHymnTuneName As ComboTypeAhead.ComboTypeAhead
Friend WithEvents lblWorkName As Windows.Forms.Label
Friend WithEvents txtWorkName As Windows.Forms.TextBox
Friend WithEvents lblBook As Windows.Forms.Label
Friend WithEvents lblPageNumber As Windows.Forms.Label
Friend WithEvents txtPageNumber As Windows.Forms.TextBox
Friend WithEvents cboBook As Windows.Forms.ComboBox
Friend WithEvents cboComposerName As ComboTypeAhead.ComboTypeAhead
Friend WithEvents lblComposerName As Windows.Forms.Label
Friend WithEvents cboInstrumentationName As ComboTypeAhead.ComboTypeAhead
Friend WithEvents lblInstrumentation As Windows.Forms.Label
Friend WithEvents txtOpusInfo As Windows.Forms.TextBox
Friend WithEvents lblOpusInfo As Windows.Forms.Label
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.lblWorkName = New Windows.Forms.Label()
Me.txtWorkName = New Windows.Forms.TextBox()
Me.lblBook = New Windows.Forms.Label()
Me.lblHymnTuneName = New Windows.Forms.Label()
Me.cboHymnTuneName = New ComboTypeAhead.ComboTypeAhead()
Me.lblPageNumber = New Windows.Forms.Label()
Me.txtPageNumber = New Windows.Forms.TextBox()
Me.cboBook = New Windows.Forms.ComboBox()
Me.cboComposerName = New ComboTypeAhead.ComboTypeAhead()
Me.lblComposerName = New Windows.Forms.Label()
Me.txtOpusInfo = New Windows.Forms.TextBox()
Me.lblOpusInfo = New Windows.Forms.Label()
Me.cboInstrumentationName = New ComboTypeAhead.ComboTypeAhead()
Me.lblInstrumentation = New Windows.Forms.Label()
Me.fraAddEdit.SuspendLayout()
Me.SuspendLayout()
'
'fraAddEdit
'
Me.fraAddEdit.Controls.Add(Me.cboInstrumentationName)
Me.fraAddEdit.Controls.Add(Me.lblInstrumentation)
Me.fraAddEdit.Controls.Add(Me.txtOpusInfo)
Me.fraAddEdit.Controls.Add(Me.lblOpusInfo)
Me.fraAddEdit.Controls.Add(Me.cboComposerName)
Me.fraAddEdit.Controls.Add(Me.lblComposerName)
Me.fraAddEdit.Controls.Add(Me.cboBook)
Me.fraAddEdit.Controls.Add(Me.txtPageNumber)
Me.fraAddEdit.Controls.Add(Me.lblPageNumber)
Me.fraAddEdit.Controls.Add(Me.cboHymnTuneName)
Me.fraAddEdit.Controls.Add(Me.lblHymnTuneName)
Me.fraAddEdit.Controls.Add(Me.lblBook)
Me.fraAddEdit.Controls.Add(Me.txtWorkName)
Me.fraAddEdit.Controls.Add(Me.lblWorkName)
Me.fraAddEdit.Location = New System.Drawing.Point(12, 381)
Me.fraAddEdit.Size = New System.Drawing.Size(1123, 220)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblWorkName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtWorkName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblBook, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblHymnTuneName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.cboHymnTuneName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblPageNumber, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtPageNumber, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.cboBook, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblComposerName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.cboComposerName, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblOpusInfo, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.txtOpusInfo, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.lblInstrumentation, 0)
Me.fraAddEdit.Controls.SetChildIndex(Me.cboInstrumentationName, 0)
'
'lblWorkName
'
Me.lblWorkName.Location = New System.Drawing.Point(19, 127)
Me.lblWorkName.Name = "lblWorkName"
Me.lblWorkName.Size = New System.Drawing.Size(115, 18)
Me.lblWorkName.TabIndex = 8
Me.lblWorkName.Text = "Work Name"
'
'txtWorkName
'
Me.txtWorkName.Location = New System.Drawing.Point(134, 127)
Me.txtWorkName.Name = "txtWorkName"
Me.txtWorkName.Size = New System.Drawing.Size(701, 22)
Me.txtWorkName.TabIndex = 9
'
'lblBook
'
Me.lblBook.Location = New System.Drawing.Point(19, 18)
Me.lblBook.Name = "lblBook"
Me.lblBook.Size = New System.Drawing.Size(96, 19)
Me.lblBook.TabIndex = 0
Me.lblBook.Text = "Book"
'
'lblHymnTuneName
'
Me.lblHymnTuneName.Location = New System.Drawing.Point(19, 182)
Me.lblHymnTuneName.Name = "lblHymnTuneName"
Me.lblHymnTuneName.Size = New System.Drawing.Size(115, 19)
Me.lblHymnTuneName.TabIndex = 12
Me.lblHymnTuneName.Text = "Hymn Tune Name"
'
'cboHymnTuneName
'
Me.cboHymnTuneName.Location = New System.Drawing.Point(134, 182)
Me.cboHymnTuneName.Name = "cboHymnTuneName"
Me.cboHymnTuneName.Size = New System.Drawing.Size(346, 24)
Me.cboHymnTuneName.Sorted = True
Me.cboHymnTuneName.TabIndex = 13
'
'lblPageNumber
'
Me.lblPageNumber.Location = New System.Drawing.Point(19, 46)
Me.lblPageNumber.Name = "lblPageNumber"
Me.lblPageNumber.Size = New System.Drawing.Size(96, 19)
Me.lblPageNumber.TabIndex = 2
Me.lblPageNumber.Text = "Page Number"
'
'txtPageNumber
'
Me.txtPageNumber.Location = New System.Drawing.Point(134, 46)
Me.txtPageNumber.Name = "txtPageNumber"
Me.txtPageNumber.Size = New System.Drawing.Size(77, 22)
Me.txtPageNumber.TabIndex = 3
'
'cboBook
'
Me.cboBook.DropDownStyle = Windows.Forms.ComboBoxStyle.DropDownList
Me.cboBook.Location = New System.Drawing.Point(134, 18)
Me.cboBook.Name = "cboBook"
Me.cboBook.Size = New System.Drawing.Size(509, 24)
Me.cboBook.Sorted = True
Me.cboBook.TabIndex = 1
'
'cboComposerName
'
Me.cboComposerName.Location = New System.Drawing.Point(134, 99)
Me.cboComposerName.Name = "cboComposerName"
Me.cboComposerName.Size = New System.Drawing.Size(509, 24)
Me.cboComposerName.Sorted = True
Me.cboComposerName.TabIndex = 7
'
'lblComposerName
'
Me.lblComposerName.Location = New System.Drawing.Point(19, 99)
Me.lblComposerName.Name = "lblComposerName"
Me.lblComposerName.Size = New System.Drawing.Size(115, 19)
Me.lblComposerName.TabIndex = 6
Me.lblComposerName.Text = "Composer Name"
'
'txtOpusInfo
'
Me.txtOpusInfo.Location = New System.Drawing.Point(134, 155)
Me.txtOpusInfo.Name = "txtOpusInfo"
Me.txtOpusInfo.Size = New System.Drawing.Size(250, 22)
Me.txtOpusInfo.TabIndex = 11
'
'lblOpusInfo
'
Me.lblOpusInfo.Location = New System.Drawing.Point(19, 155)
Me.lblOpusInfo.Name = "lblOpusInfo"
Me.lblOpusInfo.Size = New System.Drawing.Size(115, 18)
Me.lblOpusInfo.TabIndex = 10
Me.lblOpusInfo.Text = "Opus Info"
'
'cboInstrumentationName
'
Me.cboInstrumentationName.Location = New System.Drawing.Point(134, 73)
Me.cboInstrumentationName.Name = "cboInstrumentationName"
Me.cboInstrumentationName.Size = New System.Drawing.Size(509, 24)
Me.cboInstrumentationName.Sorted = True
Me.cboInstrumentationName.TabIndex = 5
'
'lblInstrumentation
'
Me.lblInstrumentation.Location = New System.Drawing.Point(19, 73)
Me.lblInstrumentation.Name = "lblInstrumentation"
Me.lblInstrumentation.Size = New System.Drawing.Size(115, 18)
Me.lblInstrumentation.TabIndex = 4
Me.lblInstrumentation.Text = "Instrumentation"
'
'frmEditWork
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 15)
Me.ClientSize = New System.Drawing.Size(1143, 608)
Me.MinimumSize = New System.Drawing.Size(1018, 655)
Me.Name = "frmEditWork"
Me.StartPosition = Windows.Forms.FormStartPosition.Manual
Me.Text = "Edit Work"
Me.fraAddEdit.ResumeLayout(False)
Me.fraAddEdit.PerformLayout()
Me.ResumeLayout(False)
End Sub
#End Region
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 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 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 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 = Windows.Forms.DialogResult.No Then
Return False
End If
Return True
End Function
Protected Overrides Function DeleteExistingItem(ByVal lstvwItemToDelete As 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 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 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

81
frmMain.resx Normal file
View File

@@ -0,0 +1,81 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="MenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AAD///8A7gDu4A7uAO7gDu4A7uAO7uD4Dg+A4PgOD4Dg+A4PgO4P+HD/hw/4cP+HD/hw/4cODwBw8AcP
AHDwBw8AcPAHDg/4cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4
cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4cP+HD/hw/4cP+HD/
hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+H
D/hw/4cOD/hw/4cP+HD/hw/4cP+HDg/4cP+HD/hw/4cP+HD/hw4P+HD/hw/4cP+HD/hw/4cOD/hw/4cP
+HD/hw/4cP+HDg8AcP+HD/hw/4cP+HDwBw7g/wD/hw/4cP+HD/hwD/Du4P8A8AcP+HD/hw8AcA/w7u4A
7g/wD/hw/4cA/w7gDu7u7u4P8A8AcPAHAP8O7u7u6Znp4A7g/w4P8O4A7u7u7umZ7u7u4P8OD/Du7u6Z
nu7u6e7umZ4A6eAO6ZnumZ7u7unu7pme7unu7umZ7u6e7u7p7u7unu7p7u7u6e7unu7u6e7u7p7u6e7u
7unu7p7u7u7u7u6enumZ7u7p7pme7u7u7u7ume7pme7u6Znu7u4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
</value>
</data>
</root>

351
frmMain.vb Normal file
View File

@@ -0,0 +1,351 @@
Imports System.Windows.Forms
Public Class frmMain
Inherits Windows.Forms.Form
Private m_frmEditComposer As frmEditComposer
Private m_frmEditInstrumentation As frmEditInstrumentation
Private m_frmEditPublisher As frmEditPublisher
Private m_frmEditHymnal As frmEditHymnal
Private m_frmEditBook As frmEditBook
Private m_frmEditHymnTuneName As frmEditHymnTuneName
Private m_frmEditHymn As frmEditHymn
Friend WithEvents mnuEditInstrumentations As Windows.Forms.ToolStripMenuItem
Friend WithEvents MenuItem1 As Windows.Forms.ToolStripMenuItem
Friend WithEvents ToolStripSeparator2 As ToolStripSeparator
Private m_frmEditWork As frmEditWork
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents MenuStrip1 As Windows.Forms.MenuStrip
Friend WithEvents mnuFile As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuFileExit As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuEdit As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuEditComposer As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuEditPublisher As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuEditHymnal As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuEditBook As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuEditHymnTuneNames As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuEditHymn As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuEditWork As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuGenerate As Windows.Forms.ToolStripMenuItem
Friend WithEvents mnuGenerateWebSite As Windows.Forms.ToolStripMenuItem
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmMain))
Me.MenuStrip1 = New System.Windows.Forms.MenuStrip()
Me.mnuFile = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuFileExit = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuEdit = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuEditBook = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuEditHymn = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuEditHymnTuneNames = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuEditHymnal = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuEditWork = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuEditComposer = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuEditInstrumentations = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuEditPublisher = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuGenerate = New System.Windows.Forms.ToolStripMenuItem()
Me.mnuGenerateWebSite = New System.Windows.Forms.ToolStripMenuItem()
Me.ToolStripSeparator2 = New System.Windows.Forms.ToolStripSeparator()
Me.MenuStrip1.SuspendLayout()
Me.SuspendLayout()
'
'MenuStrip1
'
Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuFile, Me.mnuEdit, Me.mnuGenerate})
Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
Me.MenuStrip1.Name = "MenuStrip1"
Me.MenuStrip1.TabIndex = 1
'
'mnuFile
'
Me.mnuFile.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuFileExit})
Me.mnuFile.Name = "mnuFile"
Me.mnuFile.Text = "&File"
'
'mnuFileExit
'
Me.mnuFileExit.Name = "mnuFileExit"
Me.mnuFileExit.Size = New System.Drawing.Size(180, 22)
Me.mnuFileExit.Text = "E&xit"
'
'mnuEdit
'
Me.mnuEdit.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuEditBook, Me.mnuEditHymn, Me.mnuEditHymnTuneNames, Me.mnuEditHymnal, Me.mnuEditWork, Me.ToolStripSeparator2, Me.mnuEditComposer, Me.mnuEditInstrumentations, Me.mnuEditPublisher})
Me.mnuEdit.Name = "mnuEdit"
Me.mnuEdit.Size = New System.Drawing.Size(39, 20)
Me.mnuEdit.Text = "&Edit"
'
'mnuEditBook
'
Me.mnuEditBook.Name = "mnuEditBook"
Me.mnuEditBook.Size = New System.Drawing.Size(185, 22)
Me.mnuEditBook.Text = "Books..."
'
'mnuEditHymn
'
Me.mnuEditHymn.Name = "mnuEditHymn"
Me.mnuEditHymn.Size = New System.Drawing.Size(185, 22)
Me.mnuEditHymn.Text = "Hymns..."
'
'mnuEditHymnTuneNames
'
Me.mnuEditHymnTuneNames.Name = "mnuEditHymnTuneNames"
Me.mnuEditHymnTuneNames.Size = New System.Drawing.Size(185, 22)
Me.mnuEditHymnTuneNames.Text = "Hymn Tune Names..."
'
'mnuEditHymnal
'
Me.mnuEditHymnal.Name = "mnuEditHymnal"
Me.mnuEditHymnal.Size = New System.Drawing.Size(185, 22)
Me.mnuEditHymnal.Text = "Hymnals..."
'
'mnuEditWork
'
Me.mnuEditWork.Name = "mnuEditWork"
Me.mnuEditWork.Size = New System.Drawing.Size(185, 22)
Me.mnuEditWork.Text = "Works..."
'
'mnuEditComposer
'
Me.mnuEditComposer.Name = "mnuEditComposer"
Me.mnuEditComposer.Size = New System.Drawing.Size(185, 22)
Me.mnuEditComposer.Text = "&Composers..."
'
'mnuEditInstrumentations
'
Me.mnuEditInstrumentations.Name = "mnuEditInstrumentations"
Me.mnuEditInstrumentations.Size = New System.Drawing.Size(185, 22)
Me.mnuEditInstrumentations.Text = "Instrumentations..."
'
'mnuEditPublisher
'
Me.mnuEditPublisher.Name = "mnuEditPublisher"
Me.mnuEditPublisher.Size = New System.Drawing.Size(185, 22)
Me.mnuEditPublisher.Text = "Publishers..."
'
'mnuGenerate
'
Me.mnuGenerate.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuGenerateWebSite})
Me.mnuGenerate.Name = "mnuGenerate"
Me.mnuGenerate.Size = New System.Drawing.Size(66, 20)
Me.mnuGenerate.Text = "&Generate"
'
'mnuGenerateWebSite
'
Me.mnuGenerateWebSite.Name = "mnuGenerateWebSite"
Me.mnuGenerateWebSite.Size = New System.Drawing.Size(180, 22)
Me.mnuGenerateWebSite.Text = "&Web Site"
'
'ToolStripSeparator2
'
Me.ToolStripSeparator2.Name = "ToolStripSeparator2"
Me.ToolStripSeparator2.Size = New System.Drawing.Size(182, 6)
'
'frmMain
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 16)
Me.ClientSize = New System.Drawing.Size(960, 574)
Me.Controls.Add(Me.MenuStrip1)
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
Me.IsMdiContainer = True
Me.MainMenuStrip = Me.MenuStrip1
Me.Name = "frmMain"
Me.Text = "OrganLit"
Me.WindowState = System.Windows.Forms.FormWindowState.Maximized
Me.MenuStrip1.ResumeLayout(False)
Me.MenuStrip1.PerformLayout()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
#End Region
Private Function OpenDatabaseConnection() As Boolean
Try
MyGlobals.g_objDatabaseLayer = New clsDatabaseLayer
Return MyGlobals.g_objDatabaseLayer.OpenDatabaseConnection()
Catch
Return False
End Try
End Function
Private Function CloseDatabaseConnection() As Boolean
Try
Return MyGlobals.g_objDatabaseLayer.CloseDatabaseConnection()
Catch
Return False
End Try
End Function
Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not OpenDatabaseConnection() Then
MessageBox.Show("Error connecting to database", "Database error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Me.Close()
End If
End Sub
Public Sub DisableMenus()
mnuFile.Enabled = False
mnuEdit.Enabled = False
End Sub
Public Sub EnableMenus()
mnuFile.Enabled = True
mnuEdit.Enabled = True
End Sub
Private Sub mnuEditComposer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEditComposer.Click
Me.Cursor = Windows.Forms.Cursors.WaitCursor
CloseAllEditWindows()
m_frmEditComposer = New frmEditComposer
m_frmEditComposer.MdiParent = Me
m_frmEditComposer.Show()
Me.Cursor = Windows.Forms.Cursors.Default
End Sub
Private Sub mnuEditPublisher_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEditPublisher.Click
Me.Cursor = Windows.Forms.Cursors.WaitCursor
CloseAllEditWindows()
If m_frmEditPublisher Is Nothing OrElse m_frmEditPublisher.IsDisposed Then
m_frmEditPublisher = New frmEditPublisher
m_frmEditPublisher.MdiParent = Me
m_frmEditPublisher.Show()
Else
m_frmEditPublisher.Activate()
End If
Me.Cursor = Windows.Forms.Cursors.Default
End Sub
Private Sub mnuEditHymnal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEditHymnal.Click
Me.Cursor = Windows.Forms.Cursors.WaitCursor
CloseAllEditWindows()
If m_frmEditHymnal Is Nothing OrElse m_frmEditHymnal.IsDisposed Then
m_frmEditHymnal = New frmEditHymnal
m_frmEditHymnal.MdiParent = Me
m_frmEditHymnal.Show()
Else
m_frmEditHymnal.Activate()
End If
Me.Cursor = Windows.Forms.Cursors.Default
End Sub
Private Sub mnuEditBook_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEditBook.Click
Me.Cursor = Windows.Forms.Cursors.WaitCursor
CloseAllEditWindows()
If m_frmEditBook Is Nothing OrElse m_frmEditBook.IsDisposed Then
m_frmEditBook = New frmEditBook
m_frmEditBook.MdiParent = Me
m_frmEditBook.Show()
Else
m_frmEditBook.Activate()
End If
Me.Cursor = Windows.Forms.Cursors.Default
End Sub
Private Sub mnuEditHymnTuneNames_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEditHymnTuneNames.Click
Me.Cursor = Windows.Forms.Cursors.WaitCursor
CloseAllEditWindows()
If m_frmEditHymnTuneName Is Nothing OrElse m_frmEditHymnTuneName.IsDisposed Then
m_frmEditHymnTuneName = New frmEditHymnTuneName
m_frmEditHymnTuneName.MdiParent = Me
m_frmEditHymnTuneName.Show()
Else
m_frmEditHymnTuneName.Activate()
End If
Me.Cursor = Windows.Forms.Cursors.Default
End Sub
Private Sub mnuEditHymn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEditHymn.Click
Me.Cursor = Windows.Forms.Cursors.WaitCursor
CloseAllEditWindows()
If m_frmEditHymn Is Nothing OrElse m_frmEditHymn.IsDisposed Then
m_frmEditHymn = New frmEditHymn
m_frmEditHymn.MdiParent = Me
m_frmEditHymn.Show()
Else
m_frmEditHymn.Activate()
End If
Me.Cursor = Windows.Forms.Cursors.Default
End Sub
Private Sub mnuEditWork_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEditWork.Click
Me.Cursor = Windows.Forms.Cursors.WaitCursor
CloseAllEditWindows()
If m_frmEditWork Is Nothing OrElse m_frmEditWork.IsDisposed Then
m_frmEditWork = New frmEditWork
m_frmEditWork.MdiParent = Me
m_frmEditWork.Show()
Else
m_frmEditWork.Activate()
End If
Me.Cursor = Windows.Forms.Cursors.Default
End Sub
Private Sub mnuFileExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFileExit.Click
Me.Close()
End Sub
Private Sub mnuGenerateWebSite_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuGenerateWebSite.Click
Me.Cursor = Windows.Forms.Cursors.WaitCursor
CloseAllEditWindows()
modGenerateWebSite.GenerateWebSite()
Me.Cursor = Windows.Forms.Cursors.Default
End Sub
Private Sub mnuEditInstrumentations_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuEditInstrumentations.Click
Me.Cursor = Windows.Forms.Cursors.WaitCursor
CloseAllEditWindows()
m_frmEditInstrumentation = New frmEditInstrumentation
m_frmEditInstrumentation.MdiParent = Me
m_frmEditInstrumentation.Show()
Me.Cursor = Windows.Forms.Cursors.Default
End Sub
Private Sub CloseAllEditWindows()
CloseWindow(m_frmEditBook)
CloseWindow(m_frmEditComposer)
CloseWindow(m_frmEditHymn)
CloseWindow(m_frmEditHymnal)
CloseWindow(m_frmEditHymnTuneName)
CloseWindow(m_frmEditInstrumentation)
CloseWindow(m_frmEditPublisher)
CloseWindow(m_frmEditWork)
End Sub
Private Sub CloseWindow(ByVal objWindow As Windows.Forms.Form)
If objWindow Is Nothing OrElse objWindow.IsDisposed Then
Else
objWindow.Close()
End If
End Sub
End Class

14
index.htm Normal file
View File

@@ -0,0 +1,14 @@
<html>
<head>
<title>Organ Literature Index</title>
</head>
<body>
<h1>Organ Literature Index</h1>
<p><a href="indexbyhymn.htm">Index by Hymn</a></p>
<p><a href="indexbyhymntunename.htm">Index by Hymn Tune Name</a></p>
<p><a href="nonhymntuneworks.htm">Organ Works Not Based on Hymn Tunes</a></p>
<p><a href="indexbycomposer.htm">Index by Composer</a></p>
<p><a href="indexbybook.htm">Index by Book</a></p>
</body>
</html>

12
log.txt Normal file
View File

@@ -0,0 +1,12 @@
2021-08-08 13:59:13.435 -05:00 [INF] Loaded 5 extensions
2021-08-08 13:59:14.125 -05:00 [INF] MSBuild registered from C:\Program Files\dotnet\sdk\5.0.302\
2021-08-08 13:59:14.798 -05:00 [INF] Found Visual Studio v16.10.31410.357 [C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional]
2021-08-08 13:59:17.893 -05:00 [INF] Initializing upgrade step Select an entrypoint
2021-08-08 13:59:17.903 -05:00 [INF] Setting entrypoint to only project in solution: Z:\VBDOTNETPROJECTS\OrganLit\OrganLit.vbproj
2021-08-08 13:59:17.973 -05:00 [INF] Recommending Windows TFM net5.0-windows because the project either has Windows-specific dependencies or builds to a WinExe
2021-08-08 13:59:18.004 -05:00 [INF] Initializing upgrade step Finalize upgrade
2021-08-08 13:59:18.055 -05:00 [INF] Recommending Windows TFM net5.0-windows because the project either has Windows-specific dependencies or builds to a WinExe
2021-08-08 13:59:31.830 -05:00 [INF] Applying upgrade step Finalize upgrade
2021-08-08 13:59:31.837 -05:00 [INF] Upgrade step Finalize upgrade applied successfully
2021-08-08 13:59:37.577 -05:00 [INF] Upgrade has completed. Please review any changes.
2021-08-08 13:59:37.590 -05:00 [INF] No state to save

1025
modGenerateWebSite.vb Normal file

File diff suppressed because it is too large Load Diff