package lectures.composite.visitors;
import util.annotations.WebDocuments;

import java.awt.Component;
import java.awt.Container;
import java.lang.reflect.Method;

import javax.swing.JFrame;

import lectures.composite.tree_dag_graph_objects_windows.WindowTreeCreator;

@WebDocuments({"Lectures/CompositeVisitors.pptx", "Lectures/CompositeVisitors.pdf", "Videos/CompositeVisitors.avi"})
public class ReflectingSwingComponentTreeMorpher extends
        SwingComponentTreeMorpher {
    public static void main(String[] args) {
        JFrame aFrame = WindowTreeCreator.createTree();
        Container root = aFrame.getContentPane();
        try {
            Method colorMethod = SwingComponentTreeMorpher.class.
                getDeclaredMethod("color", new Class[]{Component.class});
            traverseInOrder(root, colorMethod, SwingComponentTreeMorpher.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void traverseInOrder(Component aComponent, 
            Method aVisitorMethod, Object aVisitorMethodTarget) {
        try {
            aVisitorMethod.invoke(aVisitorMethodTarget, new Component[] {aComponent});          
        } catch (Exception e) {
            e.printStackTrace();
        }           
        if (!(aComponent instanceof Container))
            return;
        Container aContainer = (Container) aComponent;
        Component[] components = aContainer.getComponents();
        for (int i = 0; i < components.length; i++) {
            traverseInOrder(components[i], aVisitorMethod, aVisitorMethodTarget);
        }
    }
}