
import javax.media.j3d.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import java.awt.*;
import javax.vecmath.*;


/**
 *  Description of the Class
 *
 *@author     Jochen  en Thijs
 *@created    6 september 2000
 */
public class BGroup extends BranchGroup {

        /**
         *  De naam van deze branchgroup
         */

        public String name = new String();
        /**
         *  Het kleur van deze branchgroup
         */

        public Color color = new Color(0, 0, 0);


        /**
         *
         *
         *@param  name   Naam van de BGroup
         *@param  shape  De shape van de BGroup
         *@param  tg     De transformgroup van de BGroup
         *@throws        Nothing
         */
        public BGroup(String name, Shape3D shape, TransformGroup tg) {

                this.name = name;

                shape.setCapability(Shape3D.ALLOW_GEOMETRY_READ);
                shape.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE);
                shape.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);
                tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
                tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                tg.addChild(shape);

                // Maken van een MouseBehavior op elke Shape3D
                MouseRotate mouseRot = new MouseRotate();
                mouseRot.setTransformGroup(tg);
                mouseRot.setSchedulingBounds(new BoundingSphere());

                MouseTranslate mouseTra = new MouseTranslate();
                mouseTra.setTransformGroup(tg);
                mouseTra.setSchedulingBounds(new BoundingSphere());

                MouseZoom mouseZoom = new MouseZoom();
                mouseZoom.setTransformGroup(tg);
                mouseZoom.setSchedulingBounds(new BoundingSphere());

                this.addChild(mouseTra);
                this.addChild(mouseRot);
                this.addChild(mouseZoom);
                this.addChild(tg);
                this.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
                this.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
                this.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
                //this.setCapability(BranchGroup.ALLOW_CHILDREN_DETACH);

        }


        /**
         *
         *
         *@param  name  De naam van de BGroup
         *@param  bg    De branchgroup van de BGroup
         *@param  tg    De tranformgroup van de BGroup
         *@throws       Nothing
         */
        public BGroup(String name, BranchGroup bg, TransformGroup tg) {

                this.name = name;

                //Children van bg's capabilities veranderen
                setCap(bg);

                tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
                tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                tg.addChild(bg);

                // Maken van een MouseBehavior op iedere BranchGroup van de scene
                MouseRotate mouseRot = new MouseRotate();
                mouseRot.setTransformGroup(tg);
                mouseRot.setSchedulingBounds(new BoundingSphere());

                MouseTranslate mouseTra = new MouseTranslate();
                mouseTra.setTransformGroup(tg);
                mouseTra.setSchedulingBounds(new BoundingSphere());

                MouseZoom mouseZoom = new MouseZoom();
                mouseZoom.setTransformGroup(tg);
                mouseZoom.setSchedulingBounds(new BoundingSphere());

                this.addChild(mouseTra);
                this.addChild(mouseRot);
                this.addChild(mouseZoom);
                this.addChild(tg);

        }


        /**
         *
         *
         *@param  name       Description of Parameter
         *@param  primitive  Description of Parameter
         *@throws            Nothing
         */

        public BGroup(String name, Primitive primitive) {

                this.name = name;

                primitive.setCapability(primitive.ALLOW_CHILDREN_READ);
                primitive.setCapability(primitive.ALLOW_CHILDREN_WRITE);
                primitive.setCapability(primitive.ALLOW_CHILDREN_EXTEND);

                this.addChild(primitive);
                this.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
                this.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
                this.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
        }


        /**
         *  set de naam
         *
         *@param  name  De naam van de BGroup veranderen
         *@throws       Nothing
         */
        public void setName(String name) {
                this.name = name;
        }


        /**
         *  get naam
         *
         *@return    de naam
         *@throws    Nothing
         */
        public String getName() {
                if ((this.name == null) || (this.name == "")) {
                        return "unknown";
                }
                else {
                        return name;
                }
        }


        /**
         *  createWireFrameAppearence zet de tekening om in een wireframe
         *
         *@param  bg  De group die wireframe moet worden
         *@throws     Nothing
         */
        public void createWireFrameAppearance(javax.media.j3d.Group bg) {



                // Overlopen van de children van de group
                for (int i = 0; i < bg.numChildren(); i++) {

                        bg.setCapability(javax.media.j3d.Group.ALLOW_CHILDREN_READ);
                        bg.setCapability(javax.media.j3d.Group.ALLOW_CHILDREN_WRITE);
                        System.out.println("Group capabilities set");

                        bg.getChild(i).setCapability(javax.media.j3d.Group.ALLOW_CHILDREN_READ);
                        bg.getChild(i).setCapability(javax.media.j3d.Group.ALLOW_CHILDREN_WRITE);
                        System.out.println("child(" + i + "): " + bg.getChild(i).getClass().getName());

                        // Indien Shape3D -> Polygonen in de appearance aanzetten
                        if (bg.getChild(i).getClass().getName().equals("javax.media.j3d.Shape3D")) {
                                System.out.println("Child: " + bg.getChild(i));
                                Appearance materialAppear = new Appearance();
                                PolygonAttributes polyAttrib = new PolygonAttributes();
                                polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);
                                materialAppear.setPolygonAttributes(polyAttrib);
                                ColoringAttributes redColoring = new ColoringAttributes();
                                redColoring.setColor(1.0f, 0.0f, 0.0f);
                                materialAppear.setColoringAttributes(redColoring);
                                Node node = bg.getChild(i);
                                Shape3D shape = (Shape3D) node;
                                shape.setAppearance(materialAppear);
                        }
                        else
                        // Indien BranchGroup -> de child ervan iteratief terugkeren
                                        if (bg.getChild(i).getClass().getName().equals("javax.media.j3d.BranchGroup")) {
                                System.out.println("BranchGroup Found");

                                createWireFrameAppearance((Group) bg.getChild(i));
                        }
                        else {
                                System.out.println(bg.getChild(i).getClass().getName());
                        }

                        // Indien TransformGroup -> de child ervan iteratief terugkeren
                        if (bg.getChild(i).getClass().getName().trim().equals("javax.media.j3d.TransformGroup")) {
                                System.out.println("TransformGroup Found");
                                createWireFrameAppearance((Group) bg.getChild(i));

                        }
                        else {
                                // Anders niks doen
                                System.out.println("Niets anders gevonden");
                        }

                }
        }


        /**
         *  createSolid zet de tekening om in solid gevulde objecten
         *
         *@param  bg  De group die solid moet worden
         *@throws     Nothing
         */
         public void createSolid(javax.media.j3d.Group bg) {



                // Overlopen van de children van de group
                for (int i = 0; i < bg.numChildren(); i++) {

                        bg.setCapability(javax.media.j3d.Group.ALLOW_CHILDREN_READ);
                        bg.setCapability(javax.media.j3d.Group.ALLOW_CHILDREN_WRITE);
                        System.out.println("Group capabilities set");

                        bg.getChild(i).setCapability(javax.media.j3d.Group.ALLOW_CHILDREN_READ);
                        bg.getChild(i).setCapability(javax.media.j3d.Group.ALLOW_CHILDREN_WRITE);
                        System.out.println("child(" + i + "): " + bg.getChild(i).getClass().getName());

                        // Indien Shape3D -> Polygonen in de appearance aanzetten
                        if (bg.getChild(i).getClass().getName().equals("javax.media.j3d.Shape3D")) {
                                System.out.println("Child: " + bg.getChild(i));
                                Appearance materialAppear = new Appearance();
                                PolygonAttributes polyAttrib = new PolygonAttributes();
                                polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
                                materialAppear.setPolygonAttributes(polyAttrib);

                                Material material = new Material();
                                material.setDiffuseColor(new Color3f(1.0f, 0.0f, 0.0f));
                                materialAppear.setMaterial(material);
                                Node node = bg.getChild(i);
                                Shape3D shape = (Shape3D) node;
                                shape.setAppearance(materialAppear);
                        }
                        else
                        // Indien BranchGroup -> de child ervan iteratief terugkeren
                                        if (bg.getChild(i).getClass().getName().equals("javax.media.j3d.BranchGroup")) {
                                System.out.println("BranchGroup Found");

                                createSolid((Group) bg.getChild(i));
                        }
                        else {
                                System.out.println(bg.getChild(i).getClass().getName());
                        }

                        // Indien TransformGroup -> de child ervan iteratief terugkeren
                        if (bg.getChild(i).getClass().getName().trim().equals("javax.media.j3d.TransformGroup")) {
                                System.out.println("TransformGroup Found");
                                createSolid((Group) bg.getChild(i));

                        }
                        else {
                                // Anders niks doen
                                System.out.println("Niets anders gevonden");
                        }

                }
        }


        /**
        *  Zet de capabilities van de Shapes van de BGroup op true
        *  @param bg    De group die wordt doorgegeven door de BGroup
        *  @throws nothing
        *
        */
        private void setCap(Group bg){

                for(int i = 0 ; i < bg.numChildren();i++){
                String name = bg.getChild(i).getClass().getName();
                        System.out.println("------------------" + bg.getChild(i).getClass().getName() + "-------------------");
                        if (name.equals("javax.media.j3d.BranchGroup")) {
                                bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_READ);
                                bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_WRITE);
                                bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_EXTEND);
                                bg.getChild(i).setCapability(BranchGroup.ALLOW_DETACH);
                                setCap((Group)bg.getChild(i));
                        }
                        else {
                                if (name.equals("javax.media.j3d.TransformGroup")) {
                                bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_READ);
                                bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_WRITE);
                                bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_EXTEND);
                                bg.getChild(i).setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
                                bg.getChild(i).setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
                                setCap((Group)bg.getChild(i));
                                }
                                else {
                                        if (name.equals("javax.media.j3d.SharedGroup")) {
                                        bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_READ);
                                        bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_WRITE);
                                        bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_EXTEND);
                                        setCap((Group)bg.getChild(i));
                                        }
                                        else {
                                                if (name.equals("javax.media.j3d.OrderedGroup")) {
                                                bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_READ);
                                                bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_WRITE);
                                                bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_EXTEND);
                                                setCap((Group)bg.getChild(i));
                                                }
                                                else {
                                                        if (name.equals("javax.media.j3d.Switch")) {
                                                        bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_READ);
                                                        bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_WRITE);
                                                        bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_EXTEND);
                                                        setCap((Group)bg.getChild(i));
                                                        }
                                                        else {
                                                                if (name.equals("javax.media.j3d.Shape3D")) {
                                                                        bg.getChild(i).setCapability(javax.media.j3d.Shape3D.ALLOW_APPEARANCE_READ);
                                                                        bg.getChild(i).setCapability(javax.media.j3d.Shape3D.ALLOW_APPEARANCE_WRITE);
                                                                        bg.getChild(i).setCapability(javax.media.j3d.Shape3D.ALLOW_GEOMETRY_READ);
                                                                        bg.getChild(i).setCapability(javax.media.j3d.Shape3D.ALLOW_GEOMETRY_WRITE);
                                                                        bg.getChild(i).setCapability(javax.media.j3d.Shape3D.ALLOW_APPEARANCE_OVERRIDE_READ);
                                                                        bg.getChild(i).setCapability(javax.media.j3d.Shape3D.ALLOW_APPEARANCE_OVERRIDE_WRITE);
                                                                }
                                                                else {
                                                                 if (name.equals("BGroup")) {
                                                                 bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_READ);
                                                                 bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_WRITE);
                                                                 bg.getChild(i).setCapability(Group.ALLOW_CHILDREN_EXTEND);
                                                                 bg.getChild(i).setCapability(BranchGroup.ALLOW_DETACH);
                                                                 setCap((Group)bg.getChild(i));
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
}