From 9079880942d022ee32fd3a543843e132e52deb1a Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sun, 30 Jun 2019 23:52:19 -0400
Subject: [PATCH] Tree icons.

---
 ObjEditor.java        |   30 +
 /dev/null             |  352 --------------------
 CameraPane.java       |  128 -------
 cTreeModel.java       |  127 +++---
 GroupEditor.java      |    3 
 cFileSystemModel.java |  112 ++++-
 cTools.java           |  214 ++++++++++++
 7 files changed, 381 insertions(+), 585 deletions(-)

diff --git a/CameraPane.java b/CameraPane.java
index cdf2ce1..e8d7b60 100644
--- a/CameraPane.java
+++ b/CameraPane.java
@@ -2398,128 +2398,6 @@
         return currentGL;
     }
 
-    private void GetRemoteZip(String url, String name, boolean unzip, boolean save)
-    {
-        java.net.URL u;
-        InputStream is = null;
-        DataInputStream dis;
-        java.util.zip.ZipInputStream zis;
-        //String s;
-
-                System.out.println("GetRemoteZip " + name);
-                
-          int total = 0; // dis.available();
-
-          byte[] bytes = new byte[16384];
-          
-        try
-        {
-          u = new java.net.URL(url + name);
-          is = u.openStream();
-          
-                System.out.println(url + name);
-                
-          if (unzip)
-          {
-              //dis = new DataInputStream(new BufferedInputStream(is));
-              zis = new java.util.zip.ZipInputStream(new BufferedInputStream(is));
-              //while ((s = dis.readLine()) != null)
-
-                if (save)
-              new java.io.File(name).mkdirs();
-          
-    //      FileOutputStream stream = new FileOutputStream("test.zip");
-    //
-    //      int count;
-    //      
-    //      while ((count = dis.read(bytes)) != -1)
-    //      {
-    //        //System.out.println(s);
-    //        System.out.println(count);
-    //          total += count;
-    //          stream.write(bytes);
-    //      }
-    //      
-    //      stream.close();
-          
-           // now iterate through each item in the stream. The get next
-            // entry call will return a ZipEntry for each file in the
-            // stream
-            java.util.zip.ZipEntry entry;
-            while((entry = zis.getNextEntry())!=null)
-            {
-                if (entry.getName().endsWith(".gsm"))
-                {
-                    continue;
-                }
-                
-                String s = String.format("Entry: %s len %d added %TD",
-                                entry.getName(), entry.getSize(),
-                                new java.util.Date(entry.getTime()));
-                System.out.println(s);
-
-                if (save)
-                {
-                    // Once we get the entry from the stream, the stream is
-                    // positioned read to read the raw data, and we keep
-                    // reading until read returns 0 or less.
-                    String outpath = name + "/" + entry.getName();
-                    FileOutputStream output = null;
-                    try
-                    {
-                        output = new FileOutputStream(outpath);
-                        int len = 0;
-                        while ((len = zis.read(bytes)) > 0)
-                        {
-                            output.write(bytes, 0, len);
-                        }
-                    }
-                    finally
-                    {
-                        // we must always close the output file
-                        if(output!=null) output.close();
-                    }
-                }
-            }
-          }
-        }
-        catch (java.net.MalformedURLException mue)
-        {
-          System.err.println("Ouch - a MalformedURLException happened.");
-          mue.printStackTrace();
-          //System.exit(2);
-        }
-        catch (IOException ioe)
-        {
-          //System.err.println("Oops - an IOException happened.");
-          //ioe.printStackTrace();
-          //System.exit(3);
-        }
-        finally
-        {
-          try
-          {
-              if (is != null)
-                    is.close();
-          }
-          catch (IOException ioe)
-          {
-          }
-        }
-                    
-        //  System.out.println("length = " + total);
-          
-//                try
-//                {
-//                    Runtime.getRuntime().exec("/usr/local/bin/wget https://archive3d.net/?a=download&do=get&id=7caca905");
-//                }
-//                catch (Exception e)
-//                {
-//                    e.printStackTrace();
-//                }
-                
-    }
-
     /**/
     class CacheTexture
     {
@@ -15295,12 +15173,6 @@
                 break;
             case '+':
                 
-        //for (int i=0; i<0x7FFFFFFF; i++)
-        {
-            //String.format("%08X", i); //  "7caca905"
-            GetRemoteZip("https://archive3d.net/?a=download&do=get&id=", "7caca905", true, true);
-        }
-      
                 /*
                 //fontsize += 1;
                 bbzoom *= 2;
diff --git a/GroupEditor.java b/GroupEditor.java
index 776ef38..847a6e0 100644
--- a/GroupEditor.java
+++ b/GroupEditor.java
@@ -1472,6 +1472,9 @@
 		animationItem.addItemListener(this);
                 animationItem.setState(Globals.ANIMATION);
                 
+		menu.add(archiveItem = new CheckboxMenuItem("Archive3D..."));
+		archiveItem.addItemListener(this);
+                
 		menu.add("-");
 		parseverticesItem = menu.add(new MenuItem("Multiplicity"));
 		parseverticesItem.addActionListener(this);
diff --git a/ObjEditor.java b/ObjEditor.java
index b938e7a..1779397 100644
--- a/ObjEditor.java
+++ b/ObjEditor.java
@@ -350,7 +350,7 @@
         frame.setMenuBar(menuBar = new MenuBar());
         menuBar.add(fileMenu = new Menu("File"));
         fileMenu.add(newItem = new MenuItem("New"));
-        fileMenu.add(loadItem = new MenuItem("Open..."));
+        fileMenu.add(openItem = new MenuItem("Open..."));
         
                 //oe.menuBar.add(menu = new Menu("Include"));
         Menu menu = new Menu("Import");
@@ -382,7 +382,7 @@
         }
 
         newItem.addActionListener(this);
-        loadItem.addActionListener(this);
+        openItem.addActionListener(this);
         saveItem.addActionListener(this);
         saveAsItem.addActionListener(this);
         exportAsItem.addActionListener(this);
@@ -780,7 +780,7 @@
 // X                   frame.getContentPane().remove(/*"Center",*/bigThree);
 // X                   framePanel.add(bigThree);
 // X                   frame.getContentPane().add(/*"Center",*/framePanel);
