2024-10-07 00:58:29 +03:00
|
|
|
|
package Common.Database.Tables;
|
2024-10-09 23:37:58 +03:00
|
|
|
|
import Common.Current_;
|
2024-10-14 15:19:13 +03:00
|
|
|
|
import Common.Database.Objects.DBObject;
|
2024-10-14 20:17:29 +03:00
|
|
|
|
import Common.MainModule_;
|
2024-10-14 15:19:13 +03:00
|
|
|
|
import Common.Utils.TextLog;
|
2024-10-08 00:39:13 +03:00
|
|
|
|
import Common.Visual.DataSetControlForm;
|
2024-10-14 15:19:13 +03:00
|
|
|
|
import Common.Visual.DataSetFilter;
|
|
|
|
|
|
import Common.Visual.FilterInterface;
|
2024-10-09 20:35:18 +03:00
|
|
|
|
import Common.Visual.Menus.DataMenuBar;
|
|
|
|
|
|
import Common.Visual.Tables.ColumnFilter;
|
2024-10-15 15:13:57 +03:00
|
|
|
|
import Common.Visual.UI;
|
2024-10-08 22:33:49 +03:00
|
|
|
|
import Common.Visual.Windows.Dialog.DBObjectDialog;
|
|
|
|
|
|
import Common.Visual.Windows.Dialog.DialogFields;
|
2023-09-17 22:13:42 +03:00
|
|
|
|
|
|
|
|
|
|
import javax.swing.*;
|
|
|
|
|
|
import java.awt.*;
|
|
|
|
|
|
import java.util.Comparator;
|
|
|
|
|
|
import java.util.LinkedHashMap;
|
|
|
|
|
|
import java.util.Vector;
|
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
public class DataSet<K, D extends DBObject> extends DataSetAnchestor {
|
|
|
|
|
|
//-
|
2024-09-18 13:37:11 +03:00
|
|
|
|
public LinkedHashMap<Class, Object> selections = new LinkedHashMap<>();
|
|
|
|
|
|
//---
|
2023-09-17 22:13:42 +03:00
|
|
|
|
public String Name;
|
|
|
|
|
|
public Class<K> k; //класс первичного ключа.
|
|
|
|
|
|
public Class<D> d; //класс объектов.
|
|
|
|
|
|
public LinkedHashMap<K, D> Data = new LinkedHashMap<>(); //наполнение
|
|
|
|
|
|
//-
|
|
|
|
|
|
public DataSetControlForm ui_;
|
|
|
|
|
|
//-
|
2023-12-26 19:12:30 +03:00
|
|
|
|
public LinkedHashMap<Integer, ColumnFilter> columnsFilters = new LinkedHashMap<>(); //текстовые фильтры столбцов
|
2024-10-14 15:19:13 +03:00
|
|
|
|
protected FilterInterface f_ui; // отображение количества объектов
|
2023-12-26 19:12:30 +03:00
|
|
|
|
//--
|
|
|
|
|
|
protected Vector<DataSetFilter<D>> filters = new Vector<>();
|
|
|
|
|
|
//--
|
2023-09-17 22:13:42 +03:00
|
|
|
|
public DataSet(Class<K> k_in, Class<D> d_in) {
|
|
|
|
|
|
k = k_in;
|
|
|
|
|
|
d = d_in;
|
|
|
|
|
|
Name = d.getSimpleName();
|
|
|
|
|
|
}
|
2024-10-14 15:19:13 +03:00
|
|
|
|
protected void createFilters() {
|
|
|
|
|
|
}
|
2024-10-16 20:45:59 +03:00
|
|
|
|
public boolean hasMenuBar(){return true;}
|
|
|
|
|
|
public DataMenuBar createMenuBar() {
|
|
|
|
|
|
return new DataMenuBar(getPluralDescription());
|
2024-10-15 13:35:33 +03:00
|
|
|
|
}
|
2023-09-17 22:13:42 +03:00
|
|
|
|
public void mountUI(JPanel content_in) {
|
2024-10-15 15:13:57 +03:00
|
|
|
|
UI.Clear(content_in);
|
2023-09-17 22:13:42 +03:00
|
|
|
|
//-->
|
|
|
|
|
|
ui_ = createUI();
|
|
|
|
|
|
ui_.setContent(content_in);
|
|
|
|
|
|
//-->
|
2024-10-16 20:45:59 +03:00
|
|
|
|
if (hasMenuBar()) {
|
2024-10-14 20:57:18 +03:00
|
|
|
|
try {
|
|
|
|
|
|
DataMenuBar bar = null;
|
|
|
|
|
|
if (!MainModule_.instance.getUI().menuBars.containsKey(getClass())) {
|
2024-10-16 20:45:59 +03:00
|
|
|
|
bar = createMenuBar();
|
|
|
|
|
|
if (ui_.hasCheckBox())
|
|
|
|
|
|
bar.createSelectionButtons(this);
|
2024-10-14 20:57:18 +03:00
|
|
|
|
MainModule_.instance.getUI().menuBars.put(getClass(), bar);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
bar = MainModule_.instance.getUI().menuBars.get(getClass());
|
|
|
|
|
|
}
|
|
|
|
|
|
content_in.add(bar, BorderLayout.NORTH);
|
|
|
|
|
|
//--
|
|
|
|
|
|
setFilterUI(count -> MainModule_.instance.getUI().menuBars.get(getClass()).countLabel.setText(String.valueOf(count)));
|
|
|
|
|
|
//--
|
2024-10-15 13:35:33 +03:00
|
|
|
|
} catch (Exception ex) {
|
2024-10-14 20:57:18 +03:00
|
|
|
|
ex.printStackTrace();
|
|
|
|
|
|
}
|
2023-09-17 22:13:42 +03:00
|
|
|
|
}
|
|
|
|
|
|
content_in.add(ui_.getDataPanel(), BorderLayout.CENTER);
|
2023-12-26 19:12:30 +03:00
|
|
|
|
//----
|
|
|
|
|
|
createFilters();
|
|
|
|
|
|
if (!filters.isEmpty()) {
|
2024-10-14 20:17:29 +03:00
|
|
|
|
DataMenuBar menuBar = MainModule_.instance.getUI().menuBars.get(getClass());
|
2023-12-26 19:12:30 +03:00
|
|
|
|
for (DataSetFilter<D> filter : filters)
|
|
|
|
|
|
menuBar.addMenus(filter.menu);
|
|
|
|
|
|
}
|
2023-09-17 22:13:42 +03:00
|
|
|
|
}
|
|
|
|
|
|
public DataSetControlForm getUi() {
|
|
|
|
|
|
return ui_;
|
|
|
|
|
|
}
|
2024-10-07 17:46:38 +03:00
|
|
|
|
public void setFilterUI(FilterInterface ui_in) {
|
2023-09-17 22:13:42 +03:00
|
|
|
|
f_ui = ui_in;
|
|
|
|
|
|
}
|
|
|
|
|
|
public void ClearUI() {
|
|
|
|
|
|
if ((ui_ != null) && ui_.isShown()) {
|
|
|
|
|
|
ui_.ClearSelection();
|
|
|
|
|
|
ui_.Clear();
|
|
|
|
|
|
if (f_ui != null)
|
|
|
|
|
|
f_ui.ShowNoMatches();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
public void RefreshUI() {
|
|
|
|
|
|
if (ui_ != null) ui_.Refresh();
|
|
|
|
|
|
}
|
|
|
|
|
|
public int getRowCountUI() {
|
|
|
|
|
|
return ui_.getRowCount();
|
|
|
|
|
|
}
|
|
|
|
|
|
public void SetCurrentObjectUI(Object pk) {
|
|
|
|
|
|
if (ui_ != null) {
|
|
|
|
|
|
//todo возможно проверить, что текущий объект уже соответствует ключу, и если да, то ничего делать.
|
|
|
|
|
|
ui_.ClearSelection(); //сброс текущего объекта и всего что с ним связано.
|
|
|
|
|
|
ui_.Select(pk);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
public String[] getUIColumnNames() {
|
|
|
|
|
|
return new String[]{};
|
|
|
|
|
|
}
|
|
|
|
|
|
protected DataSetControlForm createUI() {
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
public boolean hasUI() {
|
|
|
|
|
|
return ui_ != null;
|
|
|
|
|
|
}
|
|
|
|
|
|
public void CheckAll(boolean flag) {
|
|
|
|
|
|
for (D object : Data.values()) {
|
|
|
|
|
|
if (object.isVisible())
|
|
|
|
|
|
object.Select(flag);
|
|
|
|
|
|
}
|
|
|
|
|
|
RefreshUI();
|
|
|
|
|
|
}
|
|
|
|
|
|
public D getFirstRecord() {
|
|
|
|
|
|
return Data.values().stream().findFirst().orElse(null);
|
|
|
|
|
|
}
|
|
|
|
|
|
public Vector<D> getOrderedRecords(Comparator<D> comparator) {
|
|
|
|
|
|
Vector<D> res = new Vector<>(Data.values());
|
|
|
|
|
|
res.sort(comparator);
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
|
|
public DBObjectDialog<D, ? extends DialogFields> getDialog() {
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
public boolean ShowAddObjectDialog(DBObject object) {
|
|
|
|
|
|
return getDialog().ShowDialog(getSingleDescription() + ": добавление", object);
|
|
|
|
|
|
}
|
|
|
|
|
|
public boolean ShowEditObjectDialog(DBObject object) {
|
|
|
|
|
|
DBObjectDialog dialog = getDialog();
|
|
|
|
|
|
dialog.edit = true;
|
|
|
|
|
|
dialog.SetEditLimits();
|
|
|
|
|
|
return dialog.ShowDialog(getSingleDescription() + ": редактирование", object);
|
|
|
|
|
|
}
|
|
|
|
|
|
public boolean ViewObject(DBObject object) {
|
|
|
|
|
|
DBObjectDialog dialog = getDialog();
|
|
|
|
|
|
dialog.SetReadonly();
|
|
|
|
|
|
dialog.ShowDialog(getSingleDescription() + ": просмотр", object);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
public boolean ShowDeleteObjectDialog(DBObject object) {
|
2024-10-15 15:13:57 +03:00
|
|
|
|
return UI.Warning(getSingleDescription() + " " + object.getBDialogName() + " будет удален(а)");
|
2023-09-17 22:13:42 +03:00
|
|
|
|
}
|
2024-10-16 18:58:23 +03:00
|
|
|
|
public boolean ShowDeleteObjectsDialog(int toDeleteCount) {
|
|
|
|
|
|
return UI.Warning(getPluralDescription() + " в количестве " + toDeleteCount + " будут удалены)");
|
|
|
|
|
|
}
|
2023-09-17 22:13:42 +03:00
|
|
|
|
public String QName() {
|
|
|
|
|
|
return "\"" + Name + "\"";
|
|
|
|
|
|
}
|
|
|
|
|
|
public String getPKName() {
|
|
|
|
|
|
return "";
|
|
|
|
|
|
} //получить имя ключевого поля. нужно для таблиц.
|
|
|
|
|
|
public String getPluralDescription() {
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
public String getSingleDescription() {
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
//-
|
|
|
|
|
|
public void put(Object key, D object) {
|
|
|
|
|
|
Data.put((K) key, object);
|
|
|
|
|
|
}
|
|
|
|
|
|
public D get(Object key) {
|
|
|
|
|
|
return Data.get(key);
|
|
|
|
|
|
}
|
|
|
|
|
|
public Object getFieldAt(D object, int columnIndex) {
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
public void clear() {
|
|
|
|
|
|
Data.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
public int size() {
|
|
|
|
|
|
return Data.size();
|
|
|
|
|
|
}
|
|
|
|
|
|
public boolean containsKey(Object key) {
|
|
|
|
|
|
return Data.containsKey(key);
|
|
|
|
|
|
}
|
|
|
|
|
|
//-
|
|
|
|
|
|
public Vector<K> getVisibleKeys() {
|
|
|
|
|
|
Comparator<D> comparator = getComparator();
|
|
|
|
|
|
Vector<K> res = new Vector<>();
|
|
|
|
|
|
if (comparator == null) {
|
|
|
|
|
|
for (K key : Data.keySet())
|
|
|
|
|
|
if (Data.get(key).isVisible())
|
|
|
|
|
|
res.add(key);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
Vector<D> raw = new Vector<>();
|
|
|
|
|
|
for (D object : Data.values()) {
|
|
|
|
|
|
if (object.isVisible())
|
|
|
|
|
|
raw.add(object);
|
|
|
|
|
|
}
|
|
|
|
|
|
raw.sort(comparator);
|
|
|
|
|
|
for (D object : raw)
|
|
|
|
|
|
res.add((K) object.getPK());
|
|
|
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
protected Comparator<D> getComparator() {
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
2024-10-16 18:58:23 +03:00
|
|
|
|
public int getSelectedCount() {
|
2023-09-17 22:13:42 +03:00
|
|
|
|
return (int) Data.values().stream().filter(d -> d.isVisible() && d.isSelected()).count();
|
|
|
|
|
|
}
|
2024-10-16 18:58:23 +03:00
|
|
|
|
public Vector<D> getSelectedItems() {
|
2023-09-17 22:13:42 +03:00
|
|
|
|
return Data.values().stream().filter(d -> d.isVisible() && d.isSelected()).collect(Collectors.toCollection(Vector::new));
|
|
|
|
|
|
}
|
2024-10-16 18:58:23 +03:00
|
|
|
|
public Vector<K> getSelectedKeys() {
|
2023-09-17 22:13:42 +03:00
|
|
|
|
return Data.values().stream().filter(DBObject::isSelected).map(d -> (K) d.getPK()).collect(Collectors.toCollection(Vector::new));
|
|
|
|
|
|
}
|
|
|
|
|
|
//--
|
|
|
|
|
|
// применить значение фильтра к фильру объекта напирмер Message.filterValue = text;
|
|
|
|
|
|
public void changeColumnFilterValue(int columnIndex, String text) {
|
|
|
|
|
|
}
|
|
|
|
|
|
public Object getColumnFilterValue(int columnIndex) {
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
2023-12-26 19:12:30 +03:00
|
|
|
|
//--
|
|
|
|
|
|
public void ShowUI() {
|
|
|
|
|
|
for (DataSetFilter<D> filter : filters)
|
|
|
|
|
|
filter.Drop();
|
|
|
|
|
|
//--
|
|
|
|
|
|
if (ui_ != null) {
|
|
|
|
|
|
ui_.Show();
|
|
|
|
|
|
if (f_ui != null)
|
|
|
|
|
|
f_ui.ShowMatchesCount(getRowCountUI());
|
|
|
|
|
|
}
|
|
|
|
|
|
//--
|
|
|
|
|
|
for (DataSetFilter<D> filter : filters)
|
|
|
|
|
|
filter.Refresh();
|
|
|
|
|
|
}
|
|
|
|
|
|
public void ShowUI(Object key) {
|
|
|
|
|
|
for (DataSetFilter<D> filter : filters)
|
|
|
|
|
|
filter.Drop();
|
|
|
|
|
|
//--
|
|
|
|
|
|
if (ui_ != null) {
|
|
|
|
|
|
ui_.Show(key);
|
|
|
|
|
|
if (f_ui != null)
|
|
|
|
|
|
f_ui.ShowMatchesCount(getRowCountUI());
|
|
|
|
|
|
}
|
|
|
|
|
|
//--
|
|
|
|
|
|
for (DataSetFilter<D> filter : filters)
|
|
|
|
|
|
filter.Refresh();
|
|
|
|
|
|
}
|
|
|
|
|
|
public boolean applyFilters(D object) {
|
|
|
|
|
|
for (DataSetFilter<D> filter : filters) {
|
|
|
|
|
|
if (!filter.Validate(object))
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2024-10-08 00:39:13 +03:00
|
|
|
|
//------------------------------------------------------------------------------------
|
2024-10-09 23:37:58 +03:00
|
|
|
|
public Current_ CurrentName() {
|
2024-10-08 00:39:13 +03:00
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
public boolean CheckCurrent(TextLog log) {
|
2024-10-16 00:13:09 +03:00
|
|
|
|
return MainModule_.instance.Check(log, CurrentName());
|
2024-10-08 00:39:13 +03:00
|
|
|
|
}
|
2024-10-16 18:58:23 +03:00
|
|
|
|
public boolean CheckSelectedOrCurrent(TextLog log) {
|
|
|
|
|
|
if ((getSelectedCount() == 0) && (CurrentName()==null || (getCurrent()==null))) {
|
|
|
|
|
|
log.Writeln_(getPluralDescription() + ":");
|
|
|
|
|
|
log.Writeln_("Отсутствуют отмеченные объекты, или текущий объект!");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2024-10-08 00:39:13 +03:00
|
|
|
|
public boolean hasCurrent() {
|
2024-10-16 00:13:09 +03:00
|
|
|
|
return MainModule_.instance.get(CurrentName()) != null;
|
2024-10-08 00:39:13 +03:00
|
|
|
|
}
|
|
|
|
|
|
public void dropCurrent() {
|
2024-10-16 00:13:09 +03:00
|
|
|
|
MainModule_.instance.set(CurrentName(), null);
|
2024-10-08 00:39:13 +03:00
|
|
|
|
}
|
|
|
|
|
|
public D getCurrent() {
|
2024-10-16 00:13:09 +03:00
|
|
|
|
return (D) MainModule_.instance.get(CurrentName());
|
2024-10-08 00:39:13 +03:00
|
|
|
|
}
|
|
|
|
|
|
public void setCurrent(D o) {
|
2024-10-16 00:13:09 +03:00
|
|
|
|
MainModule_.instance.set(CurrentName(), o);
|
2024-10-08 00:39:13 +03:00
|
|
|
|
}
|
2024-10-16 18:58:23 +03:00
|
|
|
|
public Vector<D> getSelectedOrCurrent() {
|
2024-03-22 23:08:51 +03:00
|
|
|
|
Vector<D> res = new Vector<>();
|
2024-10-16 18:58:23 +03:00
|
|
|
|
if (getSelectedCount() > 0)
|
|
|
|
|
|
res = getSelectedItems();
|
2024-03-22 23:08:51 +03:00
|
|
|
|
else {
|
2024-10-16 18:58:23 +03:00
|
|
|
|
if ((CurrentName() != null) && (getCurrent() != null)) {
|
|
|
|
|
|
res.add(getCurrent());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
public Vector<K> getSelectedOrCurrentKeys(){
|
|
|
|
|
|
Vector<K> res = new Vector<>();
|
|
|
|
|
|
if (getSelectedCount() > 0)
|
|
|
|
|
|
res = getSelectedKeys();
|
|
|
|
|
|
else {
|
|
|
|
|
|
if ((CurrentName() != null) && (getCurrent() != null)) {
|
|
|
|
|
|
res.add((K) getCurrent().getPK());
|
2024-03-22 23:08:51 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
2024-10-08 00:39:13 +03:00
|
|
|
|
public void SaveLastSelections() {
|
|
|
|
|
|
if (hasUI()) {
|
|
|
|
|
|
Object lastPk = null;
|
|
|
|
|
|
if ((CurrentName() != null) && (getCurrent() != null))
|
|
|
|
|
|
lastPk = getCurrent().getPK();
|
|
|
|
|
|
if (!selections.containsKey(getClass()))
|
|
|
|
|
|
selections.put(getClass(), lastPk);
|
|
|
|
|
|
else selections.replace(getClass(), lastPk);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
public void RestoreLastSelections() {
|
|
|
|
|
|
if (hasUI()) {
|
|
|
|
|
|
Object lastPk = selections.get(getClass());
|
|
|
|
|
|
if ((CurrentName() != null) && (lastPk != null)) {
|
|
|
|
|
|
ui_.Select(lastPk);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
2023-09-17 22:13:42 +03:00
|
|
|
|
}
|