diff --git a/GBM/Classes/clsGameFilter.vb b/GBM/Classes/clsGameFilter.vb index b1395d3..191cef6 100644 --- a/GBM/Classes/clsGameFilter.vb +++ b/GBM/Classes/clsGameFilter.vb @@ -2,6 +2,7 @@ Private sID As String Private oField As clsGameFilterField + Private bNot As Boolean Private oData As Object Private eNumericOperator As eNumericOperators = eNumericOperators.Equals @@ -31,6 +32,15 @@ End Set End Property + Public Property NotCondition As Boolean + Get + Return bNot + End Get + Set(value As Boolean) + bNot = value + End Set + End Property + Public Property Data As Object Get Return oData diff --git a/GBM/Forms/frmFilter.Designer.vb b/GBM/Forms/frmFilter.Designer.vb index 71f4469..ddfcc1d 100644 --- a/GBM/Forms/frmFilter.Designer.vb +++ b/GBM/Forms/frmFilter.Designer.vb @@ -23,17 +23,23 @@ Partial Class frmFilter _ Private Sub InitializeComponent() Me.grpTagFilter = New System.Windows.Forms.GroupBox() + Me.lblExcludeTags = New System.Windows.Forms.Label() + Me.btnExcludeRemove = New System.Windows.Forms.Button() + Me.btnExcludeAdd = New System.Windows.Forms.Button() + Me.lstExcludeTags = New System.Windows.Forms.ListBox() Me.grpTagOptions = New System.Windows.Forms.GroupBox() Me.optAll = New System.Windows.Forms.RadioButton() Me.optAny = New System.Windows.Forms.RadioButton() - Me.lblGameTags = New System.Windows.Forms.Label() + Me.lblIncludeTags = New System.Windows.Forms.Label() Me.lblTags = New System.Windows.Forms.Label() - Me.btnRemove = New System.Windows.Forms.Button() - Me.btnAdd = New System.Windows.Forms.Button() - Me.lstTagFilter = New System.Windows.Forms.ListBox() + Me.btnIncludeRemove = New System.Windows.Forms.Button() + Me.btnIncludeAdd = New System.Windows.Forms.Button() + Me.lstIncludeTags = New System.Windows.Forms.ListBox() Me.lstTags = New System.Windows.Forms.ListBox() Me.btnOK = New System.Windows.Forms.Button() Me.grpGameFilter = New System.Windows.Forms.GroupBox() + Me.lblNot = New System.Windows.Forms.Label() + Me.chkNot = New System.Windows.Forms.CheckBox() Me.cboBoolFilter = New System.Windows.Forms.ComboBox() Me.numFilter = New System.Windows.Forms.NumericUpDown() Me.cboNumericOps = New System.Windows.Forms.ComboBox() @@ -68,19 +74,60 @@ Partial Class frmFilter ' 'grpTagFilter ' + Me.grpTagFilter.Controls.Add(Me.lblExcludeTags) + Me.grpTagFilter.Controls.Add(Me.btnExcludeRemove) + Me.grpTagFilter.Controls.Add(Me.btnExcludeAdd) + Me.grpTagFilter.Controls.Add(Me.lstExcludeTags) Me.grpTagFilter.Controls.Add(Me.grpTagOptions) - Me.grpTagFilter.Controls.Add(Me.lblGameTags) + Me.grpTagFilter.Controls.Add(Me.lblIncludeTags) Me.grpTagFilter.Controls.Add(Me.lblTags) - Me.grpTagFilter.Controls.Add(Me.btnRemove) - Me.grpTagFilter.Controls.Add(Me.btnAdd) - Me.grpTagFilter.Controls.Add(Me.lstTagFilter) + Me.grpTagFilter.Controls.Add(Me.btnIncludeRemove) + Me.grpTagFilter.Controls.Add(Me.btnIncludeAdd) + Me.grpTagFilter.Controls.Add(Me.lstIncludeTags) Me.grpTagFilter.Controls.Add(Me.lstTags) Me.grpTagFilter.Location = New System.Drawing.Point(12, 236) Me.grpTagFilter.Name = "grpTagFilter" - Me.grpTagFilter.Size = New System.Drawing.Size(385, 198) + Me.grpTagFilter.Size = New System.Drawing.Size(410, 198) Me.grpTagFilter.TabIndex = 3 Me.grpTagFilter.TabStop = False ' + 'lblExcludeTags + ' + Me.lblExcludeTags.AutoSize = True + Me.lblExcludeTags.Location = New System.Drawing.Point(313, 16) + Me.lblExcludeTags.Name = "lblExcludeTags" + Me.lblExcludeTags.Size = New System.Drawing.Size(72, 13) + Me.lblExcludeTags.TabIndex = 10 + Me.lblExcludeTags.Text = "Exclude Tags" + ' + 'btnExcludeRemove + ' + Me.btnExcludeRemove.Location = New System.Drawing.Point(261, 91) + Me.btnExcludeRemove.Name = "btnExcludeRemove" + Me.btnExcludeRemove.Size = New System.Drawing.Size(31, 23) + Me.btnExcludeRemove.TabIndex = 9 + Me.btnExcludeRemove.Text = "<" + Me.btnExcludeRemove.UseVisualStyleBackColor = True + ' + 'btnExcludeAdd + ' + Me.btnExcludeAdd.Location = New System.Drawing.Point(261, 62) + Me.btnExcludeAdd.Name = "btnExcludeAdd" + Me.btnExcludeAdd.Size = New System.Drawing.Size(31, 23) + Me.btnExcludeAdd.TabIndex = 8 + Me.btnExcludeAdd.Text = ">" + Me.btnExcludeAdd.UseVisualStyleBackColor = True + ' + 'lstExcludeTags + ' + Me.lstExcludeTags.FormattingEnabled = True + Me.lstExcludeTags.Location = New System.Drawing.Point(298, 32) + Me.lstExcludeTags.Name = "lstExcludeTags" + Me.lstExcludeTags.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended + Me.lstExcludeTags.Size = New System.Drawing.Size(103, 108) + Me.lstExcludeTags.Sorted = True + Me.lstExcludeTags.TabIndex = 7 + ' 'grpTagOptions ' Me.grpTagOptions.Controls.Add(Me.optAll) @@ -113,65 +160,65 @@ Partial Class frmFilter Me.optAny.Text = "Any Tag" Me.optAny.UseVisualStyleBackColor = True ' - 'lblGameTags + 'lblIncludeTags ' - Me.lblGameTags.AutoSize = True - Me.lblGameTags.Location = New System.Drawing.Point(271, 16) - Me.lblGameTags.Name = "lblGameTags" - Me.lblGameTags.Size = New System.Drawing.Size(66, 13) - Me.lblGameTags.TabIndex = 4 - Me.lblGameTags.Text = "Current Filter" + Me.lblIncludeTags.AutoSize = True + Me.lblIncludeTags.Location = New System.Drawing.Point(23, 16) + Me.lblIncludeTags.Name = "lblIncludeTags" + Me.lblIncludeTags.Size = New System.Drawing.Size(69, 13) + Me.lblIncludeTags.TabIndex = 4 + Me.lblIncludeTags.Text = "Include Tags" ' 'lblTags ' Me.lblTags.AutoSize = True - Me.lblTags.Location = New System.Drawing.Point(43, 16) + Me.lblTags.Location = New System.Drawing.Point(165, 16) Me.lblTags.Name = "lblTags" Me.lblTags.Size = New System.Drawing.Size(77, 13) Me.lblTags.TabIndex = 0 Me.lblTags.Text = "Available Tags" ' - 'btnRemove + 'btnIncludeRemove ' - Me.btnRemove.Location = New System.Drawing.Point(162, 88) - Me.btnRemove.Name = "btnRemove" - Me.btnRemove.Size = New System.Drawing.Size(61, 23) - Me.btnRemove.TabIndex = 3 - Me.btnRemove.Text = "<" - Me.btnRemove.UseVisualStyleBackColor = True + Me.btnIncludeRemove.Location = New System.Drawing.Point(115, 91) + Me.btnIncludeRemove.Name = "btnIncludeRemove" + Me.btnIncludeRemove.Size = New System.Drawing.Size(31, 23) + Me.btnIncludeRemove.TabIndex = 3 + Me.btnIncludeRemove.Text = ">" + Me.btnIncludeRemove.UseVisualStyleBackColor = True ' - 'btnAdd + 'btnIncludeAdd ' - Me.btnAdd.Location = New System.Drawing.Point(162, 59) - Me.btnAdd.Name = "btnAdd" - Me.btnAdd.Size = New System.Drawing.Size(61, 23) - Me.btnAdd.TabIndex = 2 - Me.btnAdd.Text = ">" - Me.btnAdd.UseVisualStyleBackColor = True + Me.btnIncludeAdd.Location = New System.Drawing.Point(115, 62) + Me.btnIncludeAdd.Name = "btnIncludeAdd" + Me.btnIncludeAdd.Size = New System.Drawing.Size(31, 23) + Me.btnIncludeAdd.TabIndex = 2 + Me.btnIncludeAdd.Text = "<" + Me.btnIncludeAdd.UseVisualStyleBackColor = True ' - 'lstTagFilter + 'lstIncludeTags ' - Me.lstTagFilter.FormattingEnabled = True - Me.lstTagFilter.Location = New System.Drawing.Point(229, 32) - Me.lstTagFilter.Name = "lstTagFilter" - Me.lstTagFilter.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended - Me.lstTagFilter.Size = New System.Drawing.Size(150, 108) - Me.lstTagFilter.Sorted = True - Me.lstTagFilter.TabIndex = 5 + Me.lstIncludeTags.FormattingEnabled = True + Me.lstIncludeTags.Location = New System.Drawing.Point(6, 32) + Me.lstIncludeTags.Name = "lstIncludeTags" + Me.lstIncludeTags.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended + Me.lstIncludeTags.Size = New System.Drawing.Size(103, 108) + Me.lstIncludeTags.Sorted = True + Me.lstIncludeTags.TabIndex = 5 ' 'lstTags ' Me.lstTags.FormattingEnabled = True - Me.lstTags.Location = New System.Drawing.Point(6, 32) + Me.lstTags.Location = New System.Drawing.Point(152, 32) Me.lstTags.Name = "lstTags" Me.lstTags.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended - Me.lstTags.Size = New System.Drawing.Size(150, 108) + Me.lstTags.Size = New System.Drawing.Size(103, 108) Me.lstTags.Sorted = True Me.lstTags.TabIndex = 1 ' 'btnOK ' - Me.btnOK.Location = New System.Drawing.Point(322, 526) + Me.btnOK.Location = New System.Drawing.Point(347, 526) Me.btnOK.Name = "btnOK" Me.btnOK.Size = New System.Drawing.Size(75, 23) Me.btnOK.TabIndex = 6 @@ -180,6 +227,8 @@ Partial Class frmFilter ' 'grpGameFilter ' + Me.grpGameFilter.Controls.Add(Me.lblNot) + Me.grpGameFilter.Controls.Add(Me.chkNot) Me.grpGameFilter.Controls.Add(Me.cboBoolFilter) Me.grpGameFilter.Controls.Add(Me.numFilter) Me.grpGameFilter.Controls.Add(Me.cboNumericOps) @@ -194,15 +243,33 @@ Partial Class frmFilter Me.grpGameFilter.Controls.Add(Me.txtStringFilter) Me.grpGameFilter.Location = New System.Drawing.Point(12, 35) Me.grpGameFilter.Name = "grpGameFilter" - Me.grpGameFilter.Size = New System.Drawing.Size(385, 172) + Me.grpGameFilter.Size = New System.Drawing.Size(410, 172) Me.grpGameFilter.TabIndex = 1 Me.grpGameFilter.TabStop = False ' + 'lblNot + ' + Me.lblNot.AutoSize = True + Me.lblNot.Location = New System.Drawing.Point(161, 20) + Me.lblNot.Name = "lblNot" + Me.lblNot.Size = New System.Drawing.Size(24, 13) + Me.lblNot.TabIndex = 11 + Me.lblNot.Text = "Not" + ' + 'chkNot + ' + Me.chkNot.AutoSize = True + Me.chkNot.Location = New System.Drawing.Point(166, 39) + Me.chkNot.Name = "chkNot" + Me.chkNot.Size = New System.Drawing.Size(15, 14) + Me.chkNot.TabIndex = 10 + Me.chkNot.UseVisualStyleBackColor = True + ' 'cboBoolFilter ' Me.cboBoolFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList Me.cboBoolFilter.FormattingEnabled = True - Me.cboBoolFilter.Location = New System.Drawing.Point(162, 36) + Me.cboBoolFilter.Location = New System.Drawing.Point(187, 36) Me.cboBoolFilter.Name = "cboBoolFilter" Me.cboBoolFilter.Size = New System.Drawing.Size(136, 21) Me.cboBoolFilter.TabIndex = 3 @@ -210,7 +277,7 @@ Partial Class frmFilter 'numFilter ' Me.numFilter.DecimalPlaces = 1 - Me.numFilter.Location = New System.Drawing.Point(233, 37) + Me.numFilter.Location = New System.Drawing.Point(258, 37) Me.numFilter.Maximum = New Decimal(New Integer() {1000000, 0, 0, 0}) Me.numFilter.Name = "numFilter" Me.numFilter.Size = New System.Drawing.Size(65, 20) @@ -220,7 +287,7 @@ Partial Class frmFilter ' Me.cboNumericOps.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList Me.cboNumericOps.FormattingEnabled = True - Me.cboNumericOps.Location = New System.Drawing.Point(162, 36) + Me.cboNumericOps.Location = New System.Drawing.Point(188, 36) Me.cboNumericOps.Name = "cboNumericOps" Me.cboNumericOps.Size = New System.Drawing.Size(65, 21) Me.cboNumericOps.TabIndex = 3 @@ -237,7 +304,7 @@ Partial Class frmFilter 'lblFilterData ' Me.lblFilterData.AutoSize = True - Me.lblFilterData.Location = New System.Drawing.Point(214, 20) + Me.lblFilterData.Location = New System.Drawing.Point(239, 20) Me.lblFilterData.Name = "lblFilterData" Me.lblFilterData.Size = New System.Drawing.Size(32, 13) Me.lblFilterData.TabIndex = 2 @@ -271,7 +338,7 @@ Partial Class frmFilter ' 'btnAddFilter ' - Me.btnAddFilter.Location = New System.Drawing.Point(304, 34) + Me.btnAddFilter.Location = New System.Drawing.Point(329, 34) Me.btnAddFilter.Name = "btnAddFilter" Me.btnAddFilter.Size = New System.Drawing.Size(75, 23) Me.btnAddFilter.TabIndex = 5 @@ -320,7 +387,7 @@ Partial Class frmFilter ' 'txtStringFilter ' - Me.txtStringFilter.Location = New System.Drawing.Point(162, 36) + Me.txtStringFilter.Location = New System.Drawing.Point(187, 36) Me.txtStringFilter.Name = "txtStringFilter" Me.txtStringFilter.Size = New System.Drawing.Size(136, 20) Me.txtStringFilter.TabIndex = 3 @@ -332,7 +399,7 @@ Partial Class frmFilter Me.grpSorting.Controls.Add(Me.cboSortField) Me.grpSorting.Location = New System.Drawing.Point(12, 440) Me.grpSorting.Name = "grpSorting" - Me.grpSorting.Size = New System.Drawing.Size(385, 80) + Me.grpSorting.Size = New System.Drawing.Size(410, 80) Me.grpSorting.TabIndex = 4 Me.grpSorting.TabStop = False Me.grpSorting.Text = "Sorting" @@ -421,7 +488,7 @@ Partial Class frmFilter ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(409, 561) + Me.ClientSize = New System.Drawing.Size(434, 561) Me.Controls.Add(Me.Label1) Me.Controls.Add(Me.grpSorting) Me.Controls.Add(Me.chkTag) @@ -455,11 +522,11 @@ Partial Class frmFilter Friend WithEvents grpTagOptions As System.Windows.Forms.GroupBox Friend WithEvents optAll As System.Windows.Forms.RadioButton Friend WithEvents optAny As System.Windows.Forms.RadioButton - Friend WithEvents lblGameTags As System.Windows.Forms.Label + Friend WithEvents lblIncludeTags As System.Windows.Forms.Label Friend WithEvents lblTags As System.Windows.Forms.Label - Friend WithEvents btnRemove As System.Windows.Forms.Button - Friend WithEvents btnAdd As System.Windows.Forms.Button - Friend WithEvents lstTagFilter As System.Windows.Forms.ListBox + Friend WithEvents btnIncludeRemove As System.Windows.Forms.Button + Friend WithEvents btnIncludeAdd As System.Windows.Forms.Button + Friend WithEvents lstIncludeTags As System.Windows.Forms.ListBox Friend WithEvents lstTags As System.Windows.Forms.ListBox Friend WithEvents btnOK As System.Windows.Forms.Button Friend WithEvents grpGameFilter As System.Windows.Forms.GroupBox @@ -486,4 +553,10 @@ Partial Class frmFilter Friend WithEvents lblSortFields As Label Friend WithEvents Label1 As Label Friend WithEvents grpSortOptions As GroupBox + Friend WithEvents lblExcludeTags As Label + Friend WithEvents btnExcludeRemove As Button + Friend WithEvents btnExcludeAdd As Button + Friend WithEvents lstExcludeTags As ListBox + Friend WithEvents lblNot As Label + Friend WithEvents chkNot As CheckBox End Class diff --git a/GBM/Forms/frmFilter.vb b/GBM/Forms/frmFilter.vb index 6464c24..2a98186 100644 --- a/GBM/Forms/frmFilter.vb +++ b/GBM/Forms/frmFilter.vb @@ -9,7 +9,8 @@ Public Class frmFilter NoTags = 4 End Enum - Dim oTagFilters As New List(Of clsTag) + Dim oIncludeTagFilters As New List(Of clsTag) + Dim oExcludeTagFilters As New List(Of clsTag) Dim oGameFilters As New List(Of clsGameFilter) Dim oValidFields As New List(Of clsGameFilterField) Dim eCurrentFilterType As eFilterType = eFilterType.BaseFilter @@ -28,12 +29,21 @@ Public Class frmFilter End Set End Property - Public Property TagFilters As List(Of clsTag) + Public Property IncludeTagFilters As List(Of clsTag) Get - Return oTagFilters + Return oIncludeTagFilters End Get Set(value As List(Of clsTag)) - oTagFilters = value + oIncludeTagFilters = value + End Set + End Property + + Public Property ExcludeTagFilters As List(Of clsTag) + Get + Return oExcludeTagFilters + End Get + Set(value As List(Of clsTag)) + oExcludeTagFilters = value End Set End Property @@ -73,13 +83,13 @@ Public Class frmFilter End Set End Property - Private Sub AddTag() + Private Sub AddTag(ByRef lst As ListBox) Dim oData As KeyValuePair(Of String, String) Dim oTags As List(Of KeyValuePair(Of String, String)) If lstTags.SelectedItems.Count = 1 Then oData = lstTags.SelectedItems(0) - lstTagFilter.Items.Add(oData) + lst.Items.Add(oData) lstTags.Items.Remove(oData) ElseIf lstTags.SelectedItems.Count > 1 Then oTags = New List(Of KeyValuePair(Of String, String)) @@ -89,30 +99,30 @@ Public Class frmFilter Next For Each kp As KeyValuePair(Of String, String) In oTags - lstTagFilter.Items.Add(kp) + lst.Items.Add(kp) lstTags.Items.Remove(kp) Next End If End Sub - Private Sub RemoveTag() + Private Sub RemoveTag(ByRef lst As ListBox) Dim oData As KeyValuePair(Of String, String) Dim oTags As List(Of KeyValuePair(Of String, String)) - If lstTagFilter.SelectedItems.Count = 1 Then - oData = lstTagFilter.SelectedItems(0) - lstTagFilter.Items.Remove(oData) + If lst.SelectedItems.Count = 1 Then + oData = lst.SelectedItems(0) + lst.Items.Remove(oData) lstTags.Items.Add(oData) - ElseIf lstTagFilter.SelectedItems.Count > 1 Then + ElseIf lst.SelectedItems.Count > 1 Then oTags = New List(Of KeyValuePair(Of String, String)) - For Each oData In lstTagFilter.SelectedItems + For Each oData In lst.SelectedItems oTags.Add(oData) Next For Each kp As KeyValuePair(Of String, String) In oTags - lstTagFilter.Items.Remove(kp) + lst.Items.Remove(kp) lstTags.Items.Add(kp) Next End If @@ -283,13 +293,17 @@ Public Class frmFilter 'Handle Lists lstTags.Items.Clear() - lstTagFilter.Items.Clear() + lstIncludeTags.Items.Clear() + lstExcludeTags.Items.Clear() lstTags.ValueMember = "Key" lstTags.DisplayMember = "Value" - lstTagFilter.ValueMember = "Key" - lstTagFilter.DisplayMember = "Value" + lstIncludeTags.ValueMember = "Key" + lstIncludeTags.DisplayMember = "Value" + + lstExcludeTags.ValueMember = "Key" + lstExcludeTags.DisplayMember = "Value" For Each de As DictionaryEntry In hshTags oTag = DirectCast(de.Value, clsTag) @@ -322,16 +336,35 @@ Public Class frmFilter sFilter = oFilter.Field.FriendlyFieldName & " = " & oFilter.Data End Select + If oFilter.NotCondition Then + sFilter &= " (" & frmFilter_lblNot & ")" + End If + lstFilter.Items.Add(New KeyValuePair(Of clsGameFilter, String)(oFilter, sFilter)) Next End If 'Tag Filters - If oTagFilters.Count > 0 Then + If oIncludeTagFilters.Count > 0 Then chkTag.Checked = True - For Each oTag As clsTag In oTagFilters + For Each oTag As clsTag In oIncludeTagFilters oListTag = New KeyValuePair(Of String, String)(oTag.ID, oTag.Name) - lstTagFilter.Items.Add(oListTag) + lstIncludeTags.Items.Add(oListTag) + lstTags.Items.Remove(oListTag) + Next + + If eCurrentFilterType = eFilterType.AllTags Then + optAll.Checked = True + Else + optAny.Checked = True + End If + End If + + If oExcludeTagFilters.Count > 0 Then + chkTag.Checked = True + For Each oTag As clsTag In oExcludeTagFilters + oListTag = New KeyValuePair(Of String, String)(oTag.ID, oTag.Name) + lstExcludeTags.Items.Add(oListTag) lstTags.Items.Remove(oListTag) Next @@ -402,6 +435,13 @@ Public Class frmFilter sFilter = oFilter.Field.FriendlyFieldName & " = " & oFilter.Data End Select + If chkNot.Checked Then + oFilter.NotCondition = True + sFilter &= " (" & frmFilter_lblNot & ")" + Else + oFilter.NotCondition = False + End If + oGameFilters.Add(oFilter) lstFilter.Items.Add(New KeyValuePair(Of clsGameFilter, String)(oFilter, sFilter)) @@ -431,14 +471,19 @@ Public Class frmFilter If chkTag.Checked Then 'Set Tags - TagFilters.Clear() - For Each oData In lstTagFilter.Items + IncludeTagFilters.Clear() + For Each oData In lstIncludeTags.Items oTag = DirectCast(hshTags(oData.Value), clsTag) - TagFilters.Add(oTag) + IncludeTagFilters.Add(oTag) + Next + ExcludeTagFilters.Clear() + For Each oData In lstExcludeTags.Items + oTag = DirectCast(hshTags(oData.Value), clsTag) + ExcludeTagFilters.Add(oTag) Next 'Set Filter Type - If TagFilters.Count = 0 Then + If IncludeTagFilters.Count = 0 And ExcludeTagFilters.Count = 0 Then eCurrentFilterType = eFilterType.NoTags ElseIf optAll.Checked Then eCurrentFilterType = eFilterType.AllTags @@ -525,10 +570,13 @@ Public Class frmFilter grpFilterType.Text = frmFilter_grpFilterType optAll.Text = frmFilter_optAll optAny.Text = frmFilter_optAny - lblGameTags.Text = frmFilter_lblGameTags + lblIncludeTags.Text = frmFilter_lblIncludeTags + lblExcludeTags.Text = frmFilter_lblExcludeTags lblTags.Text = frmFilter_lblTags - btnRemove.Text = frmFilter_btnRemove - btnAdd.Text = frmFilter_btnAdd + btnIncludeRemove.Text = frmFilter_btnIncludeRemove + btnIncludeAdd.Text = frmFilter_btnIncludeAdd + btnExcludeRemove.Text = frmFilter_btnExcludeRemove + btnExcludeAdd.Text = frmFilter_btnExcludeAdd btnOK.Text = frmFilter_btnOK grpTagOptions.Text = frmFilter_grpTagOptions chkTag.Text = frmFilter_chkTag @@ -569,12 +617,20 @@ Public Class frmFilter Me.Close() End Sub - Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click - AddTag() + Private Sub btnIncludeAdd_Click(sender As Object, e As EventArgs) Handles btnIncludeAdd.Click + AddTag(lstIncludeTags) End Sub - Private Sub btnRemove_Click(sender As Object, e As EventArgs) Handles btnRemove.Click - RemoveTag() + Private Sub btnExcludeAdd_Click(sender As Object, e As EventArgs) Handles btnExcludeAdd.Click + AddTag(lstExcludeTags) + End Sub + + Private Sub btnExcludeRemove_Click(sender As Object, e As EventArgs) Handles btnExcludeRemove.Click + RemoveTag(lstExcludeTags) + End Sub + + Private Sub btnIncludeRemove_Click(sender As Object, e As EventArgs) Handles btnIncludeRemove.Click + RemoveTag(lstIncludeTags) End Sub Private Sub frmFilter_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing @@ -599,7 +655,7 @@ Public Class frmFilter grpTagFilter.Enabled = True Else grpTagFilter.Enabled = False - oTagFilters.Clear() + oIncludeTagFilters.Clear() LoadTagData() End If End Sub diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 73b9a42..57cee42 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -19,7 +19,8 @@ Public Class frmGameManager Private oRemoteBackupData As SortedList Private bIsDirty As Boolean = False Private bIsLoading As Boolean = False - Private oCurrentTagFilters As New List(Of clsTag) + Private oCurrentIncludeTagFilters As New List(Of clsTag) + Private oCurrentExcludeTagFilters As New List(Of clsTag) Private oCurrentFilters As New List(Of clsGameFilter) Private eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter Private bCurrentAndOperator As Boolean = False @@ -227,7 +228,8 @@ Public Class frmGameManager If Not bRetainFilter Then frm = New frmFilter - frm.TagFilters = oCurrentTagFilters + frm.IncludeTagFilters = oCurrentIncludeTagFilters + frm.ExcludeTagFilters = oCurrentExcludeTagFilters frm.GameFilters = oCurrentFilters frm.FilterType = eCurrentFilter frm.AndOperator = bCurrentAndOperator @@ -236,7 +238,8 @@ Public Class frmGameManager frm.ShowDialog() - oCurrentTagFilters = frm.TagFilters + oCurrentIncludeTagFilters = frm.IncludeTagFilters + oCurrentExcludeTagFilters = frm.ExcludeTagFilters oCurrentFilters = frm.GameFilters eCurrentFilter = frm.FilterType bCurrentAndOperator = frm.AndOperator @@ -244,14 +247,15 @@ Public Class frmGameManager sCurrentSortField = frm.SortField End If Else - oCurrentTagFilters.Clear() + oCurrentIncludeTagFilters.Clear() + oCurrentExcludeTagFilters.Clear() oCurrentFilters.Clear() eCurrentFilter = frmFilter.eFilterType.BaseFilter bCurrentSortAsc = True sCurrentSortField = "Name" End If - GameData = mgrMonitorList.ReadFilteredList(oCurrentTagFilters, oCurrentFilters, eCurrentFilter, bCurrentAndOperator, bCurrentSortAsc, sCurrentSortField) + GameData = mgrMonitorList.ReadFilteredList(oCurrentIncludeTagFilters, oCurrentExcludeTagFilters, oCurrentFilters, eCurrentFilter, bCurrentAndOperator, bCurrentSortAsc, sCurrentSortField) If optPendingRestores.Checked Then oRestoreData = mgrRestore.CompareManifests diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb index 2364f74..58f344c 100644 --- a/GBM/Managers/mgrMonitorList.vb +++ b/GBM/Managers/mgrMonitorList.vb @@ -500,8 +500,9 @@ Public Class mgrMonitorList End Sub 'Filter Functions - Private Shared Function BuildFilterQuery(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bAndOperator As Boolean, - ByVal bSortAsc As Boolean, ByVal sSortField As String, ByRef hshParams As Hashtable) As String + Private Shared Function BuildFilterQuery(ByVal oIncludeTagFilters As List(Of clsTag), ByVal oExcludeTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), + ByVal eFilterType As frmFilter.eFilterType, ByVal bAndOperator As Boolean, ByVal bSortAsc As Boolean, ByVal sSortField As String, + ByRef hshParams As Hashtable) As String Dim sSQL As String = String.Empty Dim iCounter As Integer = 0 Dim sBaseSelect As String = "MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter, Comments FROM monitorlist" @@ -517,28 +518,87 @@ Public Class mgrMonitorList Case frmFilter.eFilterType.BaseFilter sSQL = "SELECT " & sBaseSelect Case frmFilter.eFilterType.AnyTag - sSQL = "SELECT DISTINCT " & sBaseSelect - sSQL &= " NATURAL JOIN gametags WHERE gametags.TagID IN (" - For Each oTag As clsTag In oTagFilters - sSQL &= "@TagID" & iCounter & "," - hshParams.Add("TagID" & iCounter, oTag.ID) - iCounter += 1 - Next + If oExcludeTagFilters.Count > 0 And oIncludeTagFilters.Count = 0 Then + sSQL = "SELECT " & sBaseSelect - sSQL = sSQL.TrimEnd(",") - sSQL &= ")" - Case frmFilter.eFilterType.AllTags - sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID IN " + sSQL &= " WHERE MonitorID NOT IN (SELECT MonitorID FROM monitorlist NATURAL JOIN gametags WHERE gametags.TagID IN (" - For Each oTag As clsTag In oTagFilters - sSQL &= "(SELECT MonitorID FROM gametags WHERE monitorlist.MonitorID = gametags.MonitorID And TagID = @TagID" & iCounter & ")" - If iCounter <> oTagFilters.Count - 1 Then - sSQL &= " AND MonitorID IN " + For Each oTag As clsTag In oExcludeTagFilters + sSQL &= "@TagID" & iCounter & "," + hshParams.Add("TagID" & iCounter, oTag.ID) + iCounter += 1 + Next + + sSQL = sSQL.TrimEnd(",") + sSQL &= "))" + Else + sSQL = "SELECT DISTINCT " & sBaseSelect + + sSQL &= " NATURAL JOIN gametags WHERE gametags.TagID IN (" + + For Each oTag As clsTag In oIncludeTagFilters + sSQL &= "@TagID" & iCounter & "," + hshParams.Add("TagID" & iCounter, oTag.ID) + iCounter += 1 + Next + + sSQL = sSQL.TrimEnd(",") + sSQL &= ")" + + If oExcludeTagFilters.Count > 0 Then + sSQL &= " AND MonitorID NOT IN (SELECT MonitorID FROM monitorlist NATURAL JOIN gametags WHERE gametags.TagID IN (" + + For Each oTag As clsTag In oExcludeTagFilters + sSQL &= "@TagID" & iCounter & "," + hshParams.Add("TagID" & iCounter, oTag.ID) + iCounter += 1 + Next + + sSQL = sSQL.TrimEnd(",") + sSQL &= "))" End If - hshParams.Add("TagID" & iCounter, oTag.ID) - iCounter += 1 - Next + End If + + Case frmFilter.eFilterType.AllTags + + If oExcludeTagFilters.Count > 0 And oIncludeTagFilters.Count = 0 Then + sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID NOT IN " + + For Each oTag As clsTag In oExcludeTagFilters + sSQL &= "(SELECT MonitorID FROM gametags WHERE monitorlist.MonitorID = gametags.MonitorID And TagID = @TagID" & iCounter & ")" + If iCounter <> oExcludeTagFilters.Count - 1 Then + sSQL &= " AND MonitorID IN " + End If + hshParams.Add("TagID" & iCounter, oTag.ID) + iCounter += 1 + Next + Else + sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID IN " + + For Each oTag As clsTag In oIncludeTagFilters + sSQL &= "(SELECT MonitorID FROM gametags WHERE monitorlist.MonitorID = gametags.MonitorID And TagID = @TagID" & iCounter & ")" + If iCounter <> oIncludeTagFilters.Count - 1 Then + sSQL &= " AND MonitorID IN " + End If + hshParams.Add("TagID" & iCounter, oTag.ID) + iCounter += 1 + Next + + If oExcludeTagFilters.Count > 0 Then + sSQL &= " AND MonitorID NOT IN (SELECT MonitorID FROM monitorlist NATURAL JOIN gametags WHERE gametags.TagID IN (" + + For Each oTag As clsTag In oExcludeTagFilters + sSQL &= "@TagID" & iCounter & "," + hshParams.Add("TagID" & iCounter, oTag.ID) + iCounter += 1 + Next + + sSQL = sSQL.TrimEnd(",") + sSQL &= "))" + End If + End If + Case frmFilter.eFilterType.NoTags sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags)" End Select @@ -553,6 +613,10 @@ Public Class mgrMonitorList iCounter = 0 For Each oFilter As clsGameFilter In oFilters + If oFilter.NotCondition Then + sSQL &= " NOT " + End If + Select Case oFilter.Field.Type Case clsGameFilterField.eDataType.fString sSQL &= oFilter.Field.FieldName & " LIKE @" & oFilter.ID @@ -584,7 +648,7 @@ Public Class mgrMonitorList End Function - Public Shared Function ReadFilteredList(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bAndOperator As Boolean, + Public Shared Function ReadFilteredList(ByVal oIncludeTagFilters As List(Of clsTag), ByVal oExcludeTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bAndOperator As Boolean, ByVal bSortAsc As Boolean, ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As OrderedDictionary Dim oDatabase As New mgrSQLite(iSelectDB) Dim oData As DataSet @@ -594,7 +658,7 @@ Public Class mgrMonitorList Dim hshParams As New Hashtable Dim iCounter As Integer = 0 - sSQL = BuildFilterQuery(oTagFilters, oFilters, eFilterType, bAndOperator, bSortAsc, sSortField, hshParams) + sSQL = BuildFilterQuery(oIncludeTagFilters, oExcludeTagFilters, oFilters, eFilterType, bAndOperator, bSortAsc, sSortField, hshParams) oData = oDatabase.ReadParamData(sSQL, hshParams) @@ -609,7 +673,7 @@ Public Class mgrMonitorList 'Import / Export Functions - Public Shared Function ReadListForExport(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bAndOperator As Boolean, + Public Shared Function ReadListForExport(ByVal oIncludeTagFilters As List(Of clsTag), ByVal oExcludeTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bAndOperator As Boolean, ByVal bSortAsc As Boolean, ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As List(Of Game) Dim oDatabase As New mgrSQLite(iSelectDB) Dim oData As DataSet @@ -619,7 +683,7 @@ Public Class mgrMonitorList Dim oGame As Game Dim hshParams As New Hashtable - sSQL = BuildFilterQuery(oTagFilters, oFilters, eFilterType, bAndOperator, bSortAsc, sSortField, hshParams) + sSQL = BuildFilterQuery(oIncludeTagFilters, oExcludeTagFilters, oFilters, eFilterType, bAndOperator, bSortAsc, sSortField, hshParams) oData = oDatabase.ReadParamData(sSQL, hshParams) @@ -713,7 +777,8 @@ Public Class mgrMonitorList Public Shared Sub ExportMonitorList(ByVal sLocation As String) Dim oList As List(Of Game) Dim bSuccess As Boolean = False - Dim oTagFilters As New List(Of clsTag) + Dim oIncludeTagFilters As New List(Of clsTag) + Dim oExcludeTagFilters As New List(Of clsTag) Dim oFilters As New List(Of clsGameFilter) Dim eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter Dim bAndOperator As Boolean = True @@ -723,7 +788,8 @@ Public Class mgrMonitorList If mgrCommon.ShowMessage(mgrMonitorList_ConfirmApplyFilter, MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then Dim frm As New frmFilter frm.ShowDialog() - oTagFilters = frm.TagFilters + oIncludeTagFilters = frm.IncludeTagFilters + oExcludeTagFilters = frm.ExcludeTagFilters oFilters = frm.GameFilters eCurrentFilter = frm.FilterType bAndOperator = frm.AndOperator @@ -731,7 +797,7 @@ Public Class mgrMonitorList sSortField = frm.SortField End If - oList = ReadListForExport(oTagFilters, oFilters, eCurrentFilter, bAndOperator, bSortAsc, sSortField) + oList = ReadListForExport(oIncludeTagFilters, oExcludeTagFilters, oFilters, eCurrentFilter, bAndOperator, bSortAsc, sSortField) bSuccess = mgrXML.SerializeAndExport(oList, sLocation) diff --git a/GBM/My Project/Resources.Designer.vb b/GBM/My Project/Resources.Designer.vb index d1c3aba..e5a32b4 100644 --- a/GBM/My Project/Resources.Designer.vb +++ b/GBM/My Project/Resources.Designer.vb @@ -915,15 +915,6 @@ Namespace My.Resources End Get End Property - ''' - ''' Looks up a localized string similar to >. - ''' - Friend ReadOnly Property frmFilter_btnAdd() As String - Get - Return ResourceManager.GetString("frmFilter_btnAdd", resourceCulture) - End Get - End Property - ''' ''' Looks up a localized string similar to Add. ''' @@ -934,20 +925,47 @@ Namespace My.Resources End Property ''' - ''' Looks up a localized string similar to &OK. + ''' Looks up a localized string similar to >. ''' - Friend ReadOnly Property frmFilter_btnOK() As String + Friend ReadOnly Property frmFilter_btnExcludeAdd() As String Get - Return ResourceManager.GetString("frmFilter_btnOK", resourceCulture) + Return ResourceManager.GetString("frmFilter_btnExcludeAdd", resourceCulture) End Get End Property ''' ''' Looks up a localized string similar to <. ''' - Friend ReadOnly Property frmFilter_btnRemove() As String + Friend ReadOnly Property frmFilter_btnExcludeRemove() As String Get - Return ResourceManager.GetString("frmFilter_btnRemove", resourceCulture) + Return ResourceManager.GetString("frmFilter_btnExcludeRemove", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to <. + ''' + Friend ReadOnly Property frmFilter_btnIncludeAdd() As String + Get + Return ResourceManager.GetString("frmFilter_btnIncludeAdd", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to >. + ''' + Friend ReadOnly Property frmFilter_btnIncludeRemove() As String + Get + Return ResourceManager.GetString("frmFilter_btnIncludeRemove", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to &OK. + ''' + Friend ReadOnly Property frmFilter_btnOK() As String + Get + Return ResourceManager.GetString("frmFilter_btnOK", resourceCulture) End Get End Property @@ -1195,7 +1213,7 @@ Namespace My.Resources End Property ''' - ''' Looks up a localized string similar to Options. + ''' Looks up a localized string similar to Include Options. ''' Friend ReadOnly Property frmFilter_grpTagOptions() As String Get @@ -1212,6 +1230,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Exclude Tags. + ''' + Friend ReadOnly Property frmFilter_lblExcludeTags() As String + Get + Return ResourceManager.GetString("frmFilter_lblExcludeTags", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Available Fields. ''' @@ -1231,11 +1258,20 @@ Namespace My.Resources End Property ''' - ''' Looks up a localized string similar to Current Filter. + ''' Looks up a localized string similar to Include Tags. ''' - Friend ReadOnly Property frmFilter_lblGameTags() As String + Friend ReadOnly Property frmFilter_lblIncludeTags() As String Get - Return ResourceManager.GetString("frmFilter_lblGameTags", resourceCulture) + Return ResourceManager.GetString("frmFilter_lblIncludeTags", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Not. + ''' + Friend ReadOnly Property frmFilter_lblNot() As String + Get + Return ResourceManager.GetString("frmFilter_lblNot", resourceCulture) End Get End Property diff --git a/GBM/My Project/Resources.resx b/GBM/My Project/Resources.resx index d190a54..0c37006 100644 --- a/GBM/My Project/Resources.resx +++ b/GBM/My Project/Resources.resx @@ -883,20 +883,20 @@ Do you wish to search the [PARAM] drive? - - > + + < &OK - - < + + > Custom Filter - - Current Filter + + Include Tags Available Tags @@ -1010,7 +1010,7 @@ Filter Type - Options + Include Options Configuration @@ -1888,4 +1888,16 @@ Comments + + > + + + < + + + Exclude Tags + + + Not + \ No newline at end of file