home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 March / pcp161a.iso / handson / files / copyjava.exe / com / sun / java / swing / tree / DefaultTreeSelectionModel.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-02-26  |  11.9 KB  |  769 lines

  1. package com.sun.java.swing.tree;
  2.  
  3. import com.sun.java.swing.DefaultListSelectionModel;
  4. import com.sun.java.swing.event.EventListenerList;
  5. import com.sun.java.swing.event.TreeSelectionEvent;
  6. import com.sun.java.swing.event.TreeSelectionListener;
  7. import java.beans.PropertyChangeListener;
  8. import java.beans.PropertyChangeSupport;
  9. import java.io.IOException;
  10. import java.io.ObjectInputStream;
  11. import java.io.ObjectOutputStream;
  12. import java.io.Serializable;
  13. import java.util.BitSet;
  14. import java.util.Vector;
  15.  
  16. public class DefaultTreeSelectionModel implements Cloneable, Serializable, TreeSelectionModel {
  17.    public static final String SELECTION_MODE_PROPERTY = "selectionMode";
  18.    protected PropertyChangeSupport changeSupport;
  19.    protected TreePath[] selection;
  20.    protected EventListenerList listenerList = new EventListenerList();
  21.    protected transient RowMapper rowMapper;
  22.    protected DefaultListSelectionModel listSelectionModel = new DefaultListSelectionModel();
  23.    protected int selectionMode = 4;
  24.    protected TreePath leadPath;
  25.    protected int leadIndex;
  26.    protected int leadRow;
  27.    // $FF: synthetic field
  28.    static Class class$com$sun$java$swing$event$TreeSelectionListener;
  29.  
  30.    public DefaultTreeSelectionModel() {
  31.       this.leadIndex = this.leadRow = -1;
  32.    }
  33.  
  34.    public void setRowMapper(RowMapper var1) {
  35.       this.rowMapper = var1;
  36.       this.resetRowSelection();
  37.    }
  38.  
  39.    public RowMapper getRowMapper() {
  40.       return this.rowMapper;
  41.    }
  42.  
  43.    public void setSelectionMode(int var1) {
  44.       int var2 = this.selectionMode;
  45.       this.selectionMode = var1;
  46.       if (this.selectionMode != 1 && this.selectionMode != 2 && this.selectionMode != 4) {
  47.          this.selectionMode = 4;
  48.       }
  49.  
  50.       if (var2 != this.selectionMode && this.changeSupport != null) {
  51.          this.changeSupport.firePropertyChange("selectionMode", new Integer(var2), new Integer(this.selectionMode));
  52.       }
  53.  
  54.    }
  55.  
  56.    public int getSelectionMode() {
  57.       return this.selectionMode;
  58.    }
  59.  
  60.    public void setSelectionPath(TreePath var1) {
  61.       if (var1 == null) {
  62.          this.setSelectionPaths((TreePath[])null);
  63.       } else {
  64.          TreePath[] var2 = new TreePath[]{var1};
  65.          this.setSelectionPaths(var2);
  66.       }
  67.    }
  68.  
  69.    public void setSelectionPaths(TreePath[] var1) {
  70.       TreePath[] var6 = var1;
  71.       int var2;
  72.       if (var1 == null) {
  73.          var2 = 0;
  74.       } else {
  75.          var2 = var1.length;
  76.       }
  77.  
  78.       int var4;
  79.       if (this.selection == null) {
  80.          var4 = 0;
  81.       } else {
  82.          var4 = this.selection.length;
  83.       }
  84.  
  85.       if (var2 + var4 != 0) {
  86.          if (this.selectionMode == 1) {
  87.             if (var2 > 1) {
  88.                var6 = new TreePath[]{var1[0]};
  89.                var2 = 1;
  90.             }
  91.          } else if (this.selectionMode == 2 && var2 > 0 && !this.arePathsContiguous(var1)) {
  92.             var6 = new TreePath[]{var1[0]};
  93.             var2 = 1;
  94.          }
  95.  
  96.          int var8 = 0;
  97.          TreePath var9 = this.leadPath;
  98.          Vector var10 = new Vector(var2 + var4);
  99.          this.leadPath = null;
  100.  
  101.          for(int var3 = 0; var3 < var2; ++var3) {
  102.             boolean var7 = false;
  103.             if (var6[var3] != null) {
  104.                ++var8;
  105.  
  106.                for(int var5 = 0; var5 < var4; ++var5) {
  107.                   if (this.selection[var5] != null && this.selection[var5].equals(var6[var3])) {
  108.                      this.selection[var5] = null;
  109.                      var5 = var4;
  110.                      var7 = true;
  111.                   }
  112.                }
  113.  
  114.                if (!var7) {
  115.                   var10.addElement(new PathPlaceHolder(var6[var3], true));
  116.                }
  117.  
  118.                if (this.leadPath == null) {
  119.                   this.leadPath = var6[var3];
  120.                }
  121.             }
  122.          }
  123.  
  124.          for(int var12 = 0; var12 < var4; ++var12) {
  125.             if (this.selection[var12] != null) {
  126.                var10.addElement(new PathPlaceHolder(this.selection[var12], false));
  127.             }
  128.          }
  129.  
  130.          if (var8 == 0) {
  131.             this.selection = null;
  132.          } else if (var8 != var2) {
  133.             this.selection = new TreePath[var8];
  134.             int var11 = 0;
  135.  
  136.             for(int var13 = 0; var11 < var2; ++var11) {
  137.                if (var6[var11] != null) {
  138.                   this.selection[var13++] = var6[var11];
  139.                }
  140.             }
  141.          } else {
  142.             this.selection = new TreePath[var6.length];
  143.             System.arraycopy(var6, 0, this.selection, 0, var6.length);
  144.          }
  145.  
  146.          if (this.selection != null) {
  147.             this.insureUniqueness();
  148.          }
  149.  
  150.          this.updateLeadIndex();
  151.          this.resetRowSelection();
  152.          if (var10.size() > 0) {
  153.             this.notifyPathChange(var10, var9);
  154.          }
  155.       }
  156.  
  157.    }
  158.  
  159.    public void addSelectionPath(TreePath var1) {
  160.       if (var1 != null) {
  161.          TreePath[] var2 = new TreePath[]{var1};
  162.          this.addSelectionPaths(var2);
  163.       }
  164.  
  165.    }
  166.  
  167.    public void addSelectionPaths(TreePath[] var1) {
  168.       int var2 = var1 == null ? 0 : var1.length;
  169.       if (var2 > 0) {
  170.          if (this.selectionMode == 1 && this.selection != null && this.selection.length > 0) {
  171.             this.setSelectionPaths(var1);
  172.             return;
  173.          }
  174.  
  175.          if (this.selectionMode == 2 && !this.canPathsBeAdded(var1)) {
  176.             if (this.arePathsContiguous(var1)) {
  177.                this.setSelectionPaths(var1);
  178.                return;
  179.             }
  180.  
  181.             TreePath[] var13 = new TreePath[]{var1[0]};
  182.             this.setSelectionPaths(var13);
  183.             return;
  184.          }
  185.  
  186.          TreePath var9 = this.leadPath;
  187.          Vector var10 = null;
  188.          int var7;
  189.          if (this.selection == null) {
  190.             var7 = 0;
  191.          } else {
  192.             var7 = this.selection.length;
  193.          }
  194.  
  195.          boolean var3 = false;
  196.          this.leadPath = null;
  197.          int var5 = 0;
  198.  
  199.          int var6;
  200.          for(var6 = 0; var5 < var1.length; ++var5) {
  201.             if (var1[var5] != null) {
  202.                boolean var4 = false;
  203.  
  204.                for(int var8 = 0; var8 < var7; ++var8) {
  205.                   if (var1[var5].equals(this.selection[var8])) {
  206.                      var8 = var7;
  207.                      if (!var3) {
  208.                         TreePath[] var11 = new TreePath[var1.length];
  209.                         System.arraycopy(var1, 0, var11, 0, var1.length);
  210.                         var1 = var11;
  211.                         var3 = true;
  212.                      }
  213.  
  214.                      var1[var5] = null;
  215.                      var4 = true;
  216.                   }
  217.                }
  218.  
  219.                if (!var4) {
  220.                   ++var6;
  221.                   if (var10 == null) {
  222.                      var10 = new Vector();
  223.                   }
  224.  
  225.                   var10.addElement(new PathPlaceHolder(var1[var5], true));
  226.                }
  227.  
  228.                if (this.leadPath == null) {
  229.                   this.leadPath = var1[var5];
  230.                }
  231.             }
  232.          }
  233.  
  234.          if (this.leadPath == null) {
  235.             this.leadPath = var9;
  236.          }
  237.  
  238.          if (var6 > 0) {
  239.             TreePath[] var15 = new TreePath[var7 + var6];
  240.             if (var7 > 0) {
  241.                System.arraycopy(this.selection, 0, var15, 0, var7);
  242.             }
  243.  
  244.             if (var6 != var1.length) {
  245.                int var12 = 0;
  246.  
  247.                for(int var14 = 0; var14 < var1.length; ++var14) {
  248.                   if (var1[var14] != null) {
  249.                      var15[var7 + var12++] = var1[var14];
  250.                   }
  251.                }
  252.             } else {
  253.                System.arraycopy(var1, 0, var15, var7, var6);
  254.             }
  255.  
  256.             this.selection = var15;
  257.             this.insureUniqueness();
  258.             this.updateLeadIndex();
  259.             this.resetRowSelection();
  260.             this.notifyPathChange(var10, var9);
  261.             return;
  262.          }
  263.  
  264.          this.leadPath = var9;
  265.       }
  266.  
  267.    }
  268.  
  269.    public void removeSelectionPath(TreePath var1) {
  270.       if (var1 != null) {
  271.          TreePath[] var2 = new TreePath[]{var1};
  272.          this.removeSelectionPaths(var2);
  273.       }
  274.  
  275.    }
  276.  
  277.    public void removeSelectionPaths(TreePath[] var1) {
  278.       if (var1 != null && this.selection != null && var1.length > 0) {
  279.          if (!this.canPathsBeRemoved(var1)) {
  280.             this.clearSelection();
  281.             return;
  282.          }
  283.  
  284.          TreePath var6 = this.leadPath;
  285.          Vector var7 = null;
  286.          int var2 = this.selection.length;
  287.  
  288.          for(int var5 = 0; var5 < var1.length; ++var5) {
  289.             if (var1[var5] != null) {
  290.                if (this.leadPath != null && this.leadPath.equals(var1[var5])) {
  291.                   this.leadPath = null;
  292.                }
  293.  
  294.                for(int var3 = 0; var3 < var2; ++var3) {
  295.                   if (var1[var5].equals(this.selection[var3])) {
  296.                      this.selection[var3] = null;
  297.                      var3 = var2;
  298.                      if (var7 == null) {
  299.                         var7 = new Vector(var1.length);
  300.                      }
  301.  
  302.                      if (!var7.contains(var1[var5])) {
  303.                         var7.addElement(new PathPlaceHolder(var1[var5], false));
  304.                      }
  305.                   }
  306.                }
  307.             }
  308.          }
  309.  
  310.          if (var7 != null) {
  311.             int var4 = var7.size();
  312.             if (var4 == this.selection.length) {
  313.                this.selection = null;
  314.             } else {
  315.                int var8 = 0;
  316.                TreePath[] var9 = new TreePath[this.selection.length - var4];
  317.  
  318.                for(int var10 = 0; var10 < var2; ++var10) {
  319.                   if (this.selection[var10] != null) {
  320.                      var9[var8++] = this.selection[var10];
  321.                   }
  322.                }
  323.  
  324.                this.selection = var9;
  325.             }
  326.  
  327.             if (this.leadPath == null && this.selection != null) {
  328.                this.leadPath = this.selection[0];
  329.             }
  330.  
  331.             this.updateLeadIndex();
  332.             this.resetRowSelection();
  333.             this.notifyPathChange(var7, var6);
  334.          }
  335.       }
  336.  
  337.    }
  338.  
  339.    public TreePath getSelectionPath() {
  340.       return this.selection != null ? this.selection[0] : null;
  341.    }
  342.  
  343.    public TreePath[] getSelectionPaths() {
  344.       if (this.selection != null) {
  345.          int var1 = this.selection.length;
  346.          TreePath[] var2 = new TreePath[var1];
  347.          System.arraycopy(this.selection, 0, var2, 0, var1);
  348.          return var2;
  349.       } else {
  350.          return null;
  351.       }
  352.    }
  353.  
  354.    public int getSelectionCount() {
  355.       return this.selection == null ? 0 : this.selection.length;
  356.    }
  357.  
  358.    public boolean isPathSelected(TreePath var1) {
  359.       if (this.selection != null) {
  360.          for(int var2 = 0; var2 < this.selection.length; ++var2) {
  361.             if (this.selection[var2].equals(var1)) {
  362.                return true;
  363.             }
  364.          }
  365.       }
  366.  
  367.       return false;
  368.    }
  369.  
  370.    public boolean isSelectionEmpty() {
  371.       return this.selection == null;
  372.    }
  373.  
  374.    public void clearSelection() {
  375.       if (this.selection != null) {
  376.          int var1 = this.selection.length;
  377.          boolean[] var2 = new boolean[var1];
  378.  
  379.          for(int var3 = 0; var3 < var1; ++var3) {
  380.             var2[var3] = false;
  381.          }
  382.  
  383.          TreeSelectionEvent var4 = new TreeSelectionEvent(this, this.selection, var2, this.leadPath, (TreePath)null);
  384.          this.leadPath = null;
  385.          this.leadIndex = this.leadRow = -1;
  386.          this.selection = null;
  387.          this.resetRowSelection();
  388.          this.fireValueChanged(var4);
  389.       }
  390.  
  391.    }
  392.  
  393.    public void addTreeSelectionListener(TreeSelectionListener var1) {
  394.       this.listenerList.add(class$com$sun$java$swing$event$TreeSelectionListener != null ? class$com$sun$java$swing$event$TreeSelectionListener : (class$com$sun$java$swing$event$TreeSelectionListener = class$("com.sun.java.swing.event.TreeSelectionListener")), var1);
  395.    }
  396.  
  397.    public void removeTreeSelectionListener(TreeSelectionListener var1) {
  398.       this.listenerList.remove(class$com$sun$java$swing$event$TreeSelectionListener != null ? class$com$sun$java$swing$event$TreeSelectionListener : (class$com$sun$java$swing$event$TreeSelectionListener = class$("com.sun.java.swing.event.TreeSelectionListener")), var1);
  399.    }
  400.  
  401.    protected void fireValueChanged(TreeSelectionEvent var1) {
  402.       Object[] var2 = this.listenerList.getListenerList();
  403.  
  404.       for(int var3 = var2.length - 2; var3 >= 0; var3 -= 2) {
  405.          if (var2[var3] == (class$com$sun$java$swing$event$TreeSelectionListener != null ? class$com$sun$java$swing$event$TreeSelectionListener : (class$com$sun$java$swing$event$TreeSelectionListener = class$("com.sun.java.swing.event.TreeSelectionListener")))) {
  406.             ((TreeSelectionListener)var2[var3 + 1]).valueChanged(var1);
  407.          }
  408.       }
  409.  
  410.    }
  411.  
  412.    public int[] getSelectionRows() {
  413.       return this.rowMapper != null && this.selection != null ? this.rowMapper.getRowsForPaths(this.selection) : null;
  414.    }
  415.  
  416.    public int getMinSelectionRow() {
  417.       return this.listSelectionModel.getMinSelectionIndex();
  418.    }
  419.  
  420.    public int getMaxSelectionRow() {
  421.       return this.listSelectionModel.getMaxSelectionIndex();
  422.    }
  423.  
  424.    public boolean isRowSelected(int var1) {
  425.       return this.listSelectionModel.isSelectedIndex(var1);
  426.    }
  427.  
  428.    public void resetRowSelection() {
  429.       this.listSelectionModel.clearSelection();
  430.       if (this.selection != null && this.rowMapper != null) {
  431.          int[] var2 = this.rowMapper.getRowsForPaths(this.selection);
  432.          int var3 = 0;
  433.  
  434.          for(int var4 = this.selection.length; var3 < var4; ++var3) {
  435.             int var1 = var2[var3];
  436.             if (var1 != -1) {
  437.                this.listSelectionModel.addSelectionInterval(var1, var1);
  438.             }
  439.          }
  440.  
  441.          if (this.leadIndex != -1) {
  442.             this.leadRow = var2[this.leadIndex];
  443.          }
  444.  
  445.          this.insureRowContinuity();
  446.       } else {
  447.          this.leadRow = -1;
  448.       }
  449.    }
  450.  
  451.    public int getLeadSelectionRow() {
  452.       return this.leadRow;
  453.    }
  454.  
  455.    public TreePath getLeadSelectionPath() {
  456.       return this.leadPath;
  457.    }
  458.  
  459.    public synchronized void addPropertyChangeListener(PropertyChangeListener var1) {
  460.       if (this.changeSupport == null) {
  461.          this.changeSupport = new PropertyChangeSupport(this);
  462.       }
  463.  
  464.       this.changeSupport.addPropertyChangeListener(var1);
  465.    }
  466.  
  467.    public synchronized void removePropertyChangeListener(PropertyChangeListener var1) {
  468.       if (this.changeSupport != null) {
  469.          this.changeSupport.removePropertyChangeListener(var1);
  470.       }
  471.    }
  472.  
  473.    protected void insureRowContinuity() {
  474.       if (this.selectionMode == 2 && this.selection != null && this.rowMapper != null) {
  475.          DefaultListSelectionModel var1 = this.listSelectionModel;
  476.          int var2 = var1.getMinSelectionIndex();
  477.          if (var2 != -1) {
  478.             int var3 = var2;
  479.  
  480.             for(int var4 = var1.getMaxSelectionIndex(); var3 <= var4; ++var3) {
  481.                if (!var1.isSelectedIndex(var3)) {
  482.                   if (var3 != var2) {
  483.                      TreePath[] var5 = new TreePath[var3 - var2];
  484.                      System.arraycopy(this.selection, 0, var5, 0, var3 - var2);
  485.                      this.setSelectionPaths(var5);
  486.                      return;
  487.                   }
  488.  
  489.                   this.clearSelection();
  490.                }
  491.             }
  492.  
  493.             return;
  494.          }
  495.       } else if (this.selectionMode == 1 && this.selection != null && this.selection.length > 1) {
  496.          this.setSelectionPath(this.selection[0]);
  497.       }
  498.  
  499.    }
  500.  
  501.    protected boolean arePathsContiguous(TreePath[] var1) {
  502.       if (this.rowMapper != null && var1.length >= 2) {
  503.          BitSet var2 = new BitSet(32);
  504.          int var6 = var1.length;
  505.          int var7 = 0;
  506.          TreePath[] var8 = new TreePath[]{var1[0]};
  507.          int var5 = this.rowMapper.getRowsForPaths(var8)[0];
  508.  
  509.          for(int var4 = 0; var4 < var6; ++var4) {
  510.             if (var1[var4] != null) {
  511.                var8[0] = var1[var4];
  512.                int var3 = this.rowMapper.getRowsForPaths(var8)[0];
  513.                if (var3 == -1 || var3 < var5 - var6 || var3 > var5 + var6) {
  514.                   return false;
  515.                }
  516.  
  517.                if (var3 < var5) {
  518.                   var5 = var3;
  519.                }
  520.  
  521.                if (!var2.get(var3)) {
  522.                   var2.set(var3);
  523.                   ++var7;
  524.                }
  525.             }
  526.          }
  527.  
  528.          int var9 = var7 + var5;
  529.  
  530.          for(int var10 = var5; var10 < var9; ++var10) {
  531.             if (!var2.get(var10)) {
  532.                return false;
  533.             }
  534.          }
  535.  
  536.          return true;
  537.       } else {
  538.          return true;
  539.       }
  540.    }
  541.  
  542.    protected boolean canPathsBeAdded(TreePath[] var1) {
  543.       if (var1 != null && var1.length != 0 && this.rowMapper != null && this.selection != null && this.selectionMode != 4) {
  544.          BitSet var2 = new BitSet();
  545.          DefaultListSelectionModel var3 = this.listSelectionModel;
  546.          int var6 = var3.getMinSelectionIndex();
  547.          int var7 = var3.getMaxSelectionIndex();
  548.          TreePath[] var8 = new TreePath[1];
  549.          if (var6 != -1) {
  550.             for(int var5 = var6; var5 <= var7; ++var5) {
  551.                if (var3.isSelectedIndex(var6)) {
  552.                   var2.set(var5);
  553.                }
  554.             }
  555.          } else {
  556.             var8[0] = var1[0];
  557.             var6 = var7 = this.rowMapper.getRowsForPaths(var8)[0];
  558.          }
  559.  
  560.          for(int var9 = var1.length - 1; var9 >= 0; --var9) {
  561.             if (var1[var9] != null) {
  562.                var8[0] = var1[var9];
  563.                int var4 = this.rowMapper.getRowsForPaths(var8)[0];
  564.                var6 = Math.min(var4, var6);
  565.                var7 = Math.max(var4, var7);
  566.                if (var4 == -1) {
  567.                   return false;
  568.                }
  569.  
  570.                var2.set(var4);
  571.             }
  572.          }
  573.  
  574.          for(int var10 = var6; var10 <= var7; ++var10) {
  575.             if (!var2.get(var10)) {
  576.                return false;
  577.             }
  578.          }
  579.  
  580.          return true;
  581.       } else {
  582.          return true;
  583.       }
  584.    }
  585.  
  586.    protected boolean canPathsBeRemoved(TreePath[] var1) {
  587.       if (this.rowMapper != null && this.selection != null && this.selectionMode != 4) {
  588.          BitSet var3 = new BitSet();
  589.          int var6 = var1.length;
  590.          int var8 = -1;
  591.          int var9 = 0;
  592.          TreePath[] var10 = new TreePath[var6];
  593.          TreePath[] var11 = new TreePath[1];
  594.          System.arraycopy(var1, 0, var10, 0, var6);
  595.  
  596.          for(int var4 = this.selection.length - 1; var4 >= 0; --var4) {
  597.             boolean var2 = false;
  598.  
  599.             for(int var5 = 0; var5 < var6; ++var5) {
  600.                if (var10[var5] != null && this.selection[var4].equals(var10[var5])) {
  601.                   var10[var5] = null;
  602.                   var2 = true;
  603.                   break;
  604.                }
  605.             }
  606.  
  607.             if (!var2) {
  608.                var11[0] = this.selection[var4];
  609.                int var7 = this.rowMapper.getRowsForPaths(var11)[0];
  610.                if (var7 != -1 && !var3.get(var7)) {
  611.                   ++var9;
  612.                   if (var8 == -1) {
  613.                      var8 = var7;
  614.                   } else {
  615.                      var8 = Math.min(var8, var7);
  616.                   }
  617.  
  618.                   var3.set(var7);
  619.                }
  620.             }
  621.          }
  622.  
  623.          if (var9 > 1) {
  624.             for(int var12 = var8 + var9 - 1; var12 >= var8; --var12) {
  625.                if (!var3.get(var12)) {
  626.                   return false;
  627.                }
  628.             }
  629.          }
  630.  
  631.          return true;
  632.       } else {
  633.          return true;
  634.       }
  635.    }
  636.  
  637.    protected void notifyPathChange(Vector var1, TreePath var2) {
  638.       int var3 = var1.size();
  639.       boolean[] var4 = new boolean[var3];
  640.       TreePath[] var5 = new TreePath[var3];
  641.  
  642.       for(int var7 = 0; var7 < var3; ++var7) {
  643.          PathPlaceHolder var6 = (PathPlaceHolder)var1.elementAt(var7);
  644.          var4[var7] = var6.isNew;
  645.          var5[var7] = var6.path;
  646.       }
  647.  
  648.       TreeSelectionEvent var8 = new TreeSelectionEvent(this, var5, var4, var2, this.leadPath);
  649.       this.fireValueChanged(var8);
  650.    }
  651.  
  652.    protected void updateLeadIndex() {
  653.       if (this.leadPath != null) {
  654.          if (this.selection == null) {
  655.             this.leadPath = null;
  656.             this.leadIndex = this.leadRow = -1;
  657.             return;
  658.          }
  659.  
  660.          this.leadRow = this.leadIndex = -1;
  661.  
  662.          for(int var1 = this.selection.length - 1; var1 >= 0; --var1) {
  663.             if (this.selection[var1].equals(this.leadPath)) {
  664.                this.leadIndex = var1;
  665.                return;
  666.             }
  667.          }
  668.       }
  669.  
  670.    }
  671.  
  672.    protected void insureUniqueness() {
  673.       int var2 = 0;
  674.  
  675.       for(int var1 = 0; var1 < this.selection.length; ++var1) {
  676.          if (this.selection[var1] != null) {
  677.             for(int var3 = var1 + 1; var3 < this.selection.length; ++var3) {
  678.                if (this.selection[var3] != null && this.selection[var1].equals(this.selection[var3])) {
  679.                   ++var2;
  680.                   this.selection[var3] = null;
  681.                }
  682.             }
  683.          }
  684.       }
  685.  
  686.       if (var2 > 0) {
  687.          TreePath[] var4 = new TreePath[this.selection.length - var2];
  688.          int var5 = 0;
  689.  
  690.          for(int var6 = 0; var5 < this.selection.length; ++var5) {
  691.             if (this.selection[var5] != null) {
  692.                var4[var6++] = this.selection[var5];
  693.             }
  694.          }
  695.  
  696.          this.selection = var4;
  697.       }
  698.  
  699.    }
  700.  
  701.    public String toString() {
  702.       int var1 = this.getSelectionCount();
  703.       StringBuffer var2 = new StringBuffer();
  704.       int[] var3;
  705.       if (this.rowMapper != null) {
  706.          var3 = this.rowMapper.getRowsForPaths(this.selection);
  707.       } else {
  708.          var3 = null;
  709.       }
  710.  
  711.       var2.append(this.getClass().getName() + " " + this.hashCode() + " [ ");
  712.  
  713.       for(int var4 = 0; var4 < var1; ++var4) {
  714.          if (var3 != null) {
  715.             var2.append(this.selection[var4].toString() + "@" + Integer.toString(var3[var4]) + " ");
  716.          } else {
  717.             var2.append(this.selection[var4].toString() + " ");
  718.          }
  719.       }
  720.  
  721.       var2.append("]");
  722.       return var2.toString();
  723.    }
  724.  
  725.    public Object clone() throws CloneNotSupportedException {
  726.       DefaultTreeSelectionModel var1 = (DefaultTreeSelectionModel)super.clone();
  727.       var1.changeSupport = null;
  728.       if (this.selection != null) {
  729.          int var2 = this.selection.length;
  730.          var1.selection = new TreePath[var2];
  731.          System.arraycopy(this.selection, 0, var1.selection, 0, var2);
  732.       }
  733.  
  734.       var1.listenerList = new EventListenerList();
  735.       var1.listSelectionModel = (DefaultListSelectionModel)this.listSelectionModel.clone();
  736.       return var1;
  737.    }
  738.  
  739.    private void writeObject(ObjectOutputStream var1) throws IOException {
  740.       var1.defaultWriteObject();
  741.       Object[] var2;
  742.       if (this.rowMapper != null && this.rowMapper instanceof Serializable) {
  743.          var2 = new Object[]{"rowMapper", this.rowMapper};
  744.       } else {
  745.          var2 = new Object[0];
  746.       }
  747.  
  748.       var1.writeObject(var2);
  749.    }
  750.  
  751.    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  752.       var1.defaultReadObject();
  753.       Object[] var2 = var1.readObject();
  754.       if (var2.length > 0 && var2[0].equals("rowMapper")) {
  755.          this.rowMapper = (RowMapper)var2[1];
  756.       }
  757.  
  758.    }
  759.  
  760.    // $FF: synthetic method
  761.    static Class class$(String var0) {
  762.       try {
  763.          return Class.forName(var0);
  764.       } catch (ClassNotFoundException var2) {
  765.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  766.       }
  767.    }
  768. }
  769.