-                    framePanel.setDividerLocation(1);
+                    framePanel.setDividerLocation(46);
                     
                     //frame.setVisible(true);
                     radio.layout = keepButton;
@@ -1493,7 +1493,10 @@
 //        north.add(ctrlPanel, BorderLayout.NORTH);
 //        objectPanel.add(north);
         objectPanel.add(editPanel);
-        objectPanel.add(infoPanel);
+        
+        if (Globals.ADVANCED)
+            objectPanel.add(infoPanel);
+        
         objectPanel.add(toolboxPanel);
 
         /*
@@ -1602,9 +1605,9 @@
 //		aConstraints.gridheight = 1;
 
         framePanel = new JSplitPane(JSplitPane.VERTICAL_SPLIT, toolbarPanel, bigThree);
-        framePanel.setContinuousLayout(true);
-        framePanel.setOneTouchExpandable(true);
-        framePanel.setDividerLocation(0.8);
+        framePanel.setContinuousLayout(false);
+        framePanel.setOneTouchExpandable(false);
+        //.setDividerLocation(0.8);
         //framePanel.setDividerSize(15);
         //framePanel.setResizeWeight(0.15);
         framePanel.setName("Frame");
@@ -3198,6 +3201,10 @@
         {
             ToggleAnimation();
             return;
+        } else if (event.getSource() == archiveItem)
+        {
+            cTools.Archive(frame);
+            return;
         } else if (event.getSource() == flipVCB)
         {
             copy.flipV ^= true;
@@ -3391,9 +3398,9 @@
         {
             Close();
             //return true;
-        } else if (source == loadItem)
+        } else if (source == openItem)
         {
-            load();
+            Open();
             //return true;
         } else if (source == newItem)
         {
@@ -4720,7 +4727,7 @@
         }
     }
 
-    void load() // throws ClassNotFoundException
+    void Open() // throws ClassNotFoundException
     {
         if (Grafreed.standAlone)
         {
@@ -5005,7 +5012,7 @@
     MenuBar menuBar;
     Menu fileMenu;
     MenuItem newItem;
-    MenuItem loadItem;
+    MenuItem openItem;
     MenuItem saveItem;
     MenuItem saveAsItem;
     MenuItem exportAsItem;
@@ -5028,6 +5035,7 @@
     CheckboxMenuItem toggleSwitchItem;
     CheckboxMenuItem toggleRootItem;
     CheckboxMenuItem animationItem;
+    CheckboxMenuItem archiveItem;
     CheckboxMenuItem toggleHandleItem;
     CheckboxMenuItem togglePaintItem;
     JSplitPane mainPanel;
diff --git a/cFileSystemModel.java b/cFileSystemModel.java
index 1748e2b..631ad57 100644
--- a/cFileSystemModel.java
+++ b/cFileSystemModel.java
@@ -1,10 +1,12 @@
 
 import java.io.*;
+import javax.swing.Icon;
 import javax.swing.event.*;
 import javax.swing.tree.*;
 
 class cFileSystemModel implements TreeModel
 {
+
     File root;
     cFilter filter;
 
@@ -23,88 +25,136 @@
     {
     }
 
-    public Object getChild(Object parent, int index) 
+    public Object getChild(Object parent, int index)
     {
         //new Exception().printStackTrace();
-        
+
         //System.out.println("child[" + index + "] = " + ((File) parent).listFiles(filter)[index]);
-        
+
         File[] files = table.get(parent);
-        assert(files != null);
+        assert (files != null);
         //return ((File) parent).listFiles(filter)[index];
         return files[index];
-        
-    }
 
+    }
     java.util.Hashtable<File, File[]> table = new java.util.Hashtable<File, File[]>();
-    
-    public int getChildCount(Object parent) 
+
+    public int getChildCount(Object parent)
     {
-        if( isLeaf(parent) )
+        if (isLeaf(parent))
+        {
             return 0;
-        else
+        } else
         {
             //System.out.println(parent + " childcount = " + ((File) parent).listFiles(filter).length);
             File[] files = table.get(parent);
-            
-            if(files == null)
+
+            if (files == null)
             {
                 files = ((File) parent).listFiles(filter);
                 table.put(((File) parent), files);
             }
-            
+
             return files.length;
         }
     }
 
-    public int getIndexOfChild(Object parent, Object child) 
+    public int getIndexOfChild(Object parent, Object child)
     {
         assert false;
         return 0;
     }
 
-    public Object getRoot() 
+    public Object getRoot()
     {
         return root;
     }
 
-    public boolean isLeaf(Object node) 
+    public boolean isLeaf(Object node)
     {
         return !((File) node).isDirectory();
     }
 
-    public void removeTreeModelListener(TreeModelListener l) 
+    public void removeTreeModelListener(TreeModelListener l)
     {
     }
 
-    public void valueForPathChanged(TreePath path, Object newValue) 
+    public void valueForPathChanged(TreePath path, Object newValue)
     {
     }
 
+    static java.util.Hashtable<String, javax.swing.ImageIcon> icons = new java.util.Hashtable<String, javax.swing.ImageIcon>();
+    
+            
     static class Renderer extends DefaultTreeCellRenderer
     {
-        public Renderer() {
+
+        public Renderer()
+        {
         }
 
         public java.awt.Component getTreeCellRendererComponent(
-                            cTree tree,
-                            Object value,
-                            boolean sel,
-                            boolean expanded,
-                            boolean leaf,
-                            int row,
-                            boolean hasFocus)
+                //cTree tree,
+                javax.swing.JTree tree,
+                Object value,
+                boolean sel,
+                boolean expanded,
+                boolean leaf,
+                int row,
+                boolean hasFocus)
         {
-            System.out.println(value);
+            //System.out.println(value);
             super.getTreeCellRendererComponent(
-                            tree, value, sel,
-                            expanded, leaf, row,
-                            hasFocus);
+                    tree, value, sel,
+                    expanded, leaf, row,
+                    hasFocus);
+            
+            String valueString = value.toString();
+            
+            if (valueString.toLowerCase().endsWith(".gfd") || valueString.toLowerCase().endsWith(".obj") || valueString.toLowerCase().endsWith(".3ds"))
+            {
+                String valueTruncated = valueString.substring(0, valueString.length()-4);
+                
+                System.out.println(valueTruncated);
+                
+                javax.swing.ImageIcon rendererIcon = icons.get(valueTruncated);
+                
+                if (rendererIcon == null)
+                {
+                    if (new File(valueTruncated + ".jpg").exists())
+                    {
+                        rendererIcon = new javax.swing.ImageIcon(valueTruncated + ".jpg");
+                    }
+                    else
+                    {
+                        if (new File(valueTruncated + ".png").exists())
+                        {
+                            rendererIcon = new javax.swing.ImageIcon(valueTruncated + ".png");
+                        }
+                    }
+                    
+                    if (rendererIcon == null)
+                    {
+                        rendererIcon = new javax.swing.ImageIcon();
+                    }
+                    
+                    icons.put(valueTruncated, rendererIcon);
+                }
+            
+                setIcon(rendererIcon);
+            }
+            else
+            {
+                //setIcon(null);
+//                Icon systemIcon = javax.swing.filechooser.FileSystemView.getFileSystemView().getSystemIcon( new File(valueString) );
+//                setIcon(systemIcon);
+            }
+            
             setToolTipText("This book is in the Tutorial series.");
 
             return this;
         }
-        
+
         public void setText(String text)
         {
             //System.out.println(text);
diff --git a/cTools.java b/cTools.java
new file mode 100644
index 0000000..b48b0c1
--- /dev/null
+++ b/cTools.java
@@ -0,0 +1,214 @@
+
+import java.io.*;
+import java.awt.*;
+import java.util.zip.ZipInputStream;
+
+public class cTools
+{
+    static byte[] bytes = new byte[16384];
+
+    static private void GetRemoteZip(String url, String dir, String id, String name, String icon)
+    {
+        String filename = name + "_" + id;
+        
+        String location = dir + "/" + filename;
+
+        java.net.URL u;
+        InputStream is = null;
+        
+        java.util.zip.ZipInputStream zis;
+
+        String modelName = null;
+        
+        try
+        {
+            u = new java.net.URL(url + id);
+            is = u.openStream();
+
+            zis = new java.util.zip.ZipInputStream(is);
+            
+            new java.io.File(location).mkdirs();
+
+            // now iterate through each item in the stream. The get next
+            // entry call will return a ZipEntry for each file in the stream
+            java.util.zip.ZipEntry entry;
+            while ((entry = zis.getNextEntry()) != null)
+            {
+                String entryName = entry.getName().toLowerCase();
+                
+                if (entryName.endsWith(".gsm"))
+                {
+                    // ArchiCAD
+                //    continue;
+                }
+
+                if (entryName.endsWith(".max"))
+                {
+                    // 3DS MAX
+                //    continue;
+                }
+
+                if (entryName.endsWith(".3ds") || entryName.endsWith(".obj"))
+                {
+                    modelName = entry.getName();
+                }
+
+                String s = String.format("Entry: %s len %d added %TD",
+                        entry.getName(), entry.getSize(),
+                        new java.util.Date(entry.getTime()));
+                System.out.println(s);
+
+                // Once we get the entry from the stream, the stream is
+                // positioned read to read the raw data, and we keep
+                // reading until read returns 0 or less.
+                String outpath = location + "/" + entry.getName();
+                
+                TransferFile(outpath, zis);
+            }
+        } catch (java.net.MalformedURLException mue)
+        {
+            System.err.println("Ouch - a MalformedURLException happened.");
+            mue.printStackTrace();
+            //System.exit(2);
+        } catch (IOException ioe)
+        {
+            //System.err.println("Oops - an IOException happened.");
+            //ioe.printStackTrace();
+            //System.exit(3);
+        } finally
+        {
+            try
+            {
+                if (is != null)
+                {
+                    is.close();
+                }
+            } catch (IOException ioe)
+            {
+            }
+        }
+
+        //  System.out.println("length = " + total);
+
+//                try
+//                {
+//                    Runtime.getRuntime().exec("/usr/local/bin/wget https://archive3d.net/?a=download&do=get&id=7caca905");
+//                }
+//                catch (Exception e)
+//                {
+//                    e.printStackTrace();
+//                }
+        java.awt.image.BufferedImage image;
+        
+        try
+        {
+            u = new java.net.URL(icon);
+            is = u.openStream();
+            
+//            image = (java.awt.image.BufferedImage)javax.imageio.ImageIO.read(u);
+//            
+//            //String[] g = javax.imageio.ImageIO.getWriterFormatNames();
+//            
+//            javax.imageio.ImageIO.write(image, "jpg", new File(location + "/" + name + id + ".jpg"));
+            
+            modelName = modelName.substring(0, modelName.length() - 4);
+            
+            TransferFile(location + "/" + modelName + ".jpg", is);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    static private void TransferFile(String outpath, InputStream zis) throws IOException
+    {
+        FileOutputStream output = null;
+        try
+        {
+            output = new FileOutputStream(outpath);
+            int len = 0;
+            while ((len = zis.read(bytes)) > 0)
+            {
+                output.write(bytes, 0, len);
+            }
+        } finally
+        {
+            // we must always close the output file
+            if (output != null)
+            {
+                output.close();
+            }
+        }
+    }
+
+    static void Archive(javax.swing.JFrame frame)
+    {
+        FileDialog browser = new FileDialog(frame, "Select archive to extract...", FileDialog.LOAD);
+        browser.setVisible(true);
+        String filename = browser.getFile();
+        if (filename != null && filename.length() > 0)
+        {
+            try
+            {
+                RandomAccessFile file = new RandomAccessFile(browser.getDirectory() + filename, "r");
+                String str;
+                while ((str = file.readLine()) != null)
+                {
+                    System.out.println(str);
+                    
+                    String cat = "nocat";
+                    
+                    String[] split = str.split("category=");
+                    
+                    if (split.length > 1)
+                    {
+                        String[] split2 = split[1].split(":");
+                        
+                        cat = split2[0];
+                        
+                        String[] split3 = cat.split("&");
+                        
+                        cat = split3[0];
+                        
+                        ////
+                        str = split2[1];
+                        
+                        int i = 2;
+                        while (i < split2.length)
+                        {
+                            str += ":" + split2[i++];
+                        }
+                    }
+                    
+                    split = str.split("id=");
+                    
+                    str = split[1];
+                    split = str.split("\" title=\"Download ");
+                    
+                    String id = split[0];
+                    
+                    str = split[1];
+                    split = str.split(" 3D Model\"><img src=\"");
+                    
+                    String name = split[0];
+                    
+                    str = split[1];
+                    split = str.split("\" alt");
+                    
+                    String icon = split[0];
+                    
+                    GetRemoteZip("https://archive3d.net/?a=download&do=get&id=", browser.getDirectory() + "/" + cat, id, name, icon);
+                    
+                    // To avoid network overload.
+                    Thread.sleep(2000);
+                }
+                
+                file.close();
+            } catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+        }
+    }
+}
diff --git a/cTreeDirectoryModel.java b/cTreeDirectoryModel.java
deleted file mode 100644
index 7325d45..0000000
--- a/cTreeDirectoryModel.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * @(#)BasicDirectoryModel.java	1.31 04/05/05
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-//package javax.swing.plaf.basic;
-
-import java.io.File;
-import java.util.*;
-import javax.swing.*;
-import javax.swing.tree.*;
-import javax.swing.filechooser.*;
-import javax.swing.event.*;
-import java.beans.*;
-
-import sun.awt.shell.ShellFolder;
-
-/**
- * Basic implementation of a file list.
- *
- * @version %i% %g%
- * @author Jeff Dinkins
- */
-public class cTreeDirectoryModel extends DefaultTreeModel implements PropertyChangeListener {
-
-    private JFileChooser filechooser = null;
-    // PENDING(jeff) pick the size more sensibly
-    private Vector fileCache = new Vector(50);
-    private LoadFilesThread loadThread = null;
-    private Vector files = null;
-    private Vector directories = null;
-    private int fetchID = 0;
-
-    public cTreeDirectoryModel(JFileChooser filechooser) {
-        super(null);
-	this.filechooser = filechooser;
-	validateFileCache();
-    }
-
-    public void propertyChange(PropertyChangeEvent e) {
-	String prop = e.getPropertyName();
-	if(prop == JFileChooser.DIRECTORY_CHANGED_PROPERTY ||
-	   prop == JFileChooser.FILE_VIEW_CHANGED_PROPERTY ||
-	   prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY ||
-	   prop == JFileChooser.FILE_HIDING_CHANGED_PROPERTY ||
-	   prop == JFileChooser.FILE_SELECTION_MODE_CHANGED_PROPERTY) {
-	    validateFileCache();
-	}
-    }
-
-    /**
-     * Obsolete - not used.
-     */
-    public void invalidateFileCache() {
-    }
-
-    public Vector<File> getDirectories() {
-	synchronized(fileCache) {
-	    if (directories != null) {
-		return directories;
-	    }
-	    Vector fls = getFiles();
-	    return directories;
-	}
-    }
-
-    public Vector<File> getFiles() {
-	synchronized(fileCache) {
-	    if (files != null) {
-		return files;
-	    }
-	    files = new Vector();
-	    directories = new Vector();
-	    directories.addElement(filechooser.getFileSystemView().createFileObject(
-		filechooser.getCurrentDirectory(), "..")
-	    );
-
-	    for (int i = 0; i < getSize(); i++) {
-		File f = (File)fileCache.get(i);
-		if (filechooser.isTraversable(f)) {
-		    directories.add(f);
-		} else {
-		    files.add(f);
-		}
-	    }
-	    return files;
-	}
-    }
-
-    public void validateFileCache() {
-	File currentDirectory = filechooser.getCurrentDirectory();
-	if (currentDirectory == null) {
-	    return;
-	}
-	if (loadThread != null) {
-	    loadThread.interrupt();
-            loadThread.cancelRunnables();
-	}
-	fetchID++;
-	loadThread = new LoadFilesThread(currentDirectory, fetchID);
-	loadThread.start();
-    }
-
-    /**
-     * Renames a file in the underlying file system.
-     *
-     * @param oldFile a <code>File</code> object representing
-     *        the existing file
-     * @param newFile a <code>File</code> object representing
-     *        the desired new file name
-     * @return <code>true</code> if rename succeeded,
-     *        otherwise <code>false</code>
-     * @since 1.4
-     */
-    public boolean renameFile(File oldFile, File newFile) {
-	synchronized(fileCache) {
-	    if (oldFile.renameTo(newFile)) {
-		validateFileCache();
-		return true;
-	    }
-	    return false;
-	}
-    }
-
-
-    public void fireContentsChanged() {
-	// System.out.println("BasicDirectoryModel: firecontentschanged");
-	//fireContentsChanged(this, 0, getSize()-1);
-    }
-
-    public int getSize() {
-	return fileCache.size();
-    }
-
-    public boolean contains(Object o) {
-	return fileCache.contains(o);
-    }
-
-    public int indexOf(Object o) {
-	return fileCache.indexOf(o);
-    }
-
-    public Object getElementAt(int index) {
-	return fileCache.get(index);
-    }
-
-    /**
-     * Obsolete - not used.
-     */
-    public void intervalAdded(ListDataEvent e) {
-    }
-
-    /**
-     * Obsolete - not used.
-     */
-    public void intervalRemoved(ListDataEvent e) {
-    }
-
-    protected void sort(Vector<? extends File> v){
-	ShellFolder.sortFiles(v);
-    }
-
-    // Obsolete - not used
-    protected boolean lt(File a, File b) {
-	// First ignore case when comparing
-	int diff = a.getName().toLowerCase().compareTo(b.getName().toLowerCase());
-	if (diff != 0) {
-	    return diff < 0;
-	} else {
-	    // May differ in case (e.g. "mail" vs. "Mail")
-	    return a.getName().compareTo(b.getName()) < 0;
-	}
-    }
-
-
-    class LoadFilesThread extends Thread {
-	File currentDirectory = null;
-	int fid;
-	Vector runnables = new Vector(10);
-	
-	public LoadFilesThread(File currentDirectory, int fid) {
-	    super("Basic L&F File Loading Thread");
-	    this.currentDirectory = currentDirectory;
-	    this.fid = fid;
-	}
-	
-	private void invokeLater(Runnable runnable) {
-	    runnables.addElement(runnable);
-	    SwingUtilities.invokeLater(runnable);
-	}
-
-	public void run() {
-	    FileSystemView fileSystem = filechooser.getFileSystemView();
-
-	    File[] list = fileSystem.getFiles(currentDirectory, filechooser.isFileHidingEnabled());
-
-	    Vector<File> acceptsList = new Vector<File>();
-
-	    if (isInterrupted()) {
-		return;
-	    }
-
-	    // run through the file list, add directories and selectable files to fileCache
-	    for (int i = 0; i < list.length; i++) {
-		if(filechooser.accept(list[i])) {
-		    acceptsList.addElement(list[i]);
-		}
-	    }
-
-	    if (isInterrupted()) {
-		return;
-	    }
-
-	    // First sort alphabetically by filename
-	    sort(acceptsList);
-
-	    Vector newDirectories = new Vector(50);
-	    Vector newFiles = new Vector();
-	    // run through list grabbing directories in chunks of ten
-	    for(int i = 0; i < acceptsList.size(); i++) {
-		File f = (File) acceptsList.elementAt(i);
-		boolean isTraversable = filechooser.isTraversable(f);
-		if (isTraversable) {
-		    newDirectories.addElement(f);
-		} else if (!isTraversable && filechooser.isFileSelectionEnabled()) {
-		    newFiles.addElement(f);
-		}
-		if(isInterrupted()) {
-		    return;
-		}
-	    }
-
-	    Vector newFileCache = new Vector(newDirectories);
-	    newFileCache.addAll(newFiles);
-
-	    int newSize = newFileCache.size();
-	    int oldSize = fileCache.size();
-
-	    if (newSize > oldSize) {
-		//see if interval is added
-		int start = oldSize;
-		int end = newSize;
-		for (int i = 0; i < oldSize; i++) {
-		    if (!newFileCache.get(i).equals(fileCache.get(i))) {
-			start = i;
-			for (int j = i; j < newSize; j++) {
-			    if (newFileCache.get(j).equals(fileCache.get(i))) {
-				end = j;
-				break;
-			    }
-			}
-			break;
-		    }
-		}
-		if (start >= 0 && end > start
-		    && newFileCache.subList(end, newSize).equals(fileCache.subList(start, oldSize))) {
-		    if(isInterrupted()) {
-		        return;
-		    }
-		    invokeLater(new DoChangeContents(newFileCache.subList(start, end), start, null, 0, fid));
-		    newFileCache = null;
-		}
-	    } else if (newSize < oldSize) {
-		//see if interval is removed
-		int start = -1;
-		int end = -1;
-		for (int i = 0; i < newSize; i++) {
-		    if (!newFileCache.get(i).equals(fileCache.get(i))) {
-			start = i;
-			end = i + oldSize - newSize;
-			break;
-		    }
-		}
-		if (start >= 0 && end > start
-		    && fileCache.subList(end, oldSize).equals(newFileCache.subList(start, newSize))) {
-		    if(isInterrupted()) {
-		        return;
-		    }
-		    invokeLater(new DoChangeContents(null, 0, new Vector(fileCache.subList(start, end)),
-						     start, fid));
-		    newFileCache = null;
-		}
-	    }
-	    if (newFileCache != null && !fileCache.equals(newFileCache)) {
-	        if (isInterrupted()) {
-		    cancelRunnables(runnables);
-	        }
-		invokeLater(new DoChangeContents(newFileCache, 0, fileCache, 0, fid));
-	    }
-	}
-
-
-	public void cancelRunnables(Vector runnables) {
-	    for(int i = 0; i < runnables.size(); i++) {
-		((DoChangeContents)runnables.elementAt(i)).cancel();
-	    }
-	}
-
- 	public void cancelRunnables() {
-            cancelRunnables(runnables);
-	}
-   }
-
-    class DoChangeContents implements Runnable {
-	private List addFiles;
-	private List remFiles;
-	private boolean doFire = true;
-	private int fid;
-	private int addStart = 0;
-	private int remStart = 0;
-	private int change;
-	
-	public DoChangeContents(List addFiles, int addStart, List remFiles, int remStart, int fid) {
-	    this.addFiles = addFiles;
-	    this.addStart = addStart;
-	    this.remFiles = remFiles;
-	    this.remStart = remStart;
-	    this.fid = fid;
-	}
-
-	synchronized void cancel() {
-		doFire = false;
-	}
-	
-	public synchronized void run() {
-	    if (fetchID == fid && doFire) {
-		int remSize = (remFiles == null) ? 0 : remFiles.size();
-		int addSize = (addFiles == null) ? 0 : addFiles.size();
-		synchronized(fileCache) {
-		    if (remSize > 0) {
-			fileCache.removeAll(remFiles);
-		    }
-		    if (addSize > 0) {
-			fileCache.addAll(addStart, addFiles);
-		    }
-		    files = null;
-		    directories = null;
-		}
-		if (remSize > 0 && addSize == 0) {
-		    //fireIntervalRemoved(BasicDirectoryModel.this, remStart, remStart + remSize - 1);
-		} else if (addSize > 0 && remSize == 0 && fileCache.size() > addSize) {
-		    //fireIntervalAdded(BasicDirectoryModel.this, addStart, addStart + addSize - 1);
-		} else {
-		    fireContentsChanged();
-		}
-	    }
-	}
-    }
-}
-
diff --git a/cTreeModel.java b/cTreeModel.java
index e5f99c4..85f893d 100644
--- a/cTreeModel.java
+++ b/cTreeModel.java
@@ -8,101 +8,100 @@
 
     public cTreeModel(Object3D owner)
     {
-            root = owner;
+        root = owner;
     }
 
     public void addTreeModelListener(TreeModelListener l)
     {
     }
 
