рефакторинг фильтров. обобщил их от интерфейса

This commit is contained in:
2024-10-21 13:54:52 +03:00
parent 6af0df7835
commit f1c0523753
11 changed files with 95 additions and 90 deletions

14
.idea/workspace.xml generated
View File

@@ -7,20 +7,16 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="e42177c3-2328-4b27-8a01-35779b2beb99" name="Default Changelist" comment=""> <list default="true" id="e42177c3-2328-4b27-8a01-35779b2beb99" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/src/Common/Visual/DBObjectFilterInterface.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/properties" beforeDir="false" afterPath="$PROJECT_DIR$/properties" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/Common/Visual/DBObjectFilterInterface.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/Visual/DBbjectFilter_.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Common/Database/Tables/DataSet.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/Database/Tables/DataSet.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Common/Visual/DBObjectFilter.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/Visual/FilterFlagMenuItem.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Common/Visual/DataSetControlForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/Visual/DataSetControlForm.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/Common/Visual/DataSetControlForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/Visual/DataSetControlForm.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Common/Visual/DataSetFiltersMenu.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/Visual/DataSetFiltersMenu.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/Common/Visual/DataSetFiltersMenu.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/Visual/DataSetFiltersMenu.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/Common/Group/GroupsDBTable.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/Common/Group/GroupsDBTable.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/Common/Visual/FilterFlagMenuItem.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/Visual/FilterFlagMenuItem.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Common/Visual/Tables/HeaderTextFilter.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/Visual/Tables/HeaderTextFilter.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/ProjectData/Messages/MessagesControlForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/ProjectData/Messages/MessagesControlForm.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/ProjectData/Messages/Recommendations/UI/RecommendationsForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/ProjectData/Messages/Recommendations/UI/RecommendationsForm.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/Common/Group/UI/GroupsForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/Common/Group/UI/GroupsForm.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/Common/Group/UI/GroupsForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/Common/Group/UI/GroupsForm.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMPackage/DVMPackageDBTable.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMPackage/DVMPackageDBTable.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMPackage/UI/DVMPackagesForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMPackage/UI/DVMPackagesForm.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMTasks/UI/DVMRunTasksForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMTasks/UI/DVMRunTasksForm.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMTasks/UI/DVMRunTasksForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMTasks/UI/DVMRunTasksForm.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/SAPFOR/SapforPackage/SapforPackageDBTable.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/SAPFOR/SapforPackage/SapforPackageDBTable.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/SAPFOR/SapforPackage/UI/SapforPackagesForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/SAPFOR/SapforPackage/UI/SapforPackagesForm.java" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />

View File

@@ -1,6 +0,0 @@
package Common.Visual;
import Common.Database.Objects.DBObject;
public interface DBObjectFilterInterface<D extends DBObject> {
boolean Validate(D dbObject);
//-------
}

View File

@@ -0,0 +1,8 @@
package Common.Visual;
import Common.Database.Objects.DBObject;
public interface DBbjectFilter_<D extends DBObject> {
boolean Validate(D dbObject);
default void DropMatchesCount(){}
default void ShowMatchesCount(){}
//-------
}

View File

