home *** CD-ROM | disk | FTP | other *** search
/ Java for 3D & VRML Worlds / Java for 3d and VRML Worlds.iso / examples / chap05 / DirBrowser.java < prev    next >
Encoding:
Java Source  |  1996-11-25  |  9.4 KB  |  245 lines

  1. // DirBrowser.java
  2. // simple 3D directory browser
  3. import vrml.*;
  4. import vrml.node.*;
  5. import vrml.field.*;
  6.  
  7. import java.io.*;
  8.  
  9. public class DirBrowser extends Script {
  10.    private Browser b;                     // to display error message
  11.    private File dir;
  12.    private SFString dirname;
  13.    private MFNode addChildren = null;     // to add sub directory/files
  14.    private SFInt32 whichChoice = null;     // to show/hide sub direcotry
  15.  
  16.    public final static int NOTOPENED = 0;
  17.    public final static int OPENED = 1;
  18.    public final static int HIDE = 2;
  19.    private int opened = NOTOPENED;
  20.    static int r = 0;
  21.    public final static float FILESIZE = 1000.0f; // 1K byte
  22.  
  23.    final String HEADER =  "#VRML V2.0 utf8\n";
  24.    final String ROOT1R =  "Transform { \n" +
  25.                           "   children [ \n" +
  26.                           "      Transform { translation 0 0 5 \n" +
  27.                           "         children [ \n" +
  28.                           "            Shape { \n " +
  29.                           "              appearance DEF MAT Appearance{ \n" + 
  30.                           "                  material Material{ \n" +
  31.                           "                     diffuseColor 0 0 1 \n" +
  32.                           "                     emissiveColor 0 0 1 \n" + 
  33.                           "                     transparency  0.5 \n" +
  34.                           "                  } \n" +
  35.                           "               } \n" +
  36.                           "               geometry Box { size 0.2 0.2 10.0 }}] \n" +
  37.                           "      } \n" +
  38.                           "      Transform { \n" +
  39.                           "          rotation 1 0 0 1.57 \n" +
  40.                           "          children [ \n " +
  41.                           "             Shape { \n " +
  42.                           "                appearance USE MAT \n" +
  43.                           "                geometry Cylinder { radius ";
  44.    final String ROOT2E =                                                       " height 0.01 } }\n" +
  45.                           "          ] \n" +
  46.                           "      }\n";
  47.  
  48.    final String TAILER1R = "  ]\n";
  49.    final String TAILER2E = "}\n";
  50.  
  51.    final String ROUTING1T = "ROUTE ";
  52.    final String ROUTING2S =           ".isActive TO ";
  53.    final String ROUTING3E =                           ".clicked \n";
  54.   
  55.    final String DIROBJ1XY = "Transform { \n translation "; 
  56.    final String DIROBJ2U =                                   " 0 \n" +
  57.                            "   children [ \n" +
  58.                            "      Transform { \n" +
  59.                            "         children [ \n" +
  60.                            "            Anchor { \n" +
  61.                            "              url \"";
  62.    final String DIROBJ3T =                          "\" \n" +                   
  63.                            "               children [ \n" +
  64.                            "                  DEF ";
  65.    final String DIROBJ4S =                      " TouchSensor {} \n" + 
  66.                            "                  Shape { geometry Sphere {}} \n" +
  67.                            "               ] \n" +
  68.                            "            } \n" +
  69.                            "         ] \n" +
  70.                            "      } \n" +
  71.                            "      DEF SW Switch {\n" +
  72.                            "         whichChoice 0 \n" +
  73.                            "         choice [\n" +
  74.                            "            DEF DIR Transform {  translation 0 0 -10 } \n" +
  75.                            "         ] \n" +
  76.                            "      } \n" +
  77.                            "   ] \n" +
  78.                            "} \n" +
  79.                            "DEF ";
  80.    final String DIROBJ5F =          " Script { \n" + 
  81.                            "   url \"DirBrowser.class\" \n" +
  82.                            "   eventIn SFBool    clicked \n" +
  83.                            "   field SFNode dirnode USE DIR \n" +
  84.                            "   field SFNode swnode USE SW \n" +
  85.                            "   field SFString dirname \"";
  86.    final String DIROBJ6E =                                     "\" \n" + 
  87.                            "} \n";
  88.  
  89.    final String FILEOBJ1XYZ = "Transform { \n" +
  90.                               "   translation ";
  91.    final String FILEOBJ2U =   "   children [ \n" +
  92.                               "      Anchor { \n" +
  93.                               "         url \"";
  94.    final String FILEOBJ3H =                    "\"" +
  95.                               "         children [ \n" +
  96.                               "            Shape { \n" + 
  97.                               "               appearance Appearance { \n" +
  98.                               "                  material Material { \n" +
  99.                               "                     diffuseColor 1 1 0 \n" +
  100.                               "                  } \n" +
  101.                               "               } \n" +
  102.                               "               geometry Box { size 2.0 2.0 ";
  103.    final String FILEOBJ4E =                                                   "}\n" +
  104.                              "            } \n" +
  105.                              "         ] \n" +
  106.                              "      } \n" +
  107.                              "   ] \n" +
  108.                              "}\n";
  109.   
  110.    public void initialize() {
  111.       Node tmpnode;
  112.  
  113.       b = getBrowser();
  114.  
  115.       dirname = (SFString) getField("dirname");
  116.  
  117.       // to add sub directory/files
  118.       tmpnode = (Node)((SFNode)getField("dirnode")).getValue();
  119.       addChildren = (MFNode)tmpnode.getEventIn("addChildren");
  120.  
  121.       // to show/hide sub direcotry
  122.       tmpnode = (Node)((SFNode)getField("swnode")).getValue();
  123.       whichChoice = (SFInt32)tmpnode.getExposedField("whichChoice");
  124.    }
  125.   
  126.    public void processEvent(Event ev){
  127.       if(ev.getName().equals("clicked")){
  128.          ConstSFBool v = (ConstSFBool)ev.getValue();
  129.          
  130.          if(false == v.getValue()){
  131.             if(NOTOPENED == opened){
  132.                openDirectory(dirname.getValue());
  133.                opened = OPENED;
  134.             } else if(OPENED == opened){
  135.                whichChoice.setValue(-1);
  136.                opened = HIDE;
  137.             } else if (HIDE == opened) {
  138.                whichChoice.setValue(0);
  139.                opened = OPENED;
  140.             }
  141.          }
  142.       }
  143.    }
  144.  
  145.    public void openDirectory(String directory){
  146.       String[] files;
  147.       int numfiles;
  148.       float angle;
  149.       float radius;
  150.  
  151.       try {
  152.          dir = new File(directory);
  153.       }catch (Exception e){
  154.          b.setDescription("Can not open " + directory);
  155.          e.printStackTrace();
  156.          return;
  157.       }
  158.  
  159.       if(false == dir.isDirectory()){
  160.          b.setDescription("No such a directory: " + directory);
  161.          return;
  162.       }
  163.  
  164.       files = dir.list();
  165.       numfiles = files.length;
  166.  
  167.       if(0 == numfiles) return;
  168.  
  169.       if(2 < numfiles) {
  170.          angle = (float)(Math.PI * 2/numfiles);
  171.          radius = (float)(6.0/(2.0 * Math.sin(angle)));
  172.       } else if(2 == numfiles) {
  173.          angle = (float) Math.PI;
  174.          radius = 2.0f;
  175.       } else {
  176.         // if there is one file or directory ...
  177.         angle = 0.0f;
  178.         radius = 0.1f;
  179.       }
  180.     
  181.       String vrmldir = HEADER + ROOT1R + radius + ROOT2E;
  182.       String routing = "";
  183.     
  184.       for(int i = 0; i < numfiles; i++){
  185.          File f = null;
  186.          String filename = null;
  187.          float x, y;
  188.  
  189.          if(0.0f != angle){
  190.             x = (float)(radius * Math.sin(angle * i));
  191.             y = (float)(radius * Math.cos(angle * i));
  192.          } else {
  193.             x = y = 0.0f;
  194.          }
  195.       
  196.          try {
  197.             filename = directory + "/" + files[i];
  198.             f = new File(filename);
  199.         
  200.             if(f.isDirectory()){
  201.                String touchsenor = "TS" + r;
  202.                String script = "SC" + r; r++;
  203.  
  204.                vrmldir = vrmldir + DIROBJ1XY + x + " " + y +
  205.                                    DIROBJ2U + filename +
  206.                                    DIROBJ3T + touchsenor + 
  207.                                    DIROBJ4S + script + 
  208.                                    DIROBJ5F + filename +
  209.                                    DIROBJ6E;
  210.  
  211.                routing += ROUTING1T + touchsenor +
  212.                           ROUTING2S + script +
  213.                           ROUTING3E;
  214.            } else {
  215.               float height = (float)(f.length()/FILESIZE);
  216.           
  217.               if(height < 0.000001f) height = 0.1f;
  218.  
  219.               vrmldir += FILEOBJ1XYZ + x + " " + y + " " + (-(height/2.0)) + "\n" +
  220.                          FILEOBJ2U + filename +
  221.                          FILEOBJ3H + (height) + 
  222.                          FILEOBJ4E;
  223.             }
  224.          } catch (Exception e) {
  225.             b.setDescription("Can not open " + filename);
  226.             e.printStackTrace();
  227.             return;
  228.          }
  229.       }
  230.       vrmldir = vrmldir + TAILER1R + routing + TAILER2E;
  231.       // System.out.println(vrmldir);
  232.  
  233.       // create VRML objects and add them to the scene
  234.       try {
  235.          BaseNode nodes[] = b.createVrmlFromString(vrmldir);
  236.          if(null != nodes) {
  237.             addChildren.setValue(nodes);
  238.          }
  239.       } catch (Exception e) {
  240.          b.setDescription("can not create VRML node");
  241.          e.printStackTrace() ;
  242.       }
  243.    }
  244. }
  245.