-    public Object getChild(Object parent, int index) 
+    public Object getChild(Object parent, int index)
     {
-            Object3D /*Composite*/ group = (Object3D /*Composite*/) parent;
+        Object3D /*Composite*/ group = (Object3D /*Composite*/) parent;
 
-            return group./*children.*/get(index);
+        return group./*children.*/get(index);
     }
 
-    public int getChildCount(Object parent) 
+    public int getChildCount(Object parent)
     {
-            //if (parent instanceof Composite)
-            {
-                    return ((Object3D /*Composite*/) parent)/*.children*/.Size();
-            }
+        //if (parent instanceof Composite)
+        {
+            return ((Object3D /*Composite*/) parent)/*.children*/.Size();
+        }
 
-            //return 0;
+        //return 0;
     }
 
-    public int getIndexOfChild(Object parent, Object child) 
+    public int getIndexOfChild(Object parent, Object child)
     {
-            Object3D /*Composite*/ group = (Object3D /*Composite*/) parent;
+        Object3D /*Composite*/ group = (Object3D /*Composite*/) parent;
 
-            return group./*GetObject().*/indexOf(child);
+        return group./*GetObject().*/indexOf(child);
     }
 
-    public Object getRoot() 
+    public Object getRoot()
     {
-            return root;
+        return root;
     }
 
