package javacodebook.collections.tree;

/**
 * Ein Beispiel für die Anwendung der Baumstruktur.
 */
public class TreeExample {

    public static void main(String[] args) {

        //Baum erzeugen und mit Katalogdaten füllen. Zuerst wird ein
        //Wurzelknoten erzeugt, an den dann beliebig viele Knoten angefügt
        //werden können.
        Node root = new Node("Kategorien");
        fillTree(root);
        printTree(root);
        //Suchen eines Objekts im Baum mit der Methode findNode(). Hier wird
        //auch der TreePath gezeigt, der über die Methode getPath() ausgelesen
        //werden kann.
        System.out.println();
        Node x = root.findNode(root, "TFT Monitor");
        System.out.println("Suche nach TFT Monitor liefert folgenden Knoten");
        x.printPath();

    }

    private static void fillTree(Node root) {
        //Produkt-Kategorie erzeugen und an den Wurzelknoten anfügen
        Node category = new Node("Hardware");
        root.addChild(category);
        //Produktgruppe erzeugen und an die Produktkategorie anfügen
        Node group = new Node("Mainboards");
        category.addChild(group);
        //Produkt erzeugen und an die Produktgruppe anfügen
        Node product = new Node("Sockel 2341 ABC");
        group.addChild(product);
        product = new Node("Sockel 33");
        group.addChild(product);
        product = new Node("Slot UX");
        group.addChild(product);
        group = new Node("Monitore");

        //Neue Kategorie erzeugen und ... s.o.
        category.addChild(group);
        product = new Node("17\" Monitor");
        group.addChild(product);
        product = new Node("19\" Monitor");
        group.addChild(product);
        product = new Node("TFT Monitor");
        group.addChild(product);
        category = new Node("Software");
        root.addChild(category);
        group = new Node("Betriebssysteme");
        category.addChild(group);
        product = new Node("Fenster 96");
        group.addChild(product);
        product = new Node("Fenster 99");
        group.addChild(product);
        product = new Node("Linux");
        group.addChild(product);
    }

    /** Ausgabe des Baums in einer Rekursion */
    private static void printTree(Node node) {
        //Für alle Kinder des aktuellen Knotens überprüfen, ob sie auch Kinder
        //haben, und für diese die Methode ebenfalls aufrufen
        Node[] children = node.getChildren();
        for(int i = 0; i < children.length; i++) {
            //Einrücken von Elemente je nach Level
            for(int j = 1; j < children[i].getLevel(); j++)
                System.out.print("  ");
            //Aktuellen Kindknoten ausgeben
            System.out.println(children[i].getNodeObject());
            //Kinder des aktuellen Kindknotens überprüfen
            if(children[i].getChildCount() > 0)
                printTree(children[i]);
        }
    }

}