@@ -21,7 +21,6 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Vector; import java.util.Vector;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.IntStream; import java.util.stream.IntStream;
@@ -32,10 +31,22 @@ public class DataSetControlForm<D extends DBObject> extends ControlForm<DataTabl
protected boolean events_on = true; protected boolean events_on = true;
protected String colNamesAndSizes = ""; protected String colNamesAndSizes = "";
protected Vector<ColumnInfo> columns = new Vector<>(); //информация о столбцах и их оформлении protected Vector<ColumnInfo> columns = new Vector<>(); //информация о столбцах и их оформлении
protected Vector<DataSetFiltersMenu> filtersMenus = new Vector<>(); //выпадающие меню фильтрации //-
protected LinkedHashMap<Integer, HeaderTextFilter> headersTextFilters = new LinkedHashMap<>(); //текстовые фильтры столбцов protected Vector<DBbjectFilter_<D>> allFilters = new Vector<>();
<M> Vector<M> getFilters(Class<M> f){
Vector<M> res = new Vector<>();
for (DBbjectFilter_ filter_: allFilters){
//либо М, либо наследует от М
if (filter_.getClass().equals(f)||filter_.getClass().getSuperclass().equals(f)){
res.add((M) filter_);
}
}
return res;
}
public void AddFilter(DBbjectFilter_ filter_in){
allFilters.add(filter_in);
}
//---
//фильтры и подсчеты. todo слить с баром (?) //фильтры и подсчеты. todo слить с баром (?)
MatchesCounter f_ui = null; MatchesCounter f_ui = null;
//-- //--
@@ -46,6 +57,7 @@ public class DataSetControlForm<D extends DBObject> extends ControlForm<DataTabl
super(DataTable.class, mountPanel_in); super(DataTable.class, mountPanel_in);
dataSource = dataSource_in; dataSource = dataSource_in;
createFilters(); createFilters();
//--
if (hasMenuBar()) { if (hasMenuBar()) {
try { try {
if (!MainModule_.instance.getUI().menuBars.containsKey(dataSource.getClass())) { if (!MainModule_.instance.getUI().menuBars.containsKey(dataSource.getClass())) {
@@ -59,15 +71,15 @@ public class DataSetControlForm<D extends DBObject> extends ControlForm<DataTabl
mountPanel.add(bar, BorderLayout.NORTH); mountPanel.add(bar, BorderLayout.NORTH);
//-- //--
f_ui = (count -> bar.countLabel.setText(String.valueOf(count))); f_ui = (count -> bar.countLabel.setText(String.valueOf(count)));
//-- //todo возможно улушить объект бара
if (!filtersMenus.isEmpty()) { for (JMenu filter : getFilters(DataSetFiltersMenu.class)) {
for (DataSetFiltersMenu filter : filtersMenus) bar.addMenus(filter);
bar.addMenus(filter);
} }
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
System.out.println("found "+allFilters.size()+" filters for ui "+this.getClass().getSimpleName());
} }
public ColumnInfo getColumnInfo(int i) { public ColumnInfo getColumnInfo(int i) {
return columns.get(i); return columns.get(i);
@@ -320,32 +332,20 @@ public class DataSetControlForm<D extends DBObject> extends ControlForm<DataTabl
Utils_.MainLog.PrintException(e); Utils_.MainLog.PrintException(e);
} }
} }
for (HeaderTextFilter filter : headersTextFilters.values()) { for (HeaderTextFilter filter : getFilters(HeaderTextFilter.class))
filter.Mount(getControl()); filter.Mount(getControl());
}
} }
protected DataMenuBar createMenuBar() { protected DataMenuBar createMenuBar() {
return new DataMenuBar(dataSource.getPluralDescription()); return new DataMenuBar(dataSource.getPluralDescription());
} }
protected void createFilters() { protected void createFilters() {
} }
protected boolean applyFiltersMenus(D object) {
for (DataSetFiltersMenu filterMenu : filtersMenus) {
if (!filterMenu.Validate(object))
return false;
}
return true;
}
protected boolean applyHeadersFilters(D object){
for (HeaderTextFilter headerTextFilter: headersTextFilters.values()){
if (!headerTextFilter.Validate(object))
return false;
}
return true;
}
public boolean ApplyFilters(D object) { public boolean ApplyFilters(D object) {
//могут быть и другие фильтры ( например свои/активные). перенести их сюда и обобщить for (DBbjectFilter_ filterInterface: allFilters){
return applyFiltersMenus(object)&&applyHeadersFilters(object); if (!filterInterface.Validate(object))
return false;
}
return true;
} }
@Override @Override
protected void redrawControl() { protected void redrawControl() {
@@ -353,10 +353,10 @@ public class DataSetControlForm<D extends DBObject> extends ControlForm<DataTabl
} }
@Override @Override
public void Show() { public void Show() {
for (DataSetFiltersMenu filterMenu : filtersMenus) filterMenu.Drop(); for (DBbjectFilter_ filter_ : allFilters) filter_.DropMatchesCount();
super.Show(); super.Show();
if (f_ui != null) f_ui.ShowMatchesCount(getRowCount()); if (f_ui != null) f_ui.ShowMatchesCount(getRowCount());
for (DataSetFiltersMenu filterMenu : filtersMenus) filterMenu.Refresh(); for (DBbjectFilter_ filter_ : allFilters) filter_.ShowMatchesCount();
} }
public void Show(Object pk) { public void Show(Object pk) {
Show(); Show();

View File

@@ -7,7 +7,7 @@ import Common.Visual.Menus.VisualiserMenu;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.Vector; import java.util.Vector;
public abstract class DataSetFiltersMenu<D extends DBObject> extends VisualiserMenu implements DBObjectFilterInterface<D> { public abstract class DataSetFiltersMenu<D extends DBObject> extends VisualiserMenu implements DBbjectFilter_<D> {
//-- //--
protected DataSet<?, D> dataSet; protected DataSet<?, D> dataSet;
protected Vector<FilterFlagMenuItem<D>> field_filters; protected Vector<FilterFlagMenuItem<D>> field_filters;
@@ -43,26 +43,7 @@ public abstract class DataSetFiltersMenu<D extends DBObject> extends VisualiserM
} }
}); });
} }
void selectAll(boolean flag) { //----
for (FilterFlagMenuItem filter : field_filters)
filter.setActive(flag);
}
public abstract void fill();
public void Drop() {
for (FilterFlagMenuItem<D> filter : field_filters)
filter.Drop();
}
public void Refresh() {
for (FilterFlagMenuItem<D> filter : field_filters)
filter.Refresh();
}
public boolean isActive() {
for (FilterFlagMenuItem<D> filter : field_filters) {
if (filter.isActive())
return true;
}
return false;
}
@Override @Override
public boolean Validate(D object) { public boolean Validate(D object) {
if (!isActive()) { if (!isActive()) {
@@ -77,4 +58,28 @@ public abstract class DataSetFiltersMenu<D extends DBObject> extends VisualiserM
res |= true; res |= true;
return res; return res;
} }
//-------
void selectAll(boolean flag) {
for (FilterFlagMenuItem filter : field_filters)
filter.setActive(flag);
}
public abstract void fill();
@Override
public void DropMatchesCount() {
for (FilterFlagMenuItem<D> filter : field_filters)
filter.DropMatchesCount();
}
@Override
public void ShowMatchesCount() {
for (FilterFlagMenuItem<D> filter : field_filters)
filter.ShowMatchesCount();
}
public boolean isActive() {
for (FilterFlagMenuItem<D> filter : field_filters) {
if (filter.isActive())
return true;
}
return false;
}
} }