-    public boolean isLeaf(Object node) 
+    public boolean isLeaf(Object node)
     {
-            return ((Object3D)node).Size() == 0; // !(node instanceof Composite);
+        return ((Object3D) node).Size() == 0; // !(node instanceof Composite);
     }
 
-    public void removeTreeModelListener(TreeModelListener l) 
+    public void removeTreeModelListener(TreeModelListener l)
     {
     }
 
-    public void valueForPathChanged(TreePath path, Object newValue) 
+    public void valueForPathChanged(TreePath path, Object newValue)
     {
     }
 
     static class Renderer extends DefaultTreeCellRenderer
     {
-        public Renderer() {
+        public Renderer()
+        {
         }
 
         public java.awt.Component getTreeCellRendererComponent(
-                            javax.swing.JTree tree,
-                            Object value,
-                            boolean sel,
-                            boolean expanded,
-                            boolean leaf,
-                            int row,
-                            boolean hasFocus)
+                javax.swing.JTree tree,
+                Object value,
+                boolean sel,
+                boolean expanded,
+                boolean leaf,
+                int row,
+                boolean hasFocus)
         {
             //System.out.println(value.getClass());
-            super.getTreeCellRendererComponent(
-                            tree, value, sel,
-                            expanded, leaf, row,
-                            hasFocus);
-     String         stringValue = tree.convertValueToText(value, sel,
-                                          expanded, leaf, row, hasFocus);
+            super.getTreeCellRendererComponent(tree, value, sel,
+                    expanded, leaf, row, hasFocus);
+            String stringValue = tree.convertValueToText(value, sel,
+                    expanded, leaf, row, hasFocus);
 
-        //this.tree = tree;
-        this.hasFocus = hasFocus;
-        setText(stringValue);
+            //this.tree = tree;
+            this.hasFocus = hasFocus;
+            setText(stringValue);
 
-        Object3D obj = (Object3D) value;
-        
-        int r = 0, g = 0, b = 0;
+            Object3D obj = (Object3D) value;
 
-        if (obj.live)
-        {
-            g = 192;
-        }
-        
-        if (obj.hide)
-        {
-            r = 192;
-        }
-        
-        if (obj.link2master)
-        {
-            b = 192;
-        }
-        
-        java.awt.Color fg = new java.awt.Color(r,g,b);
+            int r = 0, g = 0, b = 0;
+
+            if (obj.live)
+            {
+                g = 192;
+            }
+
+            if (obj.hide)
+            {
+                r = 192;
+            }
+
+            if (obj.link2master)
+            {
+                b = 192;
+            }
+
+            java.awt.Color fg = new java.awt.Color(r, g, b);
 
 //        isDropCell = false;
 //        JTree.DropLocation dropLocation = tree.getDropLocation();
@@ -126,9 +125,9 @@
 //        }
 
 //        setBackground(fg);
-        setForeground(fg);
+            setForeground(fg);
 
-        // There needs to be a way to specify disabled icons.
+            // There needs to be a way to specify disabled icons.
 //        if (!tree.isEnabled()) {
 //            setEnabled(false);
 //
@@ -152,20 +151,22 @@
 //            }
 //        }
 
-        setComponentOrientation(tree.getComponentOrientation());
+            setComponentOrientation(tree.getComponentOrientation());
 
-        selected = sel;
+            selected = sel;
 
             //Object3D obj = (Object3D) value;
-            
-            if(obj.material == null)
+
+            if (obj.material == null)
+            {
                 setIcon(null);
-            
+            }
+
             setToolTipText("This book is in the Tutorial series.");
 
             return this;
         }
-        
+
         public void setText(String text)
         {
             //System.out.println(text);

--
Gitblit v1.6.2