home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 27 / CDROM27.iso / share / wnt / jig / data1.cab / Program_Executable_Files / lib / jig.jar / BrowserModel.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-08-19  |  23.7 KB  |  1,817 lines

  1. import java.io.BufferedReader;
  2. import java.io.DataInputStream;
  3. import java.io.DataOutputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.FilterInputStream;
  7. import java.io.FilterOutputStream;
  8. import java.io.IOException;
  9. import java.io.StreamTokenizer;
  10. import java.io.StringReader;
  11. import java.io.StringWriter;
  12. import java.util.Observable;
  13. import java.util.Observer;
  14.  
  15. public class BrowserModel extends Observable implements Observer {
  16.    boolean lineNumbers = false;
  17.    int currentMethodSelector = -1;
  18.    int currentClassSelector = -1;
  19.    int currentPackageSelector;
  20.    int oldIndex = -1;
  21.    int[] methodRef;
  22.    int[] classRef;
  23.    long lastModified;
  24.    String textState = "";
  25.    String currentPackageName;
  26.    String currentClassName;
  27.    String currentMethodName;
  28.    String currentOutput;
  29.    String[] staticClassList;
  30.    String[] packageList;
  31.    String[] classList;
  32.    String[] methodList;
  33.    String[] packageFilter;
  34.    String[] classFilter;
  35.    String[] methodFilter;
  36.    MethodRecord[] listMethod;
  37.    BrowserFileLoader fileLoader;
  38.    String rootDir;
  39.    boolean newMethodCreated = false;
  40.    String newClassName;
  41.    boolean isSystemBrowser = false;
  42.    boolean isClassBrowser = false;
  43.    boolean isMethodFilterBrowser = false;
  44.    boolean saveOperation = false;
  45.    boolean creatingNewMethod = false;
  46.    static int Save;
  47.    static int SaveCompile = 1;
  48.    static int Compile = 2;
  49.    static int Java = 3;
  50.    static int Debug = 4;
  51.    static int Evaluate = 5;
  52.    static int WorkSpace = 6;
  53.    static int Exit = 7;
  54.    static int FindNext = 8;
  55.    static int Find = 9;
  56.    static int Replace = 10;
  57.    static int Format = 11;
  58.    static int NewMethod = 12;
  59.    static int NewClass = 13;
  60.    static int Match = 14;
  61.    static int LineNumbers = 15;
  62.    static int Options = 16;
  63.    static int BrowseReferences = 17;
  64.    static int BrowseSenders = 18;
  65.    static int BrowseReceivers = 19;
  66.    static int BrowseHierarchy = 20;
  67.    static int BrowseInterfaces = 21;
  68.    static int BrowseClass = 22;
  69.    static int BrowseSystem = 23;
  70.    static int RemoveMethod = 24;
  71.    static int HelpContents = 25;
  72.    static int HelpAbout = 26;
  73.    static int BrowseImplementors = 27;
  74.    static int BrowseExtenders = 28;
  75.    static int SaveRun = 29;
  76.    static int NewInterface = 30;
  77.    static int RenameClass = 31;
  78.    static int RenameMethod = 32;
  79.    static int DeleteClass = 33;
  80.    static int AppletViewer = 34;
  81.    static int HtmlBrowser = 35;
  82.    static int AppletViewerDebug = 36;
  83.    static int Transcript = 37;
  84.    static int DiscardEdits = 38;
  85.    static int Document = 39;
  86.    static int StackTrace = 40;
  87.    static int SaveAll = 41;
  88.    static int MaxState = 42;
  89.    boolean[] state;
  90.    boolean[] changes;
  91.    static int PackageLoad;
  92.    static int ClassLoad = 1;
  93.    static int MethodLoad = 2;
  94.    static int OutputLoad = 3;
  95.    static int SelectClass = 4;
  96.    static int SelectMethod = 5;
  97.    static int ChangeState = 6;
  98.    static int AnyEdits = 7;
  99.    static int PackageList = 8;
  100.    static int ClassList = 9;
  101.    static int MethodList = 10;
  102.    static int OutOfDate = 11;
  103.    static int MaxChanges = 12;
  104.  
  105.    BrowserModel(String var1, String[] var2, String[] var3, String[] var4) {
  106.       this.state = new boolean[MaxState];
  107.       this.packageList = var2;
  108.       this.classFilter = var3;
  109.       this.methodFilter = var4;
  110.       this.isMethodFilterBrowser = true;
  111.       this.init(var1);
  112.    }
  113.  
  114.    BrowserModel(String var1, String[] var2, String[] var3) {
  115.       this.state = new boolean[MaxState];
  116.       this.packageList = var2;
  117.       this.classFilter = var3;
  118.       this.init(var1);
  119.    }
  120.  
  121.    BrowserModel(String var1, String[] var2) {
  122.       this.state = new boolean[MaxState];
  123.       this.staticClassList = var2;
  124.       this.isClassBrowser = true;
  125.       this.init(var1);
  126.    }
  127.  
  128.    BrowserModel() {
  129.       this.state = new boolean[MaxState];
  130.       this.init((String)null);
  131.       this.packageList = this.fileLoader.ListDirectory();
  132.       String[] var1 = this.packageList;
  133.       QSortAlgorithm.QuickSort(var1, 0, var1.length - 1);
  134.       this.isSystemBrowser = true;
  135.    }
  136.  
  137.    public boolean setLineNumbers() {
  138.       this.lineNumbers = !this.lineNumbers;
  139.       this.changes = new boolean[MaxChanges];
  140.       if (this.textState == "Method") {
  141.          this.changes[MethodLoad] = true;
  142.          this.changes[SelectMethod] = true;
  143.          this.changes[OutputLoad] = true;
  144.          this.changes[ChangeState] = true;
  145.       } else if (this.textState == "Class") {
  146.          this.changes[MethodLoad] = true;
  147.          this.changes[OutputLoad] = true;
  148.          this.changes[ChangeState] = true;
  149.       }
  150.  
  151.       boolean[] var1 = this.changes;
  152.       ((Observable)this).setChanged();
  153.       ((Observable)this).notifyObservers(var1);
  154.       return this.lineNumbers;
  155.    }
  156.  
  157.    public boolean[] currentState() {
  158.       this.state[Save] = this.currentClassName == null || this.lineNumbers;
  159.       this.state[SaveAll] = this.currentClassName == null || this.lineNumbers;
  160.       this.state[SaveCompile] = this.currentClassName == null || this.lineNumbers;
  161.       this.state[Compile] = this.currentClassName == null;
  162.       this.state[Java] = this.currentClassName == null;
  163.       this.state[Debug] = this.currentClassName == null;
  164.       this.state[Evaluate] = this.currentClassName == null;
  165.       this.state[FindNext] = this.currentClassName == null;
  166.       this.state[Find] = this.currentClassName == null;
  167.       this.state[Replace] = this.currentClassName == null || this.lineNumbers;
  168.       this.state[Format] = this.currentClassName == null || this.lineNumbers;
  169.       this.state[NewMethod] = this.currentClassName == null || this.lineNumbers || !this.isSystemBrowser() && !this.isClassBrowser();
  170.       this.state[NewClass] = this.currentPackageName == null && this.currentClassName == null || this.lineNumbers || !this.isSystemBrowser();
  171.       this.state[Match] = this.currentClassName == null;
  172.       this.state[BrowseReferences] = this.currentClassName == null;
  173.       this.state[BrowseSenders] = this.currentClassName == null;
  174.       this.state[BrowseReceivers] = this.currentClassName == null;
  175.       this.state[BrowseHierarchy] = this.currentClassName == null;
  176.       this.state[BrowseInterfaces] = this.currentClassName == null;
  177.       this.state[BrowseExtenders] = this.currentClassName == null;
  178.       this.state[BrowseImplementors] = this.currentClassName == null;
  179.       this.state[BrowseClass] = this.currentClassName == null;
  180.       this.state[RemoveMethod] = this.currentMethodName == null || this.lineNumbers || !this.isSystemBrowser() && !this.isClassBrowser();
  181.       this.state[SaveRun] = this.currentClassName == null || this.lineNumbers;
  182.       this.state[NewInterface] = this.currentPackageName == null && this.currentClassName == null || this.lineNumbers || !this.isSystemBrowser();
  183.       this.state[RenameClass] = this.creatingNewMethod || this.currentClassName == null || this.lineNumbers || this.currentMethodName != null || !this.isSystemBrowser();
  184.       this.state[RenameMethod] = this.currentMethodName == null || this.lineNumbers || !this.isSystemBrowser() && !this.isClassBrowser();
  185.       this.state[DeleteClass] = this.currentClassName == null || this.lineNumbers || this.currentMethodName != null || !this.isSystemBrowser();
  186.       this.state[AppletViewerDebug] = this.currentClassName == null;
  187.       this.state[HtmlBrowser] = !BrowserOptions.htmlBrowserValid;
  188.       this.state[HelpContents] = !BrowserOptions.htmlBrowserValid;
  189.       this.state[Transcript] = !BrowserOptions.transcript;
  190.       this.state[DiscardEdits] = this.currentClassName == null || this.lineNumbers;
  191.       this.state[Document] = this.currentPackageName == null;
  192.       this.state[StackTrace] = this.currentPackageName == null;
  193.       return this.state;
  194.    }
  195.  
  196.    private void changed(boolean[] var1) {
  197.       ((Observable)this).setChanged();
  198.       ((Observable)this).notifyObservers(var1);
  199.    }
  200.  
  201.    private void changed() {
  202.       ((Observable)this).setChanged();
  203.       ((Observable)this).notifyObservers();
  204.    }
  205.  
  206.    public String getCurrentOutput() {
  207.       if (this.currentOutput != null) {
  208.          return this.currentOutput;
  209.       } else {
  210.          this.currentOutput = null;
  211.          String var1 = new String("");
  212.          if (this.listMethod == null) {
  213.             return var1;
  214.          } else {
  215.             if (this.textState == "Method") {
  216.                String[] var2 = this.fileLoader.loadMethod(this.currentClassName, this.listMethod, this.currentMethodSelector);
  217.                int var3 = 0;
  218.                if (this.lineNumbers) {
  219.                   if (this.currentMethodSelector == MethodRecord.FindFirst(this.listMethod)) {
  220.                      var3 = this.listMethod[this.currentMethodSelector].commentStartRow();
  221.                   } else {
  222.                      var3 = this.listMethod[MethodRecord.FindPrevious(this.listMethod, this.currentMethodSelector)].endRow() + 1;
  223.                   }
  224.                }
  225.  
  226.                try {
  227.                   for(int var4 = 0; var2 != null && var4 < var2.length; ++var4) {
  228.                      if (this.lineNumbers) {
  229.                         var1 = var1 + Integer.toString(var3 + var4) + "\t" + var2[var4] + "\n";
  230.                      } else {
  231.                         var1 = var1 + var2[var4] + "\n";
  232.                      }
  233.                   }
  234.                } catch (NullPointerException var9) {
  235.                }
  236.             } else if (this.textState == "Class") {
  237.                String[] var10 = this.fileLoader.loadClassPart(this.currentClassName, this.listMethod);
  238.                String[] var11 = this.fileLoader.loadClassEnd(this.currentClassName, this.listMethod);
  239.  
  240.                try {
  241.                   int var12 = 1;
  242.  
  243.                   for(int var5 = 0; var5 < var10.length; ++var5) {
  244.                      if (this.lineNumbers) {
  245.                         var1 = var1 + Integer.toString(var12 + var5) + "\t" + var10[var5] + "\n";
  246.                      } else {
  247.                         var1 = var1 + var10[var5] + "\n";
  248.                      }
  249.                   }
  250.  
  251.                   int var6 = MethodRecord.FindLast(this.listMethod);
  252.                   if (var6 != -1) {
  253.                      var12 = this.listMethod[var6].endRow() + 1;
  254.                   }
  255.  
  256.                   for(int var7 = 0; var7 < var11.length; ++var7) {
  257.                      if (this.lineNumbers) {
  258.                         var1 = var1 + Integer.toString(var12 + var7) + "\t" + var11[var7] + "\n";
  259.                      } else {
  260.                         var1 = var1 + var11[var7] + "\n";
  261.                      }
  262.                   }
  263.                } catch (NullPointerException var8) {
  264.                }
  265.             }
  266.  
  267.             return var1;
  268.          }
  269.       }
  270.    }
  271.  
  272.    public String[] currentPackages() {
  273.       String[] var1 = new String[this.packageList.length];
  274.  
  275.       for(int var2 = 0; var2 < this.packageList.length; ++var2) {
  276.          var1[var2] = this.packageList[var2].substring(1);
  277.       }
  278.  
  279.       return var1;
  280.    }
  281.  
  282.    void currentMethods() {
  283.       int var1 = this.currentClassSelector;
  284.       if (var1 >= 0) {
  285.          this.currentClassName = this.classList[var1];
  286.          String var2 = this.currentClassName;
  287.          this.lastModified = this.fileLoader.lastModified(this.majorClassName(var2));
  288.          this.fileLoader.loadClass(var2, true);
  289.       }
  290.  
  291.    }
  292.  
  293.    void currentClasses() {
  294.       if (this.packageList != null) {
  295.          int var1 = this.currentPackageSelector;
  296.          this.fileLoader.loadPackage(this.GetRootDir(), this.packageList[var1]);
  297.       } else {
  298.          this.updateClassList();
  299.       }
  300.    }
  301.  
  302.    public void selectPackage(int var1) {
  303.       this.currentPackageSelector = var1;
  304.       this.textState = "";
  305.       this.currentPackageName = this.packageList[var1];
  306.       this.currentClassName = null;
  307.       this.currentClassSelector = -1;
  308.       this.changes = new boolean[MaxChanges];
  309.       this.changes[ClassLoad] = true;
  310.       boolean[] var2 = this.changes;
  311.       ((Observable)this).setChanged();
  312.       ((Observable)this).notifyObservers(var2);
  313.    }
  314.  
  315.    public void selectClass(int var1) {
  316.       this.changes = new boolean[MaxChanges];
  317.       this.currentMethodSelector = -1;
  318.       if (this.textState != "" && this.currentClassSelector == this.classRef[var1]) {
  319.          this.currentMethodName = null;
  320.          this.changes[OutputLoad] = true;
  321.       } else {
  322.          this.currentClassSelector = this.classRef[var1];
  323.          this.changes[OutputLoad] = true;
  324.          this.changes[MethodLoad] = true;
  325.       }
  326.  
  327.       this.textState = "Class";
  328.       boolean[] var2 = this.changes;
  329.       ((Observable)this).setChanged();
  330.       ((Observable)this).notifyObservers(var2);
  331.    }
  332.  
  333.    public void selectMethod(int var1) {
  334.       this.currentMethodSelector = this.methodRef[var1];
  335.       this.currentMethodName = this.methodList[var1];
  336.       this.textState = "Method";
  337.       this.changes = new boolean[MaxChanges];
  338.       this.changes[OutputLoad] = true;
  339.       boolean[] var2 = this.changes;
  340.       ((Observable)this).setChanged();
  341.       ((Observable)this).notifyObservers(var2);
  342.    }
  343.  
  344.    private void setCurrentClass(String var1) {
  345.       this.currentOutput = var1;
  346.       this.changes = new boolean[MaxChanges];
  347.       this.changes[OutputLoad] = true;
  348.       boolean[] var2 = this.changes;
  349.       ((Observable)this).setChanged();
  350.       ((Observable)this).notifyObservers(var2);
  351.    }
  352.  
  353.    private void setCurrentMethod(String var1) {
  354.       this.currentOutput = var1;
  355.       this.changes = new boolean[MaxChanges];
  356.       this.changes[OutputLoad] = true;
  357.       boolean[] var2 = this.changes;
  358.       ((Observable)this).setChanged();
  359.       ((Observable)this).notifyObservers(var2);
  360.    }
  361.  
  362.    public void newClass(String var1) {
  363.       this.currentClassSelector = -1;
  364.       this.changes = new boolean[MaxChanges];
  365.       this.changes[ClassLoad] = true;
  366.       boolean[] var2 = this.changes;
  367.       ((Observable)this).setChanged();
  368.       ((Observable)this).notifyObservers(var2);
  369.       this.setCurrentClassName(var1);
  370.       this.setCurrentClass("/**\n * \n */\nclass " + var1 + "  {\n/**\n * \n */\n" + var1 + "  (  ) {\n\t\n\t}\n}\n");
  371.       this.textState = "Class";
  372.       this.currentOutput = null;
  373.       this.lastModified = 0L;
  374.    }
  375.  
  376.    public void newMethod(String var1) {
  377.       this.creatingNewMethod = true;
  378.       this.currentMethodName = null;
  379.       String var2 = "";
  380.       if (var1.indexOf(32) == -1) {
  381.          var2 = "void ";
  382.       }
  383.  
  384.       this.setCurrentMethod("/**\n * \n */\n" + var2 + var1 + "  (  ) {\n\t\n\t}\n");
  385.       this.currentMethodSelector = -1;
  386.       this.textState = "Method";
  387.       this.currentOutput = null;
  388.    }
  389.  
  390.    public String systemTitle() {
  391.       return AboutBrowser.systemName;
  392.    }
  393.  
  394.    public String currentClassName() {
  395.       return this.currentClassName;
  396.    }
  397.  
  398.    public void setCurrentClassName(String var1) {
  399.       this.currentClassName = this.currentPackageName + "." + var1;
  400.    }
  401.  
  402.    public void setCurrentMethodName(String var1) {
  403.       this.currentMethodName = var1;
  404.    }
  405.  
  406.    public boolean grep(String var1, int var2) {
  407.       String[] var3 = new String[1000];
  408.       String[] var4 = new String[5000];
  409.       int var5 = 0;
  410.       int var6 = 0;
  411.       Process var7 = null;
  412.       String[] var8 = new String[]{null, "-n", null, this.GetRootDir() + BrowserFileLoader.correctFileName(this.currentPackageName()) + System.getProperty("file.separator") + "*.java"};
  413.       if (Math.abs(var2) == 1) {
  414.          var8[2] = BrowserOptions.getRESenders(var1);
  415.       } else if (Math.abs(var2) == 2) {
  416.          var8[2] = BrowserOptions.getREReceivers(var1);
  417.       } else if (Math.abs(var2) == 3) {
  418.          var8[2] = BrowserOptions.getREReferences(var1);
  419.       } else if (var2 == 4) {
  420.          var8[2] = BrowserOptions.getREExtenders("class", "extends", var1);
  421.       } else if (var2 == 5) {
  422.          var8[2] = BrowserOptions.getREImplementors("class", "implements", var1);
  423.       }
  424.  
  425.       label171: {
  426.          label166: {
  427.             boolean var10000;
  428.             if (System.getProperty("os.name").equals("Windows 95")) {
  429.                var10000 = true;
  430.             } else {
  431.                if (!System.getProperty("os.name").equals("Windows NT")) {
  432.                   break label166;
  433.                }
  434.  
  435.                var10000 = true;
  436.             }
  437.  
  438.             if (var10000) {
  439.                var8[0] = BrowserOptions.grep.trim();
  440.                break label171;
  441.             }
  442.          }
  443.  
  444.          var8[0] = "grep";
  445.  
  446.          try {
  447.             String var9;
  448.             try {
  449.                var9 = BrowserOptions.grep.trim().substring(1 + BrowserOptions.grep.trim().indexOf(32));
  450.             } catch (StringIndexOutOfBoundsException var17) {
  451.                var9 = "grep.s";
  452.                System.err.println(BrowserOptions.messages.getString("GrepOption") + " " + var17);
  453.             }
  454.  
  455.             DataOutputStream var10 = new DataOutputStream(new FileOutputStream(var9));
  456.             var10.writeBytes(var8[0] + " ");
  457.             var10.writeBytes(var8[1] + " ");
  458.             var10.writeBytes(var8[2] + " ");
  459.             var10.writeBytes(var8[3] + "\n");
  460.             ((FilterOutputStream)var10).close();
  461.          } catch (FileNotFoundException var18) {
  462.             System.err.println(BrowserOptions.messages.getString("GrepFile") + " " + var18);
  463.          } catch (IOException var19) {
  464.             System.err.println(BrowserOptions.messages.getString("GrepFile") + " " + var19);
  465.          }
  466.       }
  467.  
  468.       Runtime var22 = Runtime.getRuntime();
  469.  
  470.       try {
  471.          label156: {
  472.             label155: {
  473.                boolean var28;
  474.                if (System.getProperty("os.name").equals("Windows 95")) {
  475.                   var28 = true;
  476.                } else {
  477.                   if (!System.getProperty("os.name").equals("Windows NT")) {
  478.                      break label155;
  479.                   }
  480.  
  481.                   var28 = true;
  482.                }
  483.  
  484.                if (var28) {
  485.                   var7 = var22.exec(var8);
  486.                   break label156;
  487.                }
  488.             }
  489.  
  490.             var7 = var22.exec(BrowserOptions.grep.trim());
  491.          }
  492.       } catch (IOException var21) {
  493.          System.out.println(BrowserOptions.messages.getString("IOExceptionOnG") + " " + var21);
  494.          System.out.println("Process: " + var7);
  495.       }
  496.  
  497.       DataInputStream var23 = new DataInputStream(var7.getInputStream());
  498.  
  499.       try {
  500.          while(true) {
  501.             String var11 = var23.readLine();
  502.             if (var11 == null) {
  503.                ((FilterInputStream)var23).close();
  504.                break;
  505.             }
  506.  
  507.             try {
  508.                var3[var5++] = this.parseSearchResult(var11, true);
  509.                var4[var6++] = this.parseSearchResult(var11, false);
  510.             } catch (ArrayIndexOutOfBoundsException var16) {
  511.                System.err.println(BrowserOptions.messages.getString("MaximumRes"));
  512.             }
  513.  
  514.             if (var5 > 0 && var3[var5] == var3[var5 - 1]) {
  515.                --var5;
  516.             }
  517.          }
  518.       } catch (IOException var20) {
  519.          System.out.println(BrowserOptions.messages.getString("ErrorOnGre"));
  520.       }
  521.  
  522.       if (var5 == 0) {
  523.          return false;
  524.       } else {
  525.          String[] var24 = new String[var5];
  526.          String[] var12 = new String[var6];
  527.          if (var2 < 4) {
  528.             for(int var13 = 0; var13 < var5; ++var13) {
  529.                var24[var13] = var3[var13];
  530.             }
  531.          } else {
  532.             int var14 = 0;
  533.  
  534.             for(int var25 = 0; var25 < var5; ++var25) {
  535.                for(int var15 = 0; var15 < this.classList.length; ++var15) {
  536.                   if (var3[var25].equalsIgnoreCase(this.classNamePart(this.classList[var15]))) {
  537.                      var24[var14++] = this.classList[var15];
  538.                      break;
  539.                   }
  540.                }
  541.             }
  542.          }
  543.  
  544.          for(int var26 = 0; var26 < var6; ++var26) {
  545.             var12[var26] = var4[var26];
  546.          }
  547.  
  548.          String[] var27 = new String[]{this.currentPackageName()};
  549.          if (var2 == 1) {
  550.             new BrowserView(new BrowserModel(this.rootDir, var27, var24, var12), BrowserOptions.messages.getString("SendersOf") + " " + var1, true);
  551.          } else if (var2 == 2) {
  552.             new BrowserView(new BrowserModel(this.rootDir, var27, var24, var12), BrowserOptions.messages.getString("ReceiversO") + " " + var1, true);
  553.          } else if (var2 == 3) {
  554.             new BrowserView(new BrowserModel(this.rootDir, var27, var24, var12), BrowserOptions.messages.getString("ReferencesT") + " " + var1, true);
  555.          } else if (var2 == 4) {
  556.             new BrowserView(new BrowserModel(this.rootDir, var24), BrowserOptions.messages.getString("ExtendersO") + " " + var1, false);
  557.          } else if (var2 == 5) {
  558.             new BrowserView(new BrowserModel(this.rootDir, var24), BrowserOptions.messages.getString("Implementor") + " " + var1, false);
  559.          } else if (var2 == -1 || var2 == -2 || var2 == -3) {
  560.             this.packageList = var27;
  561.             this.classFilter = var24;
  562.             this.methodFilter = var12;
  563.             this.init(this.rootDir);
  564.          }
  565.  
  566.          return true;
  567.       }
  568.    }
  569.  
  570.    private String[] getInterface(String var1, String var2, String var3) {
  571.       String[] var4;
  572.       int var5;
  573.       String[] var6;
  574.       Process var7;
  575.       label91: {
  576.          label87: {
  577.             var4 = new String[16];
  578.             var5 = 0;
  579.             var6 = new String[]{BrowserOptions.grep.trim(), "-n", BrowserOptions.getREInterfaces(var1, var3), var2 + System.getProperty("file.separator") + var1 + ".java"};
  580.             var7 = null;
  581.             boolean var10000;
  582.             if (System.getProperty("os.name").equals("Windows 95")) {
  583.                var10000 = true;
  584.             } else {
  585.                if (!System.getProperty("os.name").equals("Windows NT")) {
  586.                   break label87;
  587.                }
  588.  
  589.                var10000 = true;
  590.             }
  591.  
  592.             if (var10000) {
  593.                var6[0] = BrowserOptions.grep.trim();
  594.                break label91;
  595.             }
  596.          }
  597.  
  598.          var6[0] = "grep";
  599.  
  600.          try {
  601.             String var8;
  602.             try {
  603.                var8 = BrowserOptions.grep.trim().substring(1 + BrowserOptions.grep.trim().indexOf(32));
  604.             } catch (StringIndexOutOfBoundsException var11) {
  605.                var8 = "grep.s";
  606.                System.err.println(BrowserOptions.messages.getString("GrepOption") + " " + var11);
  607.             }
  608.  
  609.             DataOutputStream var9 = new DataOutputStream(new FileOutputStream(var8));
  610.             var9.writeBytes(var6[0] + " ");
  611.             var9.writeBytes(var6[1] + " ");
  612.             var9.writeBytes(var6[2] + " ");
  613.             var9.writeBytes(var6[3] + "\n");
  614.             ((FilterOutputStream)var9).close();
  615.          } catch (FileNotFoundException var12) {
  616.             System.err.println(BrowserOptions.messages.getString("GrepFile") + " " + var12);
  617.          } catch (IOException var13) {
  618.             System.err.println(BrowserOptions.messages.getString("GrepFile") + " " + var13);
  619.          }
  620.       }
  621.  
  622.       Runtime var16 = Runtime.getRuntime();
  623.  
  624.       try {
  625.          label77: {
  626.             label76: {
  627.                boolean var18;
  628.                if (System.getProperty("os.name").equals("Windows 95")) {
  629.                   var18 = true;
  630.                } else {
  631.                   if (!System.getProperty("os.name").equals("Windows NT")) {
  632.                      break label76;
  633.                   }
  634.  
  635.                   var18 = true;
  636.                }
  637.  
  638.                if (var18) {
  639.                   var7 = var16.exec(var6);
  640.                   break label77;
  641.                }
  642.             }
  643.  
  644.             var7 = var16.exec(BrowserOptions.grep.trim());
  645.          }
  646.       } catch (IOException var15) {
  647.          System.out.println(BrowserOptions.messages.getString("IOExceptionOnGr2"));
  648.       }
  649.  
  650.       DataInputStream var17 = new DataInputStream(var7.getInputStream());
  651.       StreamTokenizer var10 = new StreamTokenizer(var17);
  652.       var10.ordinaryChar(47);
  653.       var10.slashStarComments(true);
  654.       var10.slashSlashComments(true);
  655.  
  656.       try {
  657.          while(var10.nextToken() != -1) {
  658.             switch ((char)var10.ttype) {
  659.                case '∩┐╜':
  660.                   if (var10.sval.equalsIgnoreCase(var3)) {
  661.                      while(var10.nextToken() != -1) {
  662.                         if ((char)var10.ttype == '{') {
  663.                            return var4;
  664.                         }
  665.  
  666.                         if ((char)var10.ttype == '∩┐╜') {
  667.                            var4[var5++] = var10.sval;
  668.                         }
  669.                      }
  670.                   }
  671.             }
  672.          }
  673.       } catch (IOException var14) {
  674.       }
  675.  
  676.       return var4;
  677.    }
  678.  
  679.    private String getClassParent(String var1, String var2, String var3) {
  680.       String[] var4;
  681.       Process var5;
  682.       label81: {
  683.          label77: {
  684.             var4 = new String[]{BrowserOptions.grep.trim(), "-n", BrowserOptions.getREHierarchy(var1, var3), var2 + System.getProperty("file.separator") + var1 + ".java"};
  685.             var5 = null;
  686.             boolean var10000;
  687.             if (System.getProperty("os.name").equals("Windows 95")) {
  688.                var10000 = true;
  689.             } else {
  690.                if (!System.getProperty("os.name").equals("Windows NT")) {
  691.                   break label77;
  692.                }
  693.  
  694.                var10000 = true;
  695.             }
  696.  
  697.             if (var10000) {
  698.                var4[0] = BrowserOptions.grep.trim();
  699.                break label81;
  700.             }
  701.          }
  702.  
  703.          var4[0] = "grep";
  704.  
  705.          try {
  706.             String var6;
  707.             try {
  708.                var6 = BrowserOptions.grep.trim().substring(1 + BrowserOptions.grep.trim().indexOf(32));
  709.             } catch (StringIndexOutOfBoundsException var9) {
  710.                var6 = "grep.s";
  711.                System.err.println(BrowserOptions.messages.getString("GrepOption") + " " + var9);
  712.             }
  713.  
  714.             DataOutputStream var7 = new DataOutputStream(new FileOutputStream(var6));
  715.             var7.writeBytes(var4[0] + " ");
  716.             var7.writeBytes(var4[1] + " ");
  717.             var7.writeBytes(var4[2] + " ");
  718.             var7.writeBytes(var4[3] + "\n");
  719.             ((FilterOutputStream)var7).close();
  720.          } catch (FileNotFoundException var10) {
  721.             System.err.println(BrowserOptions.messages.getString("GrepFile") + " " + var10);
  722.          } catch (IOException var11) {
  723.             System.err.println(BrowserOptions.messages.getString("GrepFile") + " " + var11);
  724.          }
  725.       }
  726.  
  727.       Runtime var14 = Runtime.getRuntime();
  728.  
  729.       try {
  730.          label67: {
  731.             label66: {
  732.                boolean var16;
  733.                if (System.getProperty("os.name").equals("Windows 95")) {
  734.                   var16 = true;
  735.                } else {
  736.                   if (!System.getProperty("os.name").equals("Windows NT")) {
  737.                      break label66;
  738.                   }
  739.  
  740.                   var16 = true;
  741.                }
  742.  
  743.                if (var16) {
  744.                   var5 = var14.exec(var4);
  745.                   break label67;
  746.                }
  747.             }
  748.  
  749.             var5 = var14.exec(BrowserOptions.grep.trim());
  750.          }
  751.       } catch (IOException var13) {
  752.          System.out.println(BrowserOptions.messages.getString("IOExceptionOnGr2"));
  753.       }
  754.  
  755.       DataInputStream var15 = new DataInputStream(var5.getInputStream());
  756.       StreamTokenizer var8 = new StreamTokenizer(var15);
  757.       var8.ordinaryChar(47);
  758.       var8.slashStarComments(true);
  759.       var8.slashSlashComments(true);
  760.  
  761.       try {
  762.          while(var8.nextToken() != -1) {
  763.             switch ((char)var8.ttype) {
  764.                case '∩┐╜':
  765.                   if (var8.sval.equalsIgnoreCase(var3)) {
  766.                      var8.nextToken();
  767.                      if ((char)var8.ttype == '∩┐╜') {
  768.                         return var8.sval;
  769.                      }
  770.                   }
  771.             }
  772.          }
  773.       } catch (IOException var12) {
  774.       }
  775.  
  776.       return "";
  777.    }
  778.  
  779.    public String classNamePart() {
  780.       return this.minorClassName(this.currentClassName.substring(this.currentClassName.lastIndexOf(46) + 1));
  781.    }
  782.  
  783.    public String classNamePart(String var1) {
  784.       return this.minorClassName(var1.substring(var1.lastIndexOf(46) + 1));
  785.    }
  786.  
  787.    public void hierarchyBrowser(int var1) {
  788.       String[] var2 = new String[100];
  789.       String[] var3 = new String[100];
  790.       int var4 = 0;
  791.       int var5 = 0;
  792.       String var6 = null;
  793.       String var7 = null;
  794.       if (var1 == 1) {
  795.          var6 = "extends";
  796.          var7 = BrowserOptions.messages.getString("HierarchyO") + " ";
  797.       }
  798.  
  799.       if (var1 == 2) {
  800.          var6 = "implements";
  801.          var7 = BrowserOptions.messages.getString("InterfacesO") + " ";
  802.       }
  803.  
  804.       var3[var5++] = this.currentClassName;
  805.       var2[var4++] = this.currentPackageName();
  806.       Object var8 = null;
  807.       String var17 = this.getClassParent(this.classNamePart(), this.GetRootDir() + BrowserFileLoader.correctFileName(this.currentPackageName()), var6);
  808.       String[] var9 = this.fileLoader.ListDirectory();
  809.  
  810.       while(var17 != "") {
  811.          boolean var10 = true;
  812.  
  813.          for(int var11 = 0; var11 < var9.length && var10; ++var11) {
  814.             String[] var12 = this.fileLoader.ListFiles(this.GetRootDir() + BrowserFileLoader.correctFileName(var9[var11]));
  815.  
  816.             for(int var13 = 0; var13 < var12.length && var10; ++var13) {
  817.                if (var12[var13].indexOf(var17) != -1) {
  818.                   var3[var5++] = var9[var11] + "." + var17;
  819.  
  820.                   int var14;
  821.                   for(var14 = 0; var14 < var4 && !var2[var14].equals(var9[var11]); ++var14) {
  822.                   }
  823.  
  824.                   if (var14 == var4) {
  825.                      var2[var4++] = var9[var11];
  826.                   }
  827.  
  828.                   var17 = this.getClassParent(var17, this.GetRootDir() + BrowserFileLoader.correctFileName(var9[var11]), var6);
  829.                   var10 = false;
  830.                }
  831.             }
  832.          }
  833.       }
  834.  
  835.       String[] var18 = new String[var5];
  836.       int var19 = 0;
  837.  
  838.       for(int var20 = var5 - 1; var19 < var5; --var20) {
  839.          var18[var20] = var3[var19];
  840.          ++var19;
  841.       }
  842.  
  843.       new BrowserView(new BrowserModel(this.rootDir, var18), var7 + this.classNamePart(this.currentClassName), false);
  844.    }
  845.  
  846.    public boolean matchClass(String var1) {
  847.       if (this.classFilter == null) {
  848.          return true;
  849.       } else {
  850.          String var3 = this.majorClassName(var1.substring(var1.lastIndexOf(46) + 1));
  851.  
  852.          for(int var2 = 0; var2 < this.classFilter.length; ++var2) {
  853.             if (var3.equalsIgnoreCase(this.classFilter[var2])) {
  854.                return true;
  855.             }
  856.          }
  857.  
  858.          return false;
  859.       }
  860.    }
  861.  
  862.    private String parseSearchResult(String var1, boolean var2) {
  863.       String var3 = var1.substring(0, var1.indexOf(".java"));
  864.       String var4 = var3.substring(var3.lastIndexOf(BrowserOptions.delimiterChar()) + 1);
  865.       if (var2) {
  866.          return var4;
  867.       } else {
  868.          String var5 = var1.substring(var1.indexOf(58, 2) + 1);
  869.          return var4 + " " + var5.substring(0, var5.indexOf(58));
  870.       }
  871.    }
  872.  
  873.    public boolean matchMethod(String var1, MethodRecord var2) {
  874.       if (this.methodFilter == null) {
  875.          return true;
  876.       } else {
  877.          String var4 = this.majorClassName().substring(this.majorClassName().lastIndexOf(46) + 1);
  878.  
  879.          for(int var3 = 0; var3 < this.methodFilter.length; ++var3) {
  880.             String var5 = this.methodFilter[var3].substring(0, this.methodFilter[var3].indexOf(32));
  881.             int var6 = Integer.parseInt(this.methodFilter[var3].substring(this.methodFilter[var3].indexOf(32) + 1));
  882.             if (var4.equalsIgnoreCase(var5) && var6 >= var2.startRow() && var6 <= var2.endRow()) {
  883.                return true;
  884.             }
  885.          }
  886.  
  887.          return false;
  888.       }
  889.    }
  890.  
  891.    public String GetRootDir() {
  892.       if (this.rootDir == null) {
  893.          this.rootDir = BrowserOptions.userDir;
  894.          if (this.rootDir.equals("")) {
  895.             this.rootDir = System.getProperty("user.dir");
  896.          }
  897.       }
  898.  
  899.       return this.rootDir;
  900.    }
  901.  
  902.    private void tabber(int var1, StringWriter var2) {
  903.       byte var3 = 32;
  904.       int var4 = BrowserOptions.spaces;
  905.       if (var4 == 0) {
  906.          var4 = 1;
  907.          var3 = 9;
  908.       } else {
  909.          var3 = 32;
  910.       }
  911.  
  912.       for(int var6 = 0; var6 < var1; ++var6) {
  913.          for(int var5 = 0; var5 < var4; ++var5) {
  914.             var2.write(var3);
  915.          }
  916.       }
  917.  
  918.    }
  919.  
  920.    public String format(String var1) {
  921.       StringReader var2 = new StringReader(var1);
  922.       StringWriter var3 = new StringWriter();
  923.       int var5 = 0;
  924.       int var6 = 0;
  925.       boolean var7 = true;
  926.       boolean var8 = false;
  927.       boolean var9 = false;
  928.       boolean var10 = false;
  929.       boolean var11 = false;
  930.       boolean var12 = false;
  931.       boolean var13 = false;
  932.       boolean var14 = false;
  933.  
  934.       int var4;
  935.       try {
  936.          for(; (var4 = var2.read()) != -1; var5 = var4) {
  937.             if (var4 == 10 && var11) {
  938.                var11 = false;
  939.                var10 = false;
  940.                var7 = true;
  941.                var3.write(var4);
  942.             } else if (var11) {
  943.                var3.write(var4);
  944.             } else if (var13 && var5 == 42 && var4 == 47) {
  945.                var13 = false;
  946.                var3.write(var4);
  947.             } else if (var13) {
  948.                var3.write(var4);
  949.             } else if (var14) {
  950.                var14 = false;
  951.                var3.write(var4);
  952.             } else if (var4 == BrowserOptions.delimiterChar()) {
  953.                var14 = true;
  954.                var3.write(var4);
  955.             } else if (var4 == 39 && var8 && !var14) {
  956.                var8 = false;
  957.                var3.write(var4);
  958.             } else if (var4 == 34 && var9 && !var14) {
  959.                var9 = false;
  960.                var3.write(var4);
  961.             } else if (!var8 && !var9) {
  962.                if (var4 == 10) {
  963.                   var7 = true;
  964.                   var3.write(var4);
  965.                } else if (var4 == 123) {
  966.                   ++var6;
  967.                   if (var7) {
  968.                      var7 = false;
  969.                      this.tabber(var6, var3);
  970.                   }
  971.  
  972.                   var3.write(var4);
  973.                } else if ((var4 != 32 || !var7) && (var4 != 9 || !var7)) {
  974.                   if (var7) {
  975.                      var7 = false;
  976.                      this.tabber(var6, var3);
  977.                   }
  978.  
  979.                   if (var4 == 39 && !var14) {
  980.                      var8 = true;
  981.                   }
  982.  
  983.                   if (var4 == 34 && !var14) {
  984.                      var9 = true;
  985.                   }
  986.  
  987.                   if (var4 == 125) {
  988.                      --var6;
  989.                   }
  990.  
  991.                   if (var10 && var4 == 47) {
  992.                      var11 = true;
  993.                   }
  994.  
  995.                   if (var10 && !var11) {
  996.                      var10 = false;
  997.                   }
  998.  
  999.                   if (var4 == 47) {
  1000.                      var10 = true;
  1001.                   }
  1002.  
  1003.                   if (var12 && var4 == 42) {
  1004.                      var13 = true;
  1005.                   }
  1006.  
  1007.                   if (var12 && !var13) {
  1008.                      var12 = false;
  1009.                   }
  1010.  
  1011.                   if (var4 == 47 && !var13) {
  1012.                      var12 = true;
  1013.                   }
  1014.  
  1015.                   var3.write(var4);
  1016.                }
  1017.             } else {
  1018.                var3.write(var4);
  1019.             }
  1020.          }
  1021.       } catch (IOException var15) {
  1022.          System.err.println(BrowserOptions.messages.getString("IOFailedOn"));
  1023.       }
  1024.  
  1025.       return var3.toString();
  1026.    }
  1027.  
  1028.    public int currentMethodViewSelector() {
  1029.       for(int var1 = 0; var1 < this.methodRef.length; ++var1) {
  1030.          if (this.methodRef[var1] == this.currentMethodSelector) {
  1031.             if (this.currentMethodName == null) {
  1032.                this.currentMethodName = this.currentMethodName();
  1033.             }
  1034.  
  1035.             return var1;
  1036.          }
  1037.       }
  1038.  
  1039.       return -1;
  1040.    }
  1041.  
  1042.    public int currentClassViewSelector() {
  1043.       for(int var1 = 0; var1 < this.classRef.length; ++var1) {
  1044.          if (this.classRef[var1] == this.currentClassSelector) {
  1045.             return var1;
  1046.          }
  1047.       }
  1048.  
  1049.       return -1;
  1050.    }
  1051.  
  1052.    public boolean save(String var1) {
  1053.       boolean var2 = false;
  1054.       String var3 = null;
  1055.       long var4 = this.fileLoader.lastModified(this.majorClassName(this.currentClassName));
  1056.       if (var4 != this.lastModified) {
  1057.          return false;
  1058.       } else {
  1059.          if (this.textState == "Method") {
  1060.             this.creatingNewMethod = false;
  1061.             this.fileLoader.saveMethod(this.majorClassName(this.currentClassName), this.listMethod, this.currentMethodSelector, var1);
  1062.             var3 = this.currentMethodName;
  1063.             if (this.currentMethodSelector == -1) {
  1064.                this.newMethodCreated = true;
  1065.             }
  1066.  
  1067.             if (var1.equals("")) {
  1068.                this.currentMethodSelector = -1;
  1069.             }
  1070.          } else if (this.textState == "Class") {
  1071.             this.fileLoader.saveClassDef(this.currentClassName, this.currentClassSelector == -1, var1);
  1072.             if (this.currentClassSelector == -1) {
  1073.                var2 = true;
  1074.                this.newClassName = this.currentClassName;
  1075.                this.fileLoader.loadPackage(this.GetRootDir(), this.packageList[this.currentPackageSelector]);
  1076.             }
  1077.  
  1078.             this.currentMethodSelector = -1;
  1079.          }
  1080.  
  1081.          this.saveOperation = true;
  1082.          String var6 = this.currentClassName;
  1083.          this.lastModified = this.fileLoader.lastModified(this.majorClassName(var6));
  1084.          this.fileLoader.loadClass(var6, true);
  1085.          this.saveOperation = false;
  1086.          if (var3 != null) {
  1087.             this.currentMethodName = var3;
  1088.             this.changes = new boolean[MaxChanges];
  1089.             boolean[] var7 = this.changes;
  1090.             ((Observable)this).setChanged();
  1091.             ((Observable)this).notifyObservers(var7);
  1092.          }
  1093.  
  1094.          if (var2) {
  1095.             this.changes = new boolean[MaxChanges];
  1096.             this.changes[OutputLoad] = true;
  1097.             boolean[] var8 = this.changes;
  1098.             ((Observable)this).setChanged();
  1099.             ((Observable)this).notifyObservers(var8);
  1100.          }
  1101.  
  1102.          BrowserRegistry.register.changing(this, this.majorClassName(this.currentClassName));
  1103.          return true;
  1104.       }
  1105.    }
  1106.  
  1107.    boolean classBrowser(String var1) {
  1108.       String[] var2 = new String[1];
  1109.       String var3;
  1110.       if (var1 != null && !var1.equals("")) {
  1111.          var3 = this.currentPackageName() + "." + var1;
  1112.          String[] var5 = this.fileLoader.getClasses(this.GetRootDir(), this.currentPackageName());
  1113.  
  1114.          int var4;
  1115.          for(var4 = 0; var4 < var5.length && !var5[var4].equals(var3); ++var4) {
  1116.          }
  1117.  
  1118.          if (var4 == var5.length) {
  1119.             return false;
  1120.          }
  1121.       } else {
  1122.          var3 = this.currentClassName;
  1123.       }
  1124.  
  1125.       var2[0] = var3;
  1126.       new BrowserView(new BrowserModel(this.rootDir, var2), "Class/Interface " + this.classNamePart(var3), false);
  1127.       return true;
  1128.    }
  1129.  
  1130.    private void loadClass(String var1, boolean var2) {
  1131.       this.lastModified = this.fileLoader.lastModified(this.majorClassName(var1));
  1132.       this.fileLoader.loadClass(var1, var2);
  1133.    }
  1134.  
  1135.    String currentPackageName() {
  1136.       return (this.currentPackageName == null || this.currentPackageName == "") && this.currentClassName != null ? this.currentClassName.substring(0, this.currentClassName.lastIndexOf(46)) : this.currentPackageName;
  1137.    }
  1138.  
  1139.    String currentMethodName() {
  1140.       return this.currentMethodSelector != -1 ? this.listMethod[this.currentMethodSelector].methodName() : "";
  1141.    }
  1142.  
  1143.    boolean removeMethod() {
  1144.       boolean var1 = false;
  1145.       if (var1 = this.save("")) {
  1146.          this.currentMethodName = null;
  1147.          this.textState = "Class";
  1148.          this.currentOutput = null;
  1149.          this.changes = new boolean[MaxChanges];
  1150.          this.changes[OutputLoad] = true;
  1151.          this.changes[MethodLoad] = true;
  1152.          boolean[] var2 = this.changes;
  1153.          ((Observable)this).setChanged();
  1154.          ((Observable)this).notifyObservers(var2);
  1155.       }
  1156.  
  1157.       return var1;
  1158.    }
  1159.  
  1160.    void init(String var1) {
  1161.       if (var1 != null) {
  1162.          this.rootDir = var1;
  1163.       }
  1164.  
  1165.       this.fileLoader = new BrowserFileLoader(this.GetRootDir());
  1166.       this.fileLoader.addObserver(this);
  1167.       BrowserRegistry.register.addObserver(this);
  1168.    }
  1169.  
  1170.    public void update(Observable var1, Object var2) {
  1171.       if (var1 instanceof BrowserRegistry) {
  1172.          String var3 = (String)var2;
  1173.          BrowserRegistry var4 = (BrowserRegistry)var1;
  1174.          if (var2 == null) {
  1175.             return;
  1176.          }
  1177.  
  1178.          if (var4.initiator() == this) {
  1179.             return;
  1180.          }
  1181.  
  1182.          if (this.currentClassName != null && this.majorClassName(this.currentClassName).equals(var3)) {
  1183.             this.changes = new boolean[MaxChanges];
  1184.             this.changes[AnyEdits] = true;
  1185.             if (this.isMethodFilterBrowser()) {
  1186.                this.changes[OutOfDate] = true;
  1187.             }
  1188.  
  1189.             boolean[] var5 = this.changes;
  1190.             ((Observable)this).setChanged();
  1191.             ((Observable)this).notifyObservers(var5);
  1192.             return;
  1193.          }
  1194.       } else if (var1 instanceof BrowserFileLoader) {
  1195.          boolean[] var6 = (boolean[])var2;
  1196.          if (var2 == null) {
  1197.             return;
  1198.          }
  1199.  
  1200.          if (var6[BrowserFileLoader.PackageLoad]) {
  1201.             this.changes = new boolean[MaxChanges];
  1202.             this.changes[PackageList] = true;
  1203.             boolean[] var7 = this.changes;
  1204.             ((Observable)this).setChanged();
  1205.             ((Observable)this).notifyObservers(var7);
  1206.          }
  1207.  
  1208.          if (var6[BrowserFileLoader.ClassLoad]) {
  1209.             this.updateClassList();
  1210.          }
  1211.  
  1212.          if (var6[BrowserFileLoader.MethodLoad]) {
  1213.             this.changes = new boolean[MaxChanges];
  1214.             this.changes[MethodList] = true;
  1215.             boolean[] var8 = this.changes;
  1216.             ((Observable)this).setChanged();
  1217.             ((Observable)this).notifyObservers(var8);
  1218.          }
  1219.       }
  1220.  
  1221.    }
  1222.  
  1223.    void reload() {
  1224.       this.changes = new boolean[MaxChanges];
  1225.       this.changes[OutputLoad] = true;
  1226.       this.changes[MethodLoad] = true;
  1227.       if (this.textState == "Method") {
  1228.          this.changes[SelectMethod] = true;
  1229.       }
  1230.  
  1231.       boolean[] var1 = this.changes;
  1232.       ((Observable)this).setChanged();
  1233.       ((Observable)this).notifyObservers(var1);
  1234.    }
  1235.  
  1236.    public void finalization() {
  1237.       BrowserRegistry.register.deleteObserver(this);
  1238.    }
  1239.  
  1240.    public void interfacesBrowser(int var1) {
  1241.       String[] var2 = new String[100];
  1242.       String[] var3 = new String[100];
  1243.       int var4 = 0;
  1244.       int var5 = 0;
  1245.       String var6 = null;
  1246.       String var7 = null;
  1247.       if (var1 == 1) {
  1248.          var6 = "extends";
  1249.          var7 = BrowserOptions.messages.getString("HierarchyO") + " ";
  1250.       }
  1251.  
  1252.       if (var1 == 2) {
  1253.          var6 = "implements";
  1254.          var7 = BrowserOptions.messages.getString("InterfacesO") + " ";
  1255.       }
  1256.  
  1257.       var3[var5++] = this.currentClassName;
  1258.       var2[var4++] = this.currentPackageName();
  1259.       String[] var8 = this.getInterface(this.classNamePart(), this.GetRootDir() + BrowserFileLoader.correctFileName(this.currentPackageName()), var6);
  1260.       String[] var9 = this.fileLoader.ListDirectory();
  1261.  
  1262.       for(int var10 = 0; var10 < var8.length && var8[var10] != null; ++var10) {
  1263.          boolean var11 = true;
  1264.  
  1265.          for(int var12 = 0; var12 < var9.length && var11; ++var12) {
  1266.             String[] var13 = this.fileLoader.ListFiles(this.GetRootDir() + BrowserFileLoader.correctFileName(var9[var12]));
  1267.  
  1268.             for(int var14 = 0; var14 < var13.length && var11; ++var14) {
  1269.                if (var13[var14].indexOf(var8[var10]) != -1) {
  1270.                   var3[var5++] = var9[var12] + "." + var8[var10];
  1271.  
  1272.                   int var15;
  1273.                   for(var15 = 0; var15 < var4 && !var2[var15].equals(var9[var12]); ++var15) {
  1274.                   }
  1275.  
  1276.                   if (var15 == var4) {
  1277.                      var2[var4++] = var9[var12];
  1278.                   }
  1279.  
  1280.                   var11 = false;
  1281.                }
  1282.             }
  1283.          }
  1284.       }
  1285.  
  1286.       String[] var18 = new String[var5];
  1287.       int var19 = 0;
  1288.  
  1289.       for(int var20 = var5 - 1; var19 < var5; --var20) {
  1290.          var18[var20] = var3[var19];
  1291.          ++var19;
  1292.       }
  1293.  
  1294.       new BrowserView(new BrowserModel(this.rootDir, var18), var7 + this.classNamePart(this.currentClassName), false);
  1295.    }
  1296.  
  1297.    void reinit() {
  1298.       if (this.packageList != null) {
  1299.          this.rootDir = null;
  1300.          this.fileLoader = new BrowserFileLoader(this.GetRootDir());
  1301.          this.fileLoader.addObserver(this);
  1302.          this.packageList = this.fileLoader.ListDirectory();
  1303.          String[] var1 = this.packageList;
  1304.          QSortAlgorithm.QuickSort(var1, 0, var1.length - 1);
  1305.          this.currentPackageName = null;
  1306.          this.changes = new boolean[MaxChanges];
  1307.          this.changes[PackageLoad] = true;
  1308.          boolean[] var2 = this.changes;
  1309.          ((Observable)this).setChanged();
  1310.          ((Observable)this).notifyObservers(var2);
  1311.       }
  1312.    }
  1313.  
  1314.    void reloadNoOutput() {
  1315.       this.changes = new boolean[MaxChanges];
  1316.       this.changes[MethodLoad] = true;
  1317.       if (this.textState == "Method") {
  1318.          this.changes[SelectMethod] = true;
  1319.       }
  1320.  
  1321.       boolean[] var1 = this.changes;
  1322.       ((Observable)this).setChanged();
  1323.       ((Observable)this).notifyObservers(var1);
  1324.    }
  1325.  
  1326.    public void newInterface(String var1) {
  1327.       this.changes = new boolean[MaxChanges];
  1328.       this.changes[ClassLoad] = true;
  1329.       boolean[] var2 = this.changes;
  1330.       ((Observable)this).setChanged();
  1331.       ((Observable)this).notifyObservers(var2);
  1332.       this.setCurrentClassName(var1);
  1333.       this.setCurrentClass("/**\n * \n */\ninterface " + var1 + "  {\n}\n");
  1334.       this.textState = "Class";
  1335.       this.currentClassSelector = -1;
  1336.       this.currentOutput = null;
  1337.       this.lastModified = 0L;
  1338.    }
  1339.  
  1340.    public boolean removeClass() {
  1341.       boolean var1;
  1342.       if (this.isMajorEqualMinor()) {
  1343.          var1 = this.fileLoader.removeClassFile(this.currentClassName());
  1344.       } else {
  1345.          var1 = this.fileLoader.removeInnerClass(this.currentClassName());
  1346.       }
  1347.  
  1348.       BrowserRegistry.register.changing(this, this.majorClassName(this.currentClassName));
  1349.       if (var1) {
  1350.          this.textState = "";
  1351.          this.currentClassName = null;
  1352.          this.currentClassSelector = -1;
  1353.          this.changes = new boolean[MaxChanges];
  1354.          this.changes[ClassLoad] = true;
  1355.          boolean[] var2 = this.changes;
  1356.          ((Observable)this).setChanged();
  1357.          ((Observable)this).notifyObservers(var2);
  1358.       }
  1359.  
  1360.       return var1;
  1361.    }
  1362.  
  1363.    boolean renameMethod(String var1, String var2) {
  1364.       boolean var3 = false;
  1365.       if (var3 = this.save(var2)) {
  1366.          this.textState = "Method";
  1367.          this.currentOutput = null;
  1368.          this.changes = new boolean[MaxChanges];
  1369.          this.changes[MethodLoad] = true;
  1370.          boolean[] var4 = this.changes;
  1371.          ((Observable)this).setChanged();
  1372.          ((Observable)this).notifyObservers(var4);
  1373.          this.currentMethodName = var1;
  1374.          this.changes = new boolean[MaxChanges];
  1375.          var4 = this.changes;
  1376.          ((Observable)this).setChanged();
  1377.          ((Observable)this).notifyObservers(var4);
  1378.       }
  1379.  
  1380.       return var3;
  1381.    }
  1382.  
  1383.    boolean renameClass(String var1, String var2) {
  1384.       boolean var3 = true;
  1385.       String var4 = this.currentPackageName + "." + var2;
  1386.       boolean var5 = this.isMajorEqualMinor();
  1387.       this.fileLoader.saveClassDef(this.currentClassName, false, var1);
  1388.       if (var5) {
  1389.          var3 = this.fileLoader.renameClassFile(this.majorClassName(this.currentClassName), var4);
  1390.       }
  1391.  
  1392.       BrowserRegistry.register.changing(this, this.majorClassName(this.currentClassName));
  1393.       this.textState = "";
  1394.       this.currentClassName = null;
  1395.       this.currentClassSelector = -1;
  1396.       this.changes = new boolean[MaxChanges];
  1397.       this.changes[ClassLoad] = true;
  1398.       boolean[] var6 = this.changes;
  1399.       ((Observable)this).setChanged();
  1400.       ((Observable)this).notifyObservers(var6);
  1401.       return var3;
  1402.    }
  1403.  
  1404.    private void updateClassList() {
  1405.       this.changes = new boolean[MaxChanges];
  1406.       this.changes[ClassList] = true;
  1407.       if (!this.saveOperation || !this.textState.equals("Method")) {
  1408.          this.changes[OutputLoad] = true;
  1409.       }
  1410.  
  1411.       boolean[] var1 = this.changes;
  1412.       ((Observable)this).setChanged();
  1413.       ((Observable)this).notifyObservers(var1);
  1414.    }
  1415.  
  1416.    private void updateMethodList() {
  1417.       this.changes = new boolean[MaxChanges];
  1418.       this.changes[MethodList] = true;
  1419.       boolean[] var1 = this.changes;
  1420.       ((Observable)this).setChanged();
  1421.       ((Observable)this).notifyObservers(var1);
  1422.    }
  1423.  
  1424.    private void updatePackageList() {
  1425.       this.changes = new boolean[MaxChanges];
  1426.       this.changes[PackageList] = true;
  1427.       boolean[] var1 = this.changes;
  1428.       ((Observable)this).setChanged();
  1429.       ((Observable)this).notifyObservers(var1);
  1430.    }
  1431.  
  1432.    public String[] getClasses() {
  1433.       int var1 = 0;
  1434.       Object var2 = null;
  1435.       String var3 = null;
  1436.       int var5 = 0;
  1437.       if (this.packageList == null) {
  1438.          this.classList = this.staticClassList;
  1439.       } else {
  1440.          String[] var12 = this.fileLoader.getClasses(this.GetRootDir(), this.packageList[this.currentPackageSelector]);
  1441.          MethodRecord[] var7 = this.fileLoader.partialClassList();
  1442.          String[] var8 = new String[var7.length];
  1443.          int var9 = 0;
  1444.          if (this.fileLoader.classFileName() == null) {
  1445.             this.currentClassSelector = -1;
  1446.          }
  1447.  
  1448.          if (this.currentClassSelector >= 0) {
  1449.             var3 = this.classNamePart(this.classList[this.currentClassSelector]);
  1450.          }
  1451.  
  1452.          if (var7 != null && var7.length > 1) {
  1453.             String var10 = this.classNamePart(this.fileLoader.classFileName());
  1454.  
  1455.             for(int var4 = 0; var4 < var7.length; ++var4) {
  1456.                if (var10.equals(var7[var4].className())) {
  1457.                   --var1;
  1458.                   var8[var9++] = this.currentPackageName() + "." + var10 + " " + var4 + "-" + var7[var4].className();
  1459.                } else {
  1460.                   var8[var9] = this.currentPackageName() + "." + var10 + " " + var4 + "-";
  1461.                   if (!var7[var4].isInner()) {
  1462.                      var8[var9] = var8[var9] + "+";
  1463.                   } else {
  1464.                      for(int var20 = 0; var20 < var7[var4].inner(); ++var20) {
  1465.                         var8[var9] = var8[var9] + " ";
  1466.                      }
  1467.                   }
  1468.  
  1469.                   int var10003 = var9++;
  1470.                   var8[var10003] = var8[var10003] + var7[var4].className();
  1471.                }
  1472.             }
  1473.  
  1474.             this.classList = new String[var12.length + var9 + var1];
  1475.             if (this.packageList != null) {
  1476.                int var13 = 0;
  1477.  
  1478.                int var6;
  1479.                for(var6 = 0; var13 < var12.length; ++var13) {
  1480.                   if (!this.classNamePart(var12[var13]).equals(var10)) {
  1481.                      this.classList[var6++] = var12[var13];
  1482.                   }
  1483.                }
  1484.  
  1485.                for(var5 = 0; var5 < var9; ++var6) {
  1486.                   this.classList[var6] = var8[var5];
  1487.                   ++var5;
  1488.                }
  1489.             } else {
  1490.                int var14 = 0;
  1491.  
  1492.                int var21;
  1493.                for(var21 = 0; var14 < this.currentClassSelector; ++var14) {
  1494.                   this.classList[var21++] = var12[var14];
  1495.                }
  1496.  
  1497.                for(var5 = 0; var5 < var9; ++var21) {
  1498.                   this.classList[var21] = var8[var5];
  1499.                   ++var5;
  1500.                }
  1501.  
  1502.                ++var14;
  1503.  
  1504.                while(var14 < var12.length) {
  1505.                   this.classList[var21++] = var12[var14];
  1506.                   ++var14;
  1507.                }
  1508.             }
  1509.          } else {
  1510.             this.classList = var12;
  1511.          }
  1512.       }
  1513.  
  1514.       if (this.packageList != null) {
  1515.          String[] var22 = this.classList;
  1516.          QSortAlgorithm.QuickSort(var22, 0, var22.length - 1);
  1517.       }
  1518.  
  1519.       if (var3 != null) {
  1520.          for(int var16 = 0; var16 < this.classList.length; ++var16) {
  1521.             if (var3.equals(this.classNamePart(this.classList[var16]))) {
  1522.                this.currentClassSelector = var16;
  1523.             }
  1524.          }
  1525.       }
  1526.  
  1527.       if (this.newClassName != null) {
  1528.          for(int var17 = 0; var17 < this.classList.length; ++var17) {
  1529.             if (this.currentClassName.equals(this.classList[var17])) {
  1530.                this.currentClassSelector = var17;
  1531.             }
  1532.          }
  1533.  
  1534.          this.newClassName = null;
  1535.       }
  1536.  
  1537.       this.classRef = new int[this.classList.length];
  1538.  
  1539.       try {
  1540.          int var18 = 0;
  1541.  
  1542.          for(var5 = 0; var18 < this.classList.length; ++var18) {
  1543.             if (this.matchClass(this.classList[var18])) {
  1544.                this.classRef[var5++] = var18;
  1545.             }
  1546.          }
  1547.       } catch (NullPointerException var11) {
  1548.       }
  1549.  
  1550.       String[] var23 = new String[var5];
  1551.  
  1552.       for(int var19 = 0; var19 < var5; ++var19) {
  1553.          var23[var19] = this.hierarchyClassNamePart(this.classList[this.classRef[var19]]);
  1554.       }
  1555.  
  1556.       this.currentMethodName = null;
  1557.       return var23;
  1558.    }
  1559.  
  1560.    public String[] getMethods() {
  1561.       MethodRecord var1 = null;
  1562.       if (this.currentMethodSelector >= 0) {
  1563.          var1 = this.listMethod[this.currentMethodSelector];
  1564.       }
  1565.  
  1566.       this.listMethod = this.fileLoader.getMethods(this.currentClassName);
  1567.       if (this.lineNumbers) {
  1568.          MethodRecord[] var2 = this.listMethod;
  1569.          QSortAlgorithm.QuickSortCardinal(var2, 0, var2.length - 1);
  1570.       } else {
  1571.          MethodRecord[] var6 = this.listMethod;
  1572.          QSortAlgorithm.QuickSort(var6, 0, var6.length - 1);
  1573.       }
  1574.  
  1575.       this.methodList = new String[this.listMethod.length];
  1576.       this.methodRef = new int[this.listMethod.length];
  1577.  
  1578.       try {
  1579.          int var7 = 0;
  1580.  
  1581.          for(int var3 = 0; var7 < this.listMethod.length; ++var7) {
  1582.             if (this.matchMethod(this.currentClassName, this.listMethod[var7])) {
  1583.                int var4 = MethodRecord.FindFirst(this.listMethod);
  1584.                this.methodRef[var3] = var7;
  1585.                if (this.lineNumbers) {
  1586.                   this.methodList[var3] = this.listMethod[var7].methodName() + "    (" + (var7 == var4 ? this.listMethod[var7].commentStartRow() : this.listMethod[MethodRecord.FindPrevious(this.listMethod, var7)].endRow() + 1) + ", " + this.listMethod[var7].endRow() + ")";
  1587.                } else {
  1588.                   this.methodList[var3] = this.listMethod[var7].methodName();
  1589.                }
  1590.  
  1591.                ++var3;
  1592.             }
  1593.          }
  1594.       } catch (NullPointerException var5) {
  1595.       }
  1596.  
  1597.       if (this.newMethodCreated) {
  1598.          this.currentMethodSelector = MethodRecord.FindLast(this.listMethod);
  1599.          this.newMethodCreated = false;
  1600.       } else if (var1 != null) {
  1601.          for(int var8 = 0; var8 < this.listMethod.length; ++var8) {
  1602.             if (var1.startRow() == this.listMethod[var8].startRow()) {
  1603.                this.currentMethodSelector = var8;
  1604.                break;
  1605.             }
  1606.          }
  1607.  
  1608.          this.currentMethodName = null;
  1609.       }
  1610.  
  1611.       return this.methodList;
  1612.    }
  1613.  
  1614.    private String minorClassName(String var1) {
  1615.       int var2 = var1.lastIndexOf(45);
  1616.       if (var2 == -1) {
  1617.          return var1;
  1618.       } else {
  1619.          var1 = var1.substring(var2 + 1);
  1620.          var2 = var1.lastIndexOf(43);
  1621.          if (var2 >= 0) {
  1622.             return var1.substring(var2 + 1);
  1623.          } else {
  1624.             var2 = var1.lastIndexOf(32);
  1625.             return var2 >= 0 ? var1.substring(var2 + 1) : var1;
  1626.          }
  1627.       }
  1628.    }
  1629.  
  1630.    private String majorClassName(String var1) {
  1631.       int var2 = var1.indexOf(32);
  1632.       if (var2 >= 0) {
  1633.          return var1.substring(0, var2);
  1634.       } else {
  1635.          var2 = var1.indexOf(43);
  1636.          return var2 >= 0 ? var1.substring(0, var2) : var1;
  1637.       }
  1638.    }
  1639.  
  1640.    public String hierarchyClassNamePart(String var1) {
  1641.       String var2 = var1.substring(var1.lastIndexOf(46) + 1);
  1642.       int var3 = var2.lastIndexOf(45);
  1643.       return var3 == -1 ? var2 : var2.substring(var3 + 1);
  1644.    }
  1645.  
  1646.    boolean isSystemBrowser() {
  1647.       return this.isSystemBrowser;
  1648.    }
  1649.  
  1650.    boolean isClassBrowser() {
  1651.       return this.isClassBrowser;
  1652.    }
  1653.  
  1654.    boolean browseStack(String var1) {
  1655.       if (var1 != null && !var1.equals("")) {
  1656.          String[] var2 = this.makeClassListFromStack(var1);
  1657.          if (var2 != null && var2.length != 0) {
  1658.             String[] var3 = this.makeMethodListFromStack(var1);
  1659.             if (var3 != null && var3.length != 0) {
  1660.                new BrowserView(new BrowserModel(this.rootDir, var2, var3, true), BrowserOptions.messages.getString("StackTrace") + " ", false);
  1661.                return true;
  1662.             } else {
  1663.                return false;
  1664.             }
  1665.          } else {
  1666.             return false;
  1667.          }
  1668.       } else {
  1669.          return false;
  1670.       }
  1671.    }
  1672.  
  1673.    BrowserModel(String var1, String[] var2, String[] var3, boolean var4) {
  1674.       this.state = new boolean[MaxState];
  1675.       this.staticClassList = var2;
  1676.       this.isClassBrowser = true;
  1677.       this.isMethodFilterBrowser = true;
  1678.       this.methodFilter = var3;
  1679.       this.init(var1);
  1680.    }
  1681.  
  1682.    String[] makeClassListFromStack(String var1) {
  1683.       String[] var2 = new String[256];
  1684.       int var3 = 0;
  1685.       Object var4 = null;
  1686.       BufferedReader var5 = new BufferedReader(new StringReader(var1));
  1687.  
  1688.       try {
  1689.          while((var10 = var5.readLine()) != null) {
  1690.             String var11 = var10.trim();
  1691.             int var6 = this.getStackPrefix(var11);
  1692.             if (var6 >= 0) {
  1693.                String var8 = var11.substring(var6, var11.indexOf(40));
  1694.                var8 = var8.substring(0, var8.lastIndexOf(46));
  1695.                if (var8.indexOf(46) == -1) {
  1696.                   var8 = this.currentPackageName() + "." + var8;
  1697.                } else {
  1698.                   var8 = "." + var8;
  1699.                }
  1700.  
  1701.                int var7;
  1702.                for(var7 = 0; var7 < var3 && !var8.equals(var2[var7]); ++var7) {
  1703.                }
  1704.  
  1705.                if (var7 == var3) {
  1706.                   var2[var3++] = var8;
  1707.                }
  1708.             }
  1709.          }
  1710.       } catch (IOException var9) {
  1711.       }
  1712.  
  1713.       String[] var12 = new String[var3];
  1714.  
  1715.       for(int var13 = 0; var13 < var3; ++var13) {
  1716.          var12[var13] = var2[var13];
  1717.       }
  1718.  
  1719.       return var12;
  1720.    }
  1721.  
  1722.    String[] makeMethodListFromStack(String var1) {
  1723.       String[] var2 = new String[256];
  1724.       int var3 = 0;
  1725.       Object var4 = null;
  1726.       BufferedReader var5 = new BufferedReader(new StringReader(var1));
  1727.  
  1728.       try {
  1729.          while((var12 = var5.readLine()) != null) {
  1730.             String var13 = var12.trim();
  1731.             int var6 = this.getStackPrefix(var13);
  1732.             if (var6 >= 0) {
  1733.                String var8 = var13.substring(var6, var13.indexOf(40));
  1734.                var8 = var8.substring(0, var8.lastIndexOf(46));
  1735.                if (var8.indexOf(46) != -1) {
  1736.                   var8 = var8.substring(var8.lastIndexOf(46) + 1);
  1737.                }
  1738.  
  1739.                String var9 = var13.substring(var13.indexOf(40));
  1740.                int var10 = var13.indexOf(58);
  1741.                if (var10 != -1) {
  1742.                   var9 = var13.substring(var10 + 1);
  1743.                   var9 = var9.substring(0, var9.indexOf(41));
  1744.                   var8 = var8 + " " + var9;
  1745.  
  1746.                   int var7;
  1747.                   for(var7 = 0; var7 < var3 && !var8.equals(var2[var7]); ++var7) {
  1748.                   }
  1749.  
  1750.                   if (var7 == var3) {
  1751.                      var2[var3++] = var8;
  1752.                   }
  1753.                }
  1754.             }
  1755.          }
  1756.       } catch (IOException var11) {
  1757.       }
  1758.  
  1759.       String[] var14 = new String[var3];
  1760.  
  1761.       for(int var15 = 0; var15 < var3; ++var15) {
  1762.          var14[var15] = var2[var15];
  1763.       }
  1764.  
  1765.       return var14;
  1766.    }
  1767.  
  1768.    int getStackPrefix(String var1) {
  1769.       if (var1.startsWith("at ")) {
  1770.          return 3;
  1771.       } else {
  1772.          if (var1.startsWith("[")) {
  1773.             byte[] var2 = var1.getBytes();
  1774.  
  1775.             for(int var3 = 1; var3 < var2.length; ++var3) {
  1776.                Character.isDigit((char)var2[var3]);
  1777.                if (var2[var3] == 32) {
  1778.                   return var3 + 1;
  1779.                }
  1780.             }
  1781.          }
  1782.  
  1783.          return -1;
  1784.       }
  1785.    }
  1786.  
  1787.    public String toString() {
  1788.       return "BrowserModel [ lineNumbers=" + this.lineNumbers + " currentMethodSelector=" + this.currentMethodSelector + " currentClassSelector=" + this.currentClassSelector + " currentPackageSelector=" + this.currentPackageSelector + " oldIndex=" + this.oldIndex + " methodRef=" + this.methodRef + " classRef=" + this.classRef + " lastModified=" + this.lastModified + " textState=" + this.textState + " currentPackageName=" + this.currentPackageName + " currentClassName=" + this.currentClassName + " currentMethodName=" + this.currentMethodName + " currentOutput=" + this.currentOutput + " rootDir=" + this.rootDir + " newMethodCreated=" + this.newMethodCreated + " newClassName=" + this.newClassName + " isSystemBrowser=" + this.isSystemBrowser + " isClassBrowser=" + this.isClassBrowser + "]";
  1789.    }
  1790.  
  1791.    String majorClassName() {
  1792.       int var1 = this.currentClassName.indexOf(32);
  1793.       if (var1 >= 0) {
  1794.          return this.currentClassName.substring(0, var1);
  1795.       } else {
  1796.          var1 = this.currentClassName.indexOf(43);
  1797.          return var1 >= 0 ? this.currentClassName.substring(0, var1) : this.currentClassName;
  1798.       }
  1799.    }
  1800.  
  1801.    public String majorClassNamePart() {
  1802.       return this.majorClassName().substring(this.majorClassName().lastIndexOf(46) + 1);
  1803.    }
  1804.  
  1805.    boolean isMajorEqualMinor() {
  1806.       return this.majorClassNamePart().equals(this.minorClassName(this.classNamePart()));
  1807.    }
  1808.  
  1809.    boolean isMethodFilterBrowser() {
  1810.       return this.isMethodFilterBrowser;
  1811.    }
  1812.  
  1813.    void discardingOutput() {
  1814.       this.creatingNewMethod = false;
  1815.    }
  1816. }
  1817.