View File

@@ -6,7 +6,7 @@ import Common.Visual.Controls.StableMenuItem;
import javax.swing.*; import javax.swing.*;
//одиночный фильтр, пункт фильтрационного меню. //одиночный фильтр, пункт фильтрационного меню.
public abstract class FilterFlagMenuItem<D extends DBObject> implements DBObjectFilterInterface<D>{ public abstract class FilterFlagMenuItem<D extends DBObject> implements DBbjectFilter_<D> {
public JMenuItem menuItem; //пункт меню фильтра. ( возможно потом сделать и кнопку) public JMenuItem menuItem; //пункт меню фильтра. ( возможно потом сделать и кнопку)
//-- //--
String description; String description;
@@ -25,7 +25,14 @@ public abstract class FilterFlagMenuItem<D extends DBObject> implements DBObject
public FilterFlagMenuItem(DataSet dataSet, String description_in) { public FilterFlagMenuItem(DataSet dataSet, String description_in) {
this(dataSet, description_in, true); this(dataSet, description_in, true);
} }
//-- @Override
public boolean Validate(D object) {
boolean valid = validate(object);
if (valid)
count++;
return valid & active;
}
//-----------------------
static String getNotActiveIconPath() { static String getNotActiveIconPath() {
return "/Common/icons/NotPick.png"; return "/Common/icons/NotPick.png";
} }
@@ -36,20 +43,14 @@ public abstract class FilterFlagMenuItem<D extends DBObject> implements DBObject
menuItem.setIcon(Utils_.getIcon(active ? getActiveIconPath() : getNotActiveIconPath())); menuItem.setIcon(Utils_.getIcon(active ? getActiveIconPath() : getNotActiveIconPath()));
} }
//------- //-------
@Override
public boolean Validate(D object) {
boolean valid = validate(object);
if (valid)
count++;
return valid & active;
}
//--
protected abstract boolean validate(D object); protected abstract boolean validate(D object);
//-- //--
public void Drop() { @Override
public void DropMatchesCount() {
count = 0; count = 0;
} }
public void Refresh() { @Override
public void ShowMatchesCount() {
menuItem.setText(description + " " + Utils_.RBrackets(count)); menuItem.setText(description + " " + Utils_.RBrackets(count));
} }
public boolean isActive() { public boolean isActive() {

View File

@@ -3,18 +3,17 @@ import Common.CommonConstants;
import Common.Database.Objects.DBObject; import Common.Database.Objects.DBObject;
import Common.Database.Tables.DataSet; import Common.Database.Tables.DataSet;
import Common.Utils.Utils_; import Common.Utils.Utils_;
import Common.Visual.DBbjectFilter_;
import Common.Visual.TextField.StyledTextField; import Common.Visual.TextField.StyledTextField;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.MatteBorder; import javax.swing.border.MatteBorder;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import java.awt.*; import java.awt.*;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
public class HeaderTextFilter { public class HeaderTextFilter<D extends DBObject> implements DBbjectFilter_<D> {
DataSet dataSet = null; //таблица к интерфейсу которой относится фильтр. DataSet dataSet = null; //таблица к интерфейсу которой относится фильтр.
int columnIndex = CommonConstants.Nan; //номер столбца к которому привязан фильтр. int columnIndex = CommonConstants.Nan; //номер столбца к которому привязан фильтр.
JTextField textField = null; JTextField textField = null;
@@ -27,6 +26,12 @@ public class HeaderTextFilter {
columnIndex = columnIndex_in; columnIndex = columnIndex_in;
offset=offset_in; offset=offset_in;
} }
@Override
public boolean Validate(D object) {
Object field = dataSet.getUI().getFieldAt(object, columnIndex);
return (field instanceof String) && field.toString().contains(filterValue);
}
//---
public void Mount(DataTable control) { public void Mount(DataTable control) {
popup = new JPopupMenu() { popup = new JPopupMenu() {
{ {
@@ -105,8 +110,4 @@ public class HeaderTextFilter {
public void setFilterValue(String filterValue_in) { public void setFilterValue(String filterValue_in) {
this.filterValue = filterValue_in; this.filterValue = filterValue_in;
} }
public boolean Validate(DBObject object) {
Object field = dataSet.getUI().getFieldAt(object, columnIndex);
return (field instanceof String) && field.toString().contains(filterValue);
}
} }

View File

@@ -50,7 +50,7 @@ public class MessagesControlForm extends DataSetControlForm<Message> {
} }
@Override @Override
protected void createFilters() { protected void createFilters() {
headersTextFilters.put(3, new HeaderTextFilter(dataSource, 3, 72)); AddFilter(new HeaderTextFilter(dataSource, 3, 72));
} }
@Override @Override
protected Comparator<Message> getDefaultComparator() { protected Comparator<Message> getDefaultComparator() {

View File

@@ -31,7 +31,7 @@ public class RecommendationsForm extends DataSetControlForm<MessageRecommendatio
} }
@Override @Override
protected void createFilters() { protected void createFilters() {
headersTextFilters.put(1, new HeaderTextFilter(dataSource, 1, 72)); AddFilter(new HeaderTextFilter(dataSource, 1, 72));
} }
@Override @Override
public boolean hasMenuBar() { public boolean hasMenuBar() {

View File

@@ -81,7 +81,7 @@ public class GroupsForm extends DataSetControlForm<Group> {
} }
@Override @Override
protected void createFilters() { protected void createFilters() {
filtersMenus.add(new DataSetFiltersMenu<Group>("Тип", dataSource) { AddFilter(new DataSetFiltersMenu<Group>("Тип", dataSource) {
@Override @Override
public void fill() { public void fill() {
for (TestType type : TestType.values()) for (TestType type : TestType.values())
@@ -93,7 +93,7 @@ public class GroupsForm extends DataSetControlForm<Group> {
}); });
} }
}); });
filtersMenus.add(new DataSetFiltersMenu<Group>("Язык", dataSource) { AddFilter(new DataSetFiltersMenu<Group>("Язык", dataSource) {
@Override @Override
public void fill() { public void fill() {
for (LanguageName languageName : LanguageName.values()) { for (LanguageName languageName : LanguageName.values()) {

View File

@@ -81,7 +81,7 @@ public class DVMRunTasksForm extends DataSetControlForm<DVMRunTask> {
} }
@Override @Override
protected void createFilters() { protected void createFilters() {
filtersMenus.add(new DataSetFiltersMenu<DVMRunTask>("Компиляция", dataSource) { AddFilter(new DataSetFiltersMenu<DVMRunTask>("Компиляция", dataSource) {
@Override @Override
public void fill() { public void fill() {
for (TaskState state : TaskState.values()) { for (TaskState state : TaskState.values()) {
@@ -96,7 +96,7 @@ public class DVMRunTasksForm extends DataSetControlForm<DVMRunTask> {
} }
} }
}); });
filtersMenus.add(new DataSetFiltersMenu<DVMRunTask>("Запуск", dataSource) { AddFilter(new DataSetFiltersMenu<DVMRunTask>("Запуск", dataSource) {
@Override @Override
public void fill() { public void fill() {
for (TaskState state : TaskState.values()) { for (TaskState state : TaskState.values()) {