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

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

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.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Vector;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -32,10 +31,22 @@ public class DataSetControlForm<D extends DBObject> extends ControlForm<DataTabl
protected boolean events_on = true;
protected String colNamesAndSizes = "";
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 слить с баром (?)
MatchesCounter f_ui = null;
//--
@@ -46,6 +57,7 @@ public class DataSetControlForm<D extends DBObject> extends ControlForm<DataTabl
super(DataTable.class, mountPanel_in);
dataSource = dataSource_in;
createFilters();
//--
if (hasMenuBar()) {
try {
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);
//--
f_ui = (count -> bar.countLabel.setText(String.valueOf(count)));
//--
if (!filtersMenus.isEmpty()) {
for (DataSetFiltersMenu filter : filtersMenus)
bar.addMenus(filter);
//todo возможно улушить объект бара
for (JMenu filter : getFilters(DataSetFiltersMenu.class)) {
bar.addMenus(filter);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
System.out.println("found "+allFilters.size()+" filters for ui "+this.getClass().getSimpleName());
}
public ColumnInfo getColumnInfo(int i) {
return columns.get(i);
@@ -320,32 +332,20 @@ public class DataSetControlForm<D extends DBObject> extends ControlForm<DataTabl
Utils_.MainLog.PrintException(e);
}
}
for (HeaderTextFilter filter : headersTextFilters.values()) {
for (HeaderTextFilter filter : getFilters(HeaderTextFilter.class))
filter.Mount(getControl());
}
}
protected DataMenuBar createMenuBar() {
return new DataMenuBar(dataSource.getPluralDescription());
}
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) {
//могут быть и другие фильтры ( например свои/активные). перенести их сюда и обобщить
return applyFiltersMenus(object)&&applyHeadersFilters(object);
for (DBbjectFilter_ filterInterface: allFilters){
if (!filterInterface.Validate(object))
return false;
}
return true;
}
@Override
protected void redrawControl() {
@@ -353,10 +353,10 @@ public class DataSetControlForm<D extends DBObject> extends ControlForm<DataTabl
}
@Override
public void Show() {
for (DataSetFiltersMenu filterMenu : filtersMenus) filterMenu.Drop();
for (DBbjectFilter_ filter_ : allFilters) filter_.DropMatchesCount();
super.Show();
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) {
Show();

View File

@@ -7,7 +7,7 @@ import Common.Visual.Menus.VisualiserMenu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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 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
public boolean Validate(D object) {
if (!isActive()) {
@@ -77,4 +58,28 @@ public abstract class DataSetFiltersMenu<D extends DBObject> extends VisualiserM
res |= true;
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.*;
//одиночный фильтр, пункт фильтрационного меню.
public abstract class FilterFlagMenuItem<D extends DBObject> implements DBObjectFilterInterface<D>{
public abstract class FilterFlagMenuItem<D extends DBObject> implements DBbjectFilter_<D> {
public JMenuItem menuItem; //пункт меню фильтра. ( возможно потом сделать и кнопку)
//--
String description;
@@ -25,7 +25,14 @@ public abstract class FilterFlagMenuItem<D extends DBObject> implements DBObject
public FilterFlagMenuItem(DataSet dataSet, String description_in) {
this(dataSet, description_in, true);
}
//--
@Override
public boolean Validate(D object) {
boolean valid = validate(object);
if (valid)
count++;
return valid & active;
}
//-----------------------
static String getNotActiveIconPath() {
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()));
}
//-------
@Override
public boolean Validate(D object) {
boolean valid = validate(object);
if (valid)
count++;
return valid & active;
}
//--
protected abstract boolean validate(D object);
//--
public void Drop() {
@Override
public void DropMatchesCount() {
count = 0;
}
public void Refresh() {
@Override
public void ShowMatchesCount() {
menuItem.setText(description + " " + Utils_.RBrackets(count));
}
public boolean isActive() {

View File

@@ -3,18 +3,17 @@ import Common.CommonConstants;
import Common.Database.Objects.DBObject;
import Common.Database.Tables.DataSet;
import Common.Utils.Utils_;
import Common.Visual.DBbjectFilter_;
import Common.Visual.TextField.StyledTextField;
import javax.swing.*;
import javax.swing.border.MatteBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class HeaderTextFilter {
public class HeaderTextFilter<D extends DBObject> implements DBbjectFilter_<D> {
DataSet dataSet = null; //таблица к интерфейсу которой относится фильтр.
int columnIndex = CommonConstants.Nan; //номер столбца к которому привязан фильтр.
JTextField textField = null;
@@ -27,6 +26,12 @@ public class HeaderTextFilter {
columnIndex = columnIndex_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) {
popup = new JPopupMenu() {
{
@@ -105,8 +110,4 @@ public class HeaderTextFilter {
public void setFilterValue(String 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
protected void createFilters() {
headersTextFilters.put(3, new HeaderTextFilter(dataSource, 3, 72));
AddFilter(new HeaderTextFilter(dataSource, 3, 72));
}
@Override
protected Comparator<Message> getDefaultComparator() {

View File

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

View File

@@ -81,7 +81,7 @@ public class GroupsForm extends DataSetControlForm<Group> {
}
@Override
protected void createFilters() {
filtersMenus.add(new DataSetFiltersMenu<Group>("Тип", dataSource) {
AddFilter(new DataSetFiltersMenu<Group>("Тип", dataSource) {
@Override
public void fill() {
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
public void fill() {
for (LanguageName languageName : LanguageName.values()) {

View File

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