diff --git a/AccordionBus/BusCollectionForm.form b/AccordionBus/BusCollectionForm.form
index 117aad5..af5c77a 100644
--- a/AccordionBus/BusCollectionForm.form
+++ b/AccordionBus/BusCollectionForm.form
@@ -3,7 +3,7 @@
-
+
@@ -17,7 +17,7 @@
-
+
@@ -27,7 +27,7 @@
-
+
@@ -35,7 +35,7 @@
-
+
@@ -43,7 +43,7 @@
-
+
@@ -51,7 +51,7 @@
-
+
@@ -68,7 +68,7 @@
-
+
@@ -77,7 +77,7 @@
-
+
@@ -85,7 +85,7 @@
-
+
@@ -93,7 +93,7 @@
-
+
@@ -101,7 +101,7 @@
-
+
@@ -109,13 +109,22 @@
-
+
+
+
+
+
+
+
+
+
+
diff --git a/AccordionBus/BusCollectionForm.java b/AccordionBus/BusCollectionForm.java
index 576b7a6..c95c665 100644
--- a/AccordionBus/BusCollectionForm.java
+++ b/AccordionBus/BusCollectionForm.java
@@ -3,7 +3,11 @@ package AccordionBus;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
+import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
import java.util.LinkedList;
import java.util.Random;
@@ -35,15 +39,33 @@ public class BusCollectionForm extends JFrame {
private JList listStorages;
private JButton buttonDeleteObject;
private JButton buttonShowDeletedBus;
+ private JPanel toolbarPanel;
+ private JMenuBar menuBar = new JMenuBar();
+ private JMenu fileMenu = new JMenu("Файл");
+ private JMenuItem saveItem = new JMenuItem("Сохранение");
+ private JMenuItem openItem = new JMenuItem("Загрузка");
+ private JMenuItem saveCollectionItem = new JMenuItem("Сохранение коллекции");
+ private JMenuItem openCollectionItem = new JMenuItem("Загрузка коллекции");
// Конструктор
public BusCollectionForm() {
pictureBoxCollection.setSize(new Dimension(700, 450));
_storage = new BusGenericStorage(pictureBoxCollection.getWidth(), pictureBoxCollection.getHeight());
_deletedBuses = new LinkedList();
+
+ // Модель списка
listModel = new DefaultListModel();
listStorages.setModel(listModel);
+ // Выпадающее меню для работы с файлами
+ fileMenu.add(saveItem);
+ fileMenu.add(openItem);
+ fileMenu.add(saveCollectionItem);
+ fileMenu.add(openCollectionItem);
+ menuBar.add(fileMenu);
+ toolbarPanel.setLayout(new BorderLayout());
+ toolbarPanel.add(menuBar);
+
// Добавление набора
buttonAddObject.addActionListener(e -> {
if (textFieldStorage.getText().length() == 0) {
@@ -97,7 +119,7 @@ public class BusCollectionForm extends JFrame {
JOptionPane.showMessageDialog(this.getMainPanel(), "Объект добавлен", "Успех", JOptionPane.INFORMATION_MESSAGE);
}
else {
- JOptionPane.showMessageDialog(this.getMainPanel(), " Объект не добавлен", "Ошибка", JOptionPane.INFORMATION_MESSAGE);
+ JOptionPane.showMessageDialog(this.getMainPanel(), "Объект не добавлен", "Ошибка", JOptionPane.INFORMATION_MESSAGE);
}
}
});
@@ -162,6 +184,93 @@ public class BusCollectionForm extends JFrame {
frameAccordionBus.accordionBusForm.Draw();
frameAccordionBus.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
});
+
+ // Сохранить данные в файл
+ saveItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JFileChooser fileChooser = new JFileChooser();
+ fileChooser.setDialogTitle("Сохранить");
+ fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt"));
+
+ if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
+ File file = fileChooser.getSelectedFile();
+ if (_storage.SaveData(file.getAbsolutePath())) {
+ JOptionPane.showMessageDialog(null, "Сохранение прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE);
+ }
+ else {
+ JOptionPane.showMessageDialog(null, "Не удалось сохранить данные", "Результат", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ }
+ });
+
+ // Сохранить коллекцию в файл
+ saveCollectionItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (listStorages.getSelectedIndex() == -1) {
+ JOptionPane.showMessageDialog(null, "Не выбрана коллекция", "Ошибка", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ JFileChooser fileChooser = new JFileChooser();
+ fileChooser.setDialogTitle("Сохранить коллекцию");
+ fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt"));
+
+ if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
+ File file = fileChooser.getSelectedFile();
+ if (_storage.SaveCollectionData(file.getAbsolutePath(), listStorages.getSelectedValue().toString())) {
+ JOptionPane.showMessageDialog(null, "Сохранение прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE);
+ }
+ else {
+ JOptionPane.showMessageDialog(null, "Не удалось сохранить данные", "Результат", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ }
+ });
+
+ // Загрузить данные из файла
+ openItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JFileChooser fileChooser = new JFileChooser();
+ fileChooser.setDialogTitle("Загрузить");
+ fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt"));
+
+ if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
+ File file = fileChooser.getSelectedFile();
+ if (_storage.LoadData(file.getAbsolutePath())) {
+ JOptionPane.showMessageDialog(null, "Загрузка прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE);
+ }
+ else {
+ JOptionPane.showMessageDialog(null, "Не удалось загрузить данные", "Результат", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ ReloadObjects();
+ }
+ });
+
+ // Загрузить коллекцию из файла
+ openCollectionItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JFileChooser fileChooser = new JFileChooser();
+ fileChooser.setDialogTitle("Загрузить коллекцию");
+ fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt"));
+
+ if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
+ File file = fileChooser.getSelectedFile();
+ if (_storage.LoadCollectionData(file.getAbsolutePath())) {
+ JOptionPane.showMessageDialog(null, "Загрузка прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE);
+ }
+ else {
+ JOptionPane.showMessageDialog(null, "Не удалось загрузить данные", "Результат", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ ReloadObjects();
+ }
+ });
}
// Заполнение ListBoxObject
diff --git a/AccordionBus/BusGenericCollection.java b/AccordionBus/BusGenericCollection.java
index 379e4aa..759f5ea 100644
--- a/AccordionBus/BusGenericCollection.java
+++ b/AccordionBus/BusGenericCollection.java
@@ -19,6 +19,11 @@ public class BusGenericCollection _collection;
+ // Получение объектов коллекции
+ public Iterable GetBuses(final Integer maxBuses) {
+ return _collection.GetBuses(maxBuses);
+ }
+
// Конструктор
public BusGenericCollection(int picWidth, int picHeight) {
int width = picWidth / _placeSizeWidth;
@@ -49,6 +54,11 @@ public class BusGenericCollection>();
@@ -51,7 +66,7 @@ public class BusGenericStorage {
return null;
}
- // Доступ к объекту из набору
+ // Доступ к объекту из набора
public DrawingObjectBus get(String ind1, int ind2) {
// Проверка наличия ключа
if (_busStorages.containsKey(ind1)) {
@@ -59,4 +74,168 @@ public class BusGenericStorage {
}
return null;
}
+
+ // Сохранение информации по автобусам в хранилище в файл
+ public boolean SaveData(String filename) {
+ if (new File(filename).exists()) {
+ new File(filename).delete();
+ }
+
+ StringBuilder data = new StringBuilder();
+ for (Map.Entry> record : _busStorages.entrySet()) {
+ StringBuilder records = new StringBuilder();
+ for (DrawingBus elem : record.getValue().GetBuses(100)) {
+ records.append(elem != null ? ExtensionDrawingBus.GetDataForSave(elem, _separatorForObjectWR) + _separatorRecordsWR : "");
+ }
+ data.append(record.getKey() + _separatorForKeyValueWR + records + "\n");
+ }
+
+ if (data.length() == 0) {
+ return false;
+ }
+
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {
+ writer.write("BusStorage" + System.lineSeparator() + data.toString());
+ }
+ catch (IOException ex) {
+ ex.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
+
+ // Сохранение информации по автобусам из коллекции хранилища в файл
+ public boolean SaveCollectionData(String filename, String key) {
+ if (new File(filename).exists()) {
+ new File(filename).delete();
+ }
+
+ StringBuilder data = new StringBuilder();
+ data.append(key + "\n");
+ for (DrawingBus elem : _busStorages.get(key).GetBuses(100)) {
+ data.append(elem != null ? ExtensionDrawingBus.GetDataForSave(elem, _separatorForObjectWR) + "\n" : "");
+ }
+
+ if (data.length() == 0) {
+ return false;
+ }
+
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) {
+ writer.write("BusCollectionStorage" + System.lineSeparator() + data.toString());
+ }
+ catch (IOException ex) {
+ ex.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
+
+ // Загрузка информации по автобусам в хранилище из файла
+ public boolean LoadData(String filename) {
+ if (!new File(filename).exists()) {
+ return false;
+ }
+
+ try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
+ String line = reader.readLine();
+ // Если строка пустая
+ if (line == null || line.length() == 0) {
+ return false;
+ }
+ // Если нет записи "BusStorage", то это не те данные
+ if (!line.startsWith("BusStorage")) {
+ return false;
+ }
+
+ _busStorages.clear();
+
+ line = reader.readLine();
+ while (line != null && line.length() != 0) {
+ String[] record = line.split(_separatorForKeyValue);
+ if (record.length != 2) {
+ continue;
+ }
+
+ BusGenericCollection collection = new BusGenericCollection<>(_pictureWidth, _pictureHeight);
+ String[] set = record[1].split(_separatorRecords);
+ for (String elem : set) {
+ DrawingBus bus = ExtensionDrawingBus.CreateDrawingBus(elem, _separatorForObject, _pictureWidth, _pictureHeight);
+ if (bus != null) {
+ if (collection.plus(bus) == -1) {
+ return false;
+ }
+ }
+ }
+
+ _busStorages.put(record[0], collection);
+ line = reader.readLine();
+ }
+ }
+ catch (IOException ex) {
+ ex.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
+
+ // Загрузка информации по автобусам в коллекцию хранилища из файла
+ public boolean LoadCollectionData(String filename) {
+ if (!new File(filename).exists()) {
+ return false;
+ }
+
+ try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
+ String line = reader.readLine();
+ // Если строка пустая
+ if (line == null || line.length() == 0) {
+ return false;
+ }
+ // Если нет записи "BusCollectionStorage", то это не те данные
+ if (!line.startsWith("BusCollectionStorage")) {
+ return false;
+ }
+
+ String key = reader.readLine();
+ // Если значение ключа пустое
+ if (key == null || key.length() == 0) {
+ return false;
+ }
+
+ BusGenericCollection collection;
+ if (_busStorages.containsKey(key)) {
+ collection = _busStorages.get(key);
+ collection.Clear();
+ }
+ else {
+ collection = new BusGenericCollection<>(_pictureWidth, _pictureHeight);
+ }
+
+ List buses = new ArrayList();
+ line = reader.readLine();
+ while (line != null && line.length() != 0) {
+ buses.add(line);
+ line = reader.readLine();
+ }
+
+ for (String elem : buses) {
+ DrawingBus bus = ExtensionDrawingBus.CreateDrawingBus(elem, _separatorForObject, _pictureWidth, _pictureHeight);
+ if (bus != null) {
+ if (collection.plus(bus) == -1) {
+ return false;
+ }
+ }
+ }
+
+ _busStorages.put(key, collection);
+ }
+ catch (IOException ex) {
+ ex.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
}
diff --git a/AccordionBus/DrawingDoorsTypeOne.java b/AccordionBus/DrawingDoorsTypeOne.java
index 894733d..9bf5d6c 100644
--- a/AccordionBus/DrawingDoorsTypeOne.java
+++ b/AccordionBus/DrawingDoorsTypeOne.java
@@ -15,6 +15,14 @@ public class DrawingDoorsTypeOne implements IDrawingDoors {
}
}
+ public int getNumDoors() {
+ return switch (numDoors) {
+ case Three -> 3;
+ case Four -> 4;
+ case Five -> 5;
+ };
+ }
+
public void DrawDoors(Graphics2D g2d, Color color, boolean isAdditionalBody, int _startPosX, int _startPosY) {
int value = numDoors.getNumDoors();
if (value >= 3) {
diff --git a/AccordionBus/DrawingDoorsTypeThree.java b/AccordionBus/DrawingDoorsTypeThree.java
index e28610a..b812e2d 100644
--- a/AccordionBus/DrawingDoorsTypeThree.java
+++ b/AccordionBus/DrawingDoorsTypeThree.java
@@ -15,6 +15,14 @@ public class DrawingDoorsTypeThree implements IDrawingDoors {
}
}
+ public int getNumDoors() {
+ return switch (numDoors) {
+ case Three -> 3;
+ case Four -> 4;
+ case Five -> 5;
+ };
+ }
+
public void DrawDoors(Graphics2D g2d, Color color, boolean isAdditionalBody, int _startPosX, int _startPosY) {
int value = numDoors.getNumDoors();
if (value >= 3) {
diff --git a/AccordionBus/DrawingDoorsTypeTwo.java b/AccordionBus/DrawingDoorsTypeTwo.java
index c5a1ae8..4fec906 100644
--- a/AccordionBus/DrawingDoorsTypeTwo.java
+++ b/AccordionBus/DrawingDoorsTypeTwo.java
@@ -15,6 +15,14 @@ public class DrawingDoorsTypeTwo implements IDrawingDoors {
}
}
+ public int getNumDoors() {
+ return switch (numDoors) {
+ case Three -> 3;
+ case Four -> 4;
+ case Five -> 5;
+ };
+ }
+
public void DrawDoors(Graphics2D g2d, Color color, boolean isAdditionalBody, int _startPosX, int _startPosY) {
int value = numDoors.getNumDoors();
if (value >= 3) {
diff --git a/AccordionBus/ExtensionDrawingBus.java b/AccordionBus/ExtensionDrawingBus.java
new file mode 100644
index 0000000..5b37d11
--- /dev/null
+++ b/AccordionBus/ExtensionDrawingBus.java
@@ -0,0 +1,94 @@
+package AccordionBus;
+
+import java.awt.Color;
+
+// Расширение для класса EntityBus
+public class ExtensionDrawingBus {
+ // Создание объекта из строки
+ public static DrawingBus CreateDrawingBus(String info, String separatorForObject, int width, int height) {
+ String[] strs = info.split(separatorForObject);
+ if (strs.length == 5)
+ {
+ String[] bodyColorValues = strs[2].split(",");
+
+ DrawingBus drawingBus = new DrawingBus(
+ Integer.parseInt(strs[0]),
+ Integer.parseInt(strs[1]),
+ new Color(
+ Integer.parseInt(bodyColorValues[0].replaceAll("\\D", "")),
+ Integer.parseInt(bodyColorValues[1].replaceAll("\\D", "")),
+ Integer.parseInt(bodyColorValues[2].replaceAll("\\D", ""))
+ ),
+ width, height);
+
+ try {
+ drawingBus.drawingDoors = (IDrawingDoors)Class.forName(strs[3]).getDeclaredConstructor().newInstance();
+ drawingBus.drawingDoors.setNumDoors(Integer.parseInt(strs[4]));
+ }
+ catch (Exception ex) {
+ return null;
+ }
+
+ return drawingBus;
+ }
+
+ if (strs.length == 8)
+ {
+ String[] bodyColorValues = strs[2].split(",");
+ String[] additionalColorValues = strs[5].split(",");
+
+ DrawingAccordionBus drawingAccordionBus = new DrawingAccordionBus(
+ Integer.parseInt(strs[0]),
+ Integer.parseInt(strs[1]),
+ new Color(
+ Integer.parseInt(bodyColorValues[0].replaceAll("\\D", "")),
+ Integer.parseInt(bodyColorValues[1].replaceAll("\\D", "")),
+ Integer.parseInt(bodyColorValues[2].replaceAll("\\D", ""))
+ ),
+ new Color(
+ Integer.parseInt(additionalColorValues[0].replaceAll("\\D", "")),
+ Integer.parseInt(additionalColorValues[1].replaceAll("\\D", "")),
+ Integer.parseInt(additionalColorValues[2].replaceAll("\\D", ""))
+ ),
+ Boolean.parseBoolean(strs[6]),
+ Boolean.parseBoolean(strs[7]),
+ width, height);
+
+ try {
+ drawingAccordionBus.drawingDoors = (IDrawingDoors)Class.forName(strs[3]).getDeclaredConstructor().newInstance();
+ drawingAccordionBus.drawingDoors.setNumDoors(Integer.parseInt(strs[4]));
+ }
+ catch (Exception ex) {
+ return null;
+ }
+
+ return drawingAccordionBus;
+ }
+
+ return null;
+ }
+
+ // Получение данных для сохранения в файл
+ public static String GetDataForSave(DrawingBus drawingBus, String separatorForObject) {
+ EntityBus bus = drawingBus.EntityBus;
+ if (bus == null)
+ {
+ return null;
+ }
+
+ String str = "" + bus.Speed + separatorForObject +
+ (int)bus.Weight + separatorForObject +
+ bus.BodyColor + separatorForObject +
+ drawingBus.drawingDoors.getClass().getName() + separatorForObject +
+ drawingBus.drawingDoors.getNumDoors();
+
+ if (!(bus instanceof EntityAccordionBus)) {
+ return str;
+ }
+
+ return str + separatorForObject +
+ ((EntityAccordionBus)bus).getAdditionalColor() + separatorForObject +
+ ((EntityAccordionBus)bus).isAdditionalBody() + separatorForObject +
+ ((EntityAccordionBus)bus).isAdditionalDoor();
+ }
+}
diff --git a/AccordionBus/IDrawingDoors.java b/AccordionBus/IDrawingDoors.java
index 6ea94d9..d677a43 100644
--- a/AccordionBus/IDrawingDoors.java
+++ b/AccordionBus/IDrawingDoors.java
@@ -6,5 +6,7 @@ import java.awt.*;
public interface IDrawingDoors {
public void setNumDoors(int num);
+ public int getNumDoors();
+
public void DrawDoors(Graphics2D g2d, Color additionalColor, boolean isAdditionalBody, int _startPosX, int _startPosY);
}
diff --git a/AccordionBus/SetGeneric.java b/AccordionBus/SetGeneric.java
index 2d30a9c..53582dd 100644
--- a/AccordionBus/SetGeneric.java
+++ b/AccordionBus/SetGeneric.java
@@ -52,6 +52,11 @@ public class SetGeneric {
return true;
}
+ // Очистить список
+ public void Clear() {
+ _places.clear();
+ }
+
// Получение объекта из набора по позиции
public T Get(int position) {
// Проверка позиции