From b6c61cc958adee27b9ccf06a5173ed2b50a2ee4c Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 17 Sep 2024 20:11:12 +0700 Subject: [PATCH] save functiton completed, unnecessary comments in Project removed --- res/objecttypes - Copy.xml | 42 ++++----- res/success.png | Bin 0 -> 35378 bytes src/events/EntityDrawboxChangedEvent.java | 13 ++- src/events/EntityDrawboxChangedListener.java | 2 +- src/gui/DrawboxEditor.java | 4 +- src/gui/MainGUI.java | 2 +- src/model/Drawbox.java | 6 +- src/model/Entity.java | 4 +- src/model/Hitbox.java | 4 +- src/repository/Project.java | 85 +++++++++++++------ 10 files changed, 106 insertions(+), 56 deletions(-) create mode 100644 res/success.png diff --git a/res/objecttypes - Copy.xml b/res/objecttypes - Copy.xml index 93b9ada..c2554d3 100644 --- a/res/objecttypes - Copy.xml +++ b/res/objecttypes - Copy.xml @@ -1,23 +1,23 @@ - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/res/success.png b/res/success.png new file mode 100644 index 0000000000000000000000000000000000000000..f6505c075a10895c6b3646f678e1ec5040b31fdf GIT binary patch literal 35378 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 literal 0 HcmV?d00001 diff --git a/src/events/EntityDrawboxChangedEvent.java b/src/events/EntityDrawboxChangedEvent.java index 38da3d9..0ab8d7c 100644 --- a/src/events/EntityDrawboxChangedEvent.java +++ b/src/events/EntityDrawboxChangedEvent.java @@ -1,11 +1,18 @@ package events; import model.Drawbox; +import model.Entity; +/* + * Structure-like class no getters + * */ public class EntityDrawboxChangedEvent { - Drawbox drawbox; - public EntityDrawboxChangedEvent(Drawbox drawbox) { - // TODO Auto-generated constructor stub + public Drawbox drawbox; + //storing entity object instead of just entity name will allow to get entity data without extra calls + public Entity owner; + + public EntityDrawboxChangedEvent(Drawbox drawbox, Entity owner) { this.drawbox = drawbox; + this.owner = owner; } } diff --git a/src/events/EntityDrawboxChangedListener.java b/src/events/EntityDrawboxChangedListener.java index 5e6b90b..5440118 100644 --- a/src/events/EntityDrawboxChangedListener.java +++ b/src/events/EntityDrawboxChangedListener.java @@ -2,6 +2,6 @@ package events; public interface EntityDrawboxChangedListener { - void getEvent(EntityDrawboxChangedEvent event); + void drawboxChanged(EntityDrawboxChangedEvent event); } diff --git a/src/gui/DrawboxEditor.java b/src/gui/DrawboxEditor.java index b39ab46..ba85cf3 100644 --- a/src/gui/DrawboxEditor.java +++ b/src/gui/DrawboxEditor.java @@ -144,7 +144,9 @@ public class DrawboxEditor extends Editable { private void notifySubscribers() { for (EntityDrawboxChangedListener listener : listeners) { - listener.getEvent(new EntityDrawboxChangedEvent(entity.getDrawbox())); + listener.drawboxChanged( + new EntityDrawboxChangedEvent(entity.getDrawbox(), entity) + ); } } diff --git a/src/gui/MainGUI.java b/src/gui/MainGUI.java index b71aedb..63a6288 100644 --- a/src/gui/MainGUI.java +++ b/src/gui/MainGUI.java @@ -68,7 +68,7 @@ public class MainGUI extends JFrame{ OpenXMLFileButtonListener = new OpenXMLFileButtonListener(list); openXMLJButton = createButton("XML",5,5, OpenXMLFileButtonListener,"res/xml.png"); - saveXMLJButton = createButton("Save",80,5,(e)-> Project.getInstance().printXMlToConsole(),"res/download.png"); + saveXMLJButton = createButton("Save",80,5,(e)-> Project.getInstance().writeXML(),"res/download.png"); clearLinesJButton = createButton("Clear lines",155,5,null,"res/destroy.png"); clearLinesJButton.addActionListener(drawBoxPanel); diff --git a/src/model/Drawbox.java b/src/model/Drawbox.java index 3fd6474..b02235b 100644 --- a/src/model/Drawbox.java +++ b/src/model/Drawbox.java @@ -49,7 +49,7 @@ public class Drawbox { public String toString() { String stringDrawbox=""; for (Point point : drawboxlistPoints) { - stringDrawbox+=point.x+" "+point.y+" "; + stringDrawbox+=((int)point.x)+" "+((int)point.y)+" "; //(int) because it is for XML } return stringDrawbox; } @@ -61,7 +61,9 @@ public class Drawbox { public List getbaseListPoints() { return baseListPoints; } - public void Print() { + + //not the same as toString()! the latter is for XML while printToConsole() is for console + public void printToConsole() { System.out.println("|||Drawbox:"); if(baseListPoints!=null&&drawboxlistPoints!=null) { System.out.println("drawboxlistPoints:"); diff --git a/src/model/Entity.java b/src/model/Entity.java index c7fbb0a..82786ec 100644 --- a/src/model/Entity.java +++ b/src/model/Entity.java @@ -53,8 +53,8 @@ public class Entity { public void PrintEntity() { System.out.println("---------------------"); System.out.println("Name: "+thisName); - this.thisDrawbox.Print(); - this.thisHitbox.Print(); + this.thisDrawbox.printToConsole(); + this.thisHitbox.printToConsole(); System.out.println("---------------------"); } } diff --git a/src/model/Hitbox.java b/src/model/Hitbox.java index 0beebc3..de3aa36 100644 --- a/src/model/Hitbox.java +++ b/src/model/Hitbox.java @@ -65,7 +65,9 @@ public class Hitbox { public List getListPoints() { return listPoints; } - public void Print() { + + //not the same as toString()! the latter is for XML while printToConsole() is for console + public void printToConsole() { System.out.println(); System.out.println("|||Hitbox:"); if(shape!=null&&listPoints!=null) { diff --git a/src/repository/Project.java b/src/repository/Project.java index 76127fb..3223def 100644 --- a/src/repository/Project.java +++ b/src/repository/Project.java @@ -11,6 +11,8 @@ import java.util.List; import java.util.logging.Logger; import javax.imageio.ImageIO; +import javax.swing.ImageIcon; +import javax.swing.JOptionPane; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -46,23 +48,19 @@ public class Project implements Iterable, EntityDrawboxChangedListener { * Просто заглушка, обычно заменяется актуальным путём в ходе изменения программы.
* Cм. {@link #setXMLPath(String)} и {@link #getXMLPath()} * */ - public static final String DEFAULT_XML_PATH = "res/"; + public static final String DEFAULT_XML_PATH = "res/"; //TODO: make an actual path to example objecttypes in the root of the project public static final String DEFAULT_XML_FILENAME = "objecttypes.xml"; static Project thisProject; private List listEntity = new ArrayList(); private String path = DEFAULT_XML_PATH; private String fileName = DEFAULT_XML_FILENAME; - // Получение фабрики, чтобы после получить билдер документов. private DocumentBuilderFactory factory; - // Получили из фабрики билдер, который парсит XML, создает структуру Document в виде иерархического дерева. private DocumentBuilder builder; - // Запарсили XML, создав структуру Document. Теперь у нас есть доступ ко всем элементам, каким нам нужно. private Document document; private static Logger logger = Logger.getLogger("repository.Project"); - //!!!РЕАЛИЗАЦИЯ СИНГЛИТОНА!НАЧАЛО!!! private Project(){}; public static Project getInstance() { @@ -71,7 +69,6 @@ public class Project implements Iterable, EntityDrawboxChangedListener { } return thisProject; }; - //!!!РЕАЛИЗАЦИЯ СИНГЛИТОНА!ОКОНЧАНИЕ!!! /** * Устанавливает значение пути к XML. Все операции загрузки и сохранения будут работать с этой директорией.
@@ -80,12 +77,14 @@ public class Project implements Iterable, EntityDrawboxChangedListener { *
например: "C:/User/map/" или "/home/username/map/" или "res/map" (относительный путь рассчитывается от корня проекта) * */ public void setXMLPath(String newPath) { - path = newPath; + if(newPath != null && !newPath.isEmpty()) { + path = newPath.trim(); + } else System.err.println("Trying to submit empty path! Project.setXMLPath()"); } /** * Возвращает актуальный путь к директории, в которой лежит XML-файл с типами объектов, а так же папки с ресурсами.
- * ps. считается, что ресурсы находятся в той же папке что XML-файл + * Считается, что ресурсы находятся в той же папке что XML-файл. Должен включать / в конце * */ public String getXMLPath() { return path; @@ -108,12 +107,12 @@ public class Project implements Iterable, EntityDrawboxChangedListener { } /** - * Перегрузка {@link #load()}.
* Использует {@link #setXMLFileName(String)} и {@link #setXMLPath(String)} для того, чтобы сохранить новый путь к XML-файлу и его имя. * Повторно вызывать их вручную не обязательно. * * @param directory - папка где хранится XML-файл и ресурсы (см. {@link #getXMLPath()}) * @param name - имя XML-файла с определениями типов сущностей + * @see #load() * */ public void load(String directory, String name) { setXMLPath(directory); @@ -138,13 +137,10 @@ public class Project implements Iterable, EntityDrawboxChangedListener { // Получение списка всех элементов objecttype внутри корневого элемента (getDocumentElement возвращает ROOT элемент XML файла). NodeList objecttypeElements = document.getDocumentElement().getElementsByTagName("objecttype"); for(int i = 0; i < objecttypeElements.getLength(); i++) { - //System.out.println("---------------------"); Node objecttype = objecttypeElements.item(i); NamedNodeMap attributesObject = objecttype.getAttributes(); String entityName = new String(attributesObject.getNamedItem("name").getNodeValue()); - //System.out.println("Name: "+entityName); parsingElementXMLtoElementList(entityName,objecttype); - //System.out.println("---------------------"); } } @@ -247,7 +243,7 @@ public class Project implements Iterable, EntityDrawboxChangedListener { //printXMlToConsole(); //DEBUG! } - /* + /** * Удаляется обьект из списка всех сущностей, и из xml-дерева */ public void removeEntity(Entity e) { @@ -280,7 +276,9 @@ public class Project implements Iterable, EntityDrawboxChangedListener { } - private void writeXML() { + public void writeXML() { + stripEmptyElements(document); + try { TransformerFactory transformerFactory = TransformerFactory.newInstance(); transformerFactory.setAttribute("indent-number", 4); @@ -289,10 +287,11 @@ public class Project implements Iterable, EntityDrawboxChangedListener { transformer.setOutputProperty(OutputKeys.INDENT, "yes"); DOMSource source = new DOMSource(document); - StreamResult result = new StreamResult(new FileOutputStream(path)); + StreamResult result = new StreamResult(new FileOutputStream(getXMLPath() + getXMLFileName())); transformer.transform(source, result); + JOptionPane.showMessageDialog(null, "Бугага, сохранилось!", "Success", JOptionPane.INFORMATION_MESSAGE); } catch (TransformerException | FileNotFoundException e) { - System.err.println("Saving project is unsuccsessfull! Erorr is: "+e); + JOptionPane.showMessageDialog(null, "Saving project is unsuccsessfull! Erorr is: "+e, "Project save unsuccsesfull", JOptionPane.ERROR_MESSAGE); } } @@ -304,6 +303,8 @@ public class Project implements Iterable, EntityDrawboxChangedListener { public void printXMlToConsole() { + stripEmptyElements(document); + try { TransformerFactory transformerFactory = TransformerFactory.newInstance(); transformerFactory.setAttribute("indent-number", 4); @@ -333,15 +334,51 @@ public class Project implements Iterable, EntityDrawboxChangedListener { public List getListEntity() { return listEntity; } -/* - * Получение события при отрисовке нового Drawbox, для изменения XML-дерева. - * Объект event хранит в себе ссылку на новый объект drawbox и объект entity, для которой он был создан. - * Необходимо из Entity получить имя сущности и в XML-дереве изменить данные drawbox-а, используя функцию toString. - * */ + /** + * Получение события при отрисовке нового Drawbox, для изменения XML-дерева. + * Объект event хранит в себе ссылку на новый объект drawbox и объект entity, для которой он был создан. + * */ @Override - public void getEvent(EntityDrawboxChangedEvent event) { - // TODO Auto-generated method stub - + public void drawboxChanged(EntityDrawboxChangedEvent event) { + String entityName = event.owner.getName(); + Node entityToUpdate = getEntityXMLNodeByName(entityName); + NodeList properties = entityToUpdate.getChildNodes(); + for(int i = 0; i < properties.getLength(); i++) { + if(properties.item(i) instanceof Element) { // ignoring #text nodes + //we have hitbox, drawbox and class, gotta set the right one + Element propertyElement = ((Element)properties.item(i)); + if (propertyElement.getAttribute("name").equals("drawbox")) { + propertyElement.setAttribute("default", event.owner.getDrawbox().toString()); + } + } + } + } + + private Node getEntityXMLNodeByName(String name) { //returns entitie's objecttype node + NodeList nl = document.getElementsByTagName("objecttype"); + for(int i = 0; i < nl.getLength(); i++) { + Node objecttype = nl.item(i); + if(objecttype.getAttributes().getNamedItem("name").getNodeValue().equals(name)) { + return objecttype; + } + } + return null; + } + + //https://stackoverflow.com/a/64659614/6929164 + public static void stripEmptyElements(Node node) + { + NodeList children = node.getChildNodes(); + for(int i = 0; i < children.getLength(); ++i) { + Node child = children.item(i); + if(child.getNodeType() == Node.TEXT_NODE) { + if (child.getTextContent().trim().length() == 0) { + child.getParentNode().removeChild(child); + i--; + } + } + stripEmptyElements(child); + } } } //в момент окончания рисования, в зависимости в какой мы рисуем вкладке хитбокса,