package helpmaker.model;
import helpmaker.util.XMLTreeSave;
import javafx.collections.ObservableList;
import javafx.scene.control.TreeItem;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
import java.util.ArrayList;
public class HelpXMLTree {
private String fileName;
private TreeItem<XMLNodeItemExtended> rootItem;
public HelpXMLTree(String fileName) {
this.fileName = fileName;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //создали фабрику строителей, сложный и грамосткий процесс (по реже выполняйте это действие)
// dbf.setValidating(false); // не делать проверку валидации
try {
DocumentBuilder db = dbf.newDocumentBuilder(); // создали конкретного строителя документа
Document doc = db.parse(new File(this.fileName)); // строитель построил документ
rootItem = new TreeItem<>(new XMLNodeItemExtended(doc.getLocalName()));
rootItem.setExpanded(true);
parseCurrentNode(doc, rootItem);
if (rootItem.getChildren().size() > 0)
rootItem = rootItem.getChildren().get(0);
//Document - тоже является нодом, и импленментирует методы
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
} catch (SAXException sax) {
sax.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
public TreeItem getRootTreeItem() {
return rootItem;
}
private void parseCurrentNode(Node node, TreeItem<XMLNodeItemExtended> currXMLNode) {
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node childNode = list.item(i); // текущий нод
TreeItem<XMLNodeItemExtended> item = new TreeItem<>(
new XMLNodeItemExtended(childNode.getAttributes().getNamedItem(XMLParameter.PARAMETER_CAPTION).getNodeValue()));
item.setGraphic(getIcon(childNode.hasChildNodes()));
currXMLNode.getChildren().add(item);
item.getValue().setNodeName(childNode.getNodeName());
readParameters(childNode, item);
parseCurrentNode(childNode, item);
}
}
private void readParameters(Node XMLnode, TreeItem<XMLNodeItemExtended> treeNode) {
if (XMLnode instanceof Element){
Element e = (Element) XMLnode;
NamedNodeMap nodeMap = e.getAttributes();
for (int i = 0; i < nodeMap.getLength(); i++) {
Node currNode = nodeMap.item(i);
treeNode.getValue().addParameter(currNode.getNodeName(), currNode.getNodeValue());
}
}
}
public static javafx.scene.Node getIcon(boolean isDirectory) {
String iconName;
if (isDirectory)
iconName = "Folder.png";
else
iconName = "document.png";
return new ImageView(new Image("helpmaker/res/"+iconName));
}
public void saveTree() {
XMLTreeSave.saveTreeToFile(rootItem, "help_out.xml");
}
public boolean deleteItem(TreeItem<XMLNodeItemExtended> item) {
return delItem(rootItem, item);
}
private boolean delItem(TreeItem<XMLNodeItemExtended> tree, TreeItem<XMLNodeItemExtended> itemToDelete) {
if (tree.equals(itemToDelete)) {
tree.getParent().getChildren().remove(tree);
return true;
} else {
for (int i = 0; i < tree.getChildren().size(); i++) {
if (delItem(tree.getChildren().get(i), itemToDelete))
return true;
}
return false;
}
}
public static boolean isTreeItemHasChildWithCaption(TreeItem<XMLNodeItemExtended> item, String caption) {
for (int i = 0; i < item.getChildren().size(); i++) {
if (item.getChildren().get(i).getValue().getCaption().equals(caption))
return true;
}
return false;
}
public static boolean isTreeHasSameID(TreeItem<XMLNodeItemExtended> item, final String id) {
if (item.getValue().getParameterValueByKey(XMLParameter.PARAMETER_ID).equals(id))
return true;
for (int i = 0; i < item.getChildren().size(); i++) {
if (isTreeHasSameID(item.getChildren().get(i), id))
return true;
}
return false;
}
}