home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2004 May / DPPCPRO0504.ISO / May / Seatools / SeaTools.iso / tools / en / webhelp / webhelp.jar / hhapplet / TocListView.class (.txt) < prev    next >
Encoding:
Java Class File  |  2002-04-17  |  9.5 KB  |  661 lines

  1. package hhapplet;
  2.  
  3. import BsscXML.BsscXML;
  4. import XMLConsumer.Consumer;
  5. import XMLConsumer.IEntry;
  6. import XMLConsumer.Project;
  7. import XMLConsumer.Toc;
  8. import XMLConsumer.TocData;
  9. import XMLConsumer.TocEntry;
  10. import java.awt.Color;
  11. import java.awt.Component;
  12. import java.awt.Font;
  13. import java.awt.FontMetrics;
  14. import java.awt.Graphics;
  15. import java.awt.Image;
  16. import java.net.MalformedURLException;
  17. import java.net.URL;
  18. import java.util.Enumeration;
  19. import java.util.Vector;
  20.  
  21. public class TocListView extends ListView implements IChunkedDataListener {
  22.    private Vector m_chunkedInfos;
  23.    private Vector m_vTocBlocks;
  24.    private TocEntry m_currentEntry;
  25.    private Vector m_vProjects;
  26.    private static String m_sLoadingMsg = null;
  27.    private static final Color YELLOW = new Color(255, 255, 225);
  28.    private String m_sCurrentTocPath = "";
  29.    private String m_sSyncPath;
  30.    private String m_sBackSyncPath;
  31.    private static String m_sTocPathSplit = "\n";
  32.    private boolean m_bSync = false;
  33.    private boolean m_bProcess = false;
  34.    private boolean m_bInit = false;
  35.    private boolean m_bInSync = false;
  36.  
  37.    protected void procResize() {
  38.       if (!this.m_bInit) {
  39.          this.loadRootData();
  40.          this.m_bInit = true;
  41.       }
  42.  
  43.       if (!this.m_bProcess) {
  44.          super.procResize();
  45.       }
  46.  
  47.    }
  48.  
  49.    public TocBlock getRootBlock() {
  50.       return this.m_vTocBlocks.size() > 0 ? (TocBlock)this.m_vTocBlocks.elementAt(0) : null;
  51.    }
  52.  
  53.    protected void listPaint(Graphics var1, Image var2) {
  54.       int var3 = ((ListView)this).getTop();
  55.       int var4 = ((ListView)this).getVisible();
  56.       int var5 = this.getWidth(var1);
  57.       ((ListView)this).setHorizontalMax(var5);
  58.       Vector var6 = this.getVisibleBlock(var3, var4);
  59.       Enumeration var7 = var6.elements();
  60.  
  61.       while(var7.hasMoreElements()) {
  62.          TocBlock var8 = (TocBlock)var7.nextElement();
  63.          var8.display(var1, var3, var4, ((ListView)this).getUnitHeight(), ((Component)this).getBackground(), var2);
  64.       }
  65.  
  66.       if (this.m_bProcess) {
  67.          this.displayLoadingMsg(var1);
  68.       }
  69.  
  70.    }
  71.  
  72.    protected void procClicked() {
  73.       if (!this.m_bProcess) {
  74.          super.procClicked();
  75.       }
  76.  
  77.    }
  78.  
  79.    private void displayLoadingMsg(Graphics var1) {
  80.       Color var2 = var1.getColor();
  81.       Font var3 = var1.getFont();
  82.       Font var4 = new Font(var3.getName(), var3.getStyle() | 1, var3.getSize() + 1);
  83.       var1.setFont(var4);
  84.       FontMetrics var5 = var1.getFontMetrics();
  85.       int var6 = var5.stringWidth(m_sLoadingMsg);
  86.       var1.setColor(Color.black);
  87.       var1.drawRect(2, 2, var6 + 3, var5.getHeight() + 3);
  88.       var1.setColor(YELLOW);
  89.       var1.fillRect(3, 3, var6 + 2, var5.getHeight() + 2);
  90.       var1.setColor(Color.black);
  91.       var1.drawString(m_sLoadingMsg, 3, 3 + var5.getLeading() + var5.getAscent());
  92.       var1.setColor(var2);
  93.       var1.setFont(var3);
  94.    }
  95.  
  96.    public void sync(String var1, String var2) {
  97.       if (this.m_vTocBlocks.size() != 0) {
  98.          Vector var3 = this.interpretTocPaths(var2);
  99.          Vector var4 = new Vector();
  100.          Enumeration var5 = var3.elements();
  101.  
  102.          while(var5.hasMoreElements()) {
  103.             String var6 = (String)var5.nextElement();
  104.             String var7 = this.getTocPath(var1, var6).substring(1);
  105.             var4.addElement(var7);
  106.          }
  107.  
  108.          String var8 = this.getClosestTocPath(var4);
  109.          if (var8 != null) {
  110.             if (!this.m_bSync) {
  111.                this.m_bSync = true;
  112.                this.m_sSyncPath = var8;
  113.                ((ListView)this).setTimeout("syncTocInt", 1);
  114.                return;
  115.             }
  116.  
  117.             this.m_sBackSyncPath = var8;
  118.          }
  119.  
  120.       }
  121.    }
  122.  
  123.    private String getClosestTocPath(Vector var1) {
  124.       int var2 = -1;
  125.       String var3 = null;
  126.       Object var4 = null;
  127.       if (var1.size() == 0) {
  128.          return null;
  129.       } else {
  130.          Enumeration var5 = var1.elements();
  131.  
  132.          while(var5.hasMoreElements()) {
  133.             String var7 = (String)var5.nextElement();
  134.             if (var7.length() > 0) {
  135.                int var6 = this.compareTocPath(this.m_sCurrentTocPath, var7);
  136.                if (var6 > var2) {
  137.                   var2 = var6;
  138.                   var3 = var7;
  139.                }
  140.             }
  141.          }
  142.  
  143.          if (var3 != null && var3.equals(this.m_sCurrentTocPath)) {
  144.             var3 = null;
  145.          }
  146.  
  147.          return var3;
  148.       }
  149.    }
  150.  
  151.    public TocListView(Vector var1, Vector var2) {
  152.       if (m_sLoadingMsg == null) {
  153.          m_sLoadingMsg = ResourceLib.GetRes("LoadingData");
  154.       }
  155.  
  156.       this.m_vProjects = var1;
  157.       this.m_chunkedInfos = var2;
  158.       this.m_vTocBlocks = new Vector();
  159.    }
  160.  
  161.    protected void procMoved() {
  162.       if (!this.m_bProcess) {
  163.          super.procMoved();
  164.       }
  165.  
  166.    }
  167.  
  168.    private void syncTocInt() {
  169.       if (this.m_sSyncPath == null) {
  170.          this.m_bSync = false;
  171.       } else {
  172.          this.m_bInSync = true;
  173.          TocBlock var1 = (TocBlock)this.m_vTocBlocks.elementAt(0);
  174.          TocEntry var2 = var1.getEntryByIdx(0);
  175.          Vector var3 = new Vector();
  176.          int var4 = this.expandToc(var2, this.m_sSyncPath, var3);
  177.          if (var4 != -1) {
  178.             if (var4 == 1) {
  179.                if (var3.size() > 0) {
  180.                   for(int var5 = 0; var5 < var3.size() - 1; ++var5) {
  181.                      TocEntry var6 = (TocEntry)var3.elementAt(var5);
  182.                      if (!var6.isOpen()) {
  183.                         var6.action(this);
  184.                      }
  185.                   }
  186.                }
  187.  
  188.                TocEntry var7 = (TocEntry)var3.elementAt(var3.size() - 1);
  189.                TocBlock var8 = (TocBlock)var7.getContainer();
  190.                ((ListView)this).setTop(var8.getTop() + var7.getPosOffset() - ((ListView)this).getVisible() + 2);
  191.                ((ListView)this).selectEntry(((ListView)this).getTop(), var7.getPosOffset(), var7);
  192.                ((Component)this).repaint();
  193.             }
  194.  
  195.             this.m_sSyncPath = this.m_sBackSyncPath;
  196.             this.m_sBackSyncPath = null;
  197.             ((ListView)this).setTimeout("syncTocInt", 1);
  198.          }
  199.  
  200.          this.m_bInSync = false;
  201.       }
  202.    }
  203.  
  204.    private URL getFullURL(URL var1, String var2) {
  205.       URL var3 = null;
  206.  
  207.       try {
  208.          var3 = URLFileHandler.makeURL(var1, var2, (String)null);
  209.       } catch (MalformedURLException var4) {
  210.       }
  211.  
  212.       return var3;
  213.    }
  214.  
  215.    public void loadRootData() {
  216.       Toc var1 = (Toc)this.m_chunkedInfos.elementAt(0);
  217.       TocData var2 = new TocData(var1.getRootTocURL(), var1.getProjURL());
  218.       this.markBegin();
  219.       var2.load(this);
  220.    }
  221.  
  222.    public void accept(Vector var1) {
  223.       if (var1 != null && var1.size() == 5) {
  224.          TocEntry var2 = (TocEntry)var1.elementAt(0);
  225.          String var3 = (String)var1.elementAt(1);
  226.          String var4 = (String)var1.elementAt(2);
  227.          TocData var5 = (TocData)var1.elementAt(3);
  228.          String var6 = (String)var1.elementAt(4);
  229.          TocBlock var7 = (TocBlock)var2.getContainer();
  230.          switch (var2.getType()) {
  231.             case 1:
  232.                var2.toggle();
  233.                if (var7 != null) {
  234.                   var7.setNeedCalWidth();
  235.                   int var14 = var7.getHeight();
  236.                   var7.callPosOffsetByEntry(var2);
  237.                   int var16 = var7.getHeight();
  238.                   int var18 = var16 - var14;
  239.                   TocBlock var19 = var7.getParentBlock();
  240.                   if (var19 != null) {
  241.                      var19.propagateHeightChange(var7, var18);
  242.                   }
  243.  
  244.                   ((ListView)this).setVerticalMax(this.getRootBlock().getHeight());
  245.                   ((ListView)this).clearHightLighted();
  246.                   ((Component)this).repaint();
  247.                }
  248.  
  249.                if (var3 != null && var3.length() != 0 && !this.m_bInSync) {
  250.                   this.jumpToURL(var5.getProjURL(), var3, var6);
  251.                   return;
  252.                }
  253.                break;
  254.             case 2:
  255.             case 5:
  256.                if (var3 != null && var3.length() != 0) {
  257.                   this.jumpToURL(var5.getProjURL(), var3, var6);
  258.                   return;
  259.                }
  260.                break;
  261.             case 3:
  262.             case 4:
  263.                if (var7 != null) {
  264.                   TocBlock var8 = var7.getSubBlock(var2.getIndex());
  265.                   if (var8 == null) {
  266.                      if (!this.m_bProcess) {
  267.                         try {
  268.                            TocData var15 = null;
  269.                            if (var2.getType() == 3) {
  270.                               URL var10 = URLFileHandler.makeURL(((Consumer)var5).getURL(), var4, (String)null);
  271.                               var15 = new TocData(var10, var5.getProjURL());
  272.                            } else {
  273.                               URL var17 = URLFileHandler.makeURL(var5.getProjURL(), var4, (String)null);
  274.                               Enumeration var11 = this.m_vProjects.elements();
  275.  
  276.                               while(var11.hasMoreElements()) {
  277.                                  Object var12 = var11.nextElement();
  278.                                  if (var12 instanceof Project && ((Project)var12).getURL().equals(var17)) {
  279.                                     var15 = new TocData(((Project)var12).getToc().getRootTocURL(), var17);
  280.                                     break;
  281.                                  }
  282.                               }
  283.                            }
  284.  
  285.                            if (var15 != null) {
  286.                               this.m_currentEntry = var2;
  287.                               this.markBegin();
  288.                               var15.load(this, var2.getLevel() + 1);
  289.                            }
  290.                         } catch (MalformedURLException var13) {
  291.                            ((Throwable)var13).printStackTrace();
  292.                         }
  293.                      }
  294.                   } else {
  295.                      var2.toggle();
  296.                      int var9 = var8.getHeight();
  297.                      if (!var2.isOpen()) {
  298.                         var9 = -var9;
  299.                      }
  300.  
  301.                      var8.setVisible(var2.isOpen());
  302.                      var7.propagateHeightChange(var8, var9);
  303.                      ((ListView)this).setVerticalMax(this.getRootBlock().getHeight());
  304.                      ((ListView)this).clearHightLighted();
  305.                      ((Component)this).repaint();
  306.                   }
  307.                }
  308.  
  309.                if (var3 != null && var3.length() != 0 && !this.m_bInSync) {
  310.                   this.jumpToURL(var5.getProjURL(), var3, var6);
  311.                   return;
  312.                }
  313.          }
  314.       }
  315.  
  316.    }
  317.  
  318.    public void dispatchToDo(String var1) {
  319.       if (var1.equals("syncTocInt")) {
  320.          this.syncTocInt();
  321.       } else {
  322.          super.dispatchToDo(var1);
  323.       }
  324.    }
  325.  
  326.    public void putData(IChunkedData var1) {
  327.       if (var1 instanceof TocData) {
  328.          TocData var2 = (TocData)var1;
  329.          Vector var3 = var2.getTocEntires();
  330.          if (var3.size() <= 0) {
  331.             this.m_currentEntry = null;
  332.          } else {
  333.             TocBlock var4 = new TocBlock(var3);
  334.             Enumeration var5 = var3.elements();
  335.  
  336.             while(var5.hasMoreElements()) {
  337.                TocEntry var6 = (TocEntry)var5.nextElement();
  338.                var6.setContainer(var4);
  339.             }
  340.  
  341.             this.m_vTocBlocks.addElement(var4);
  342.             if (this.m_currentEntry != null) {
  343.                TocBlock var8 = (TocBlock)this.m_currentEntry.getContainer();
  344.                if (var8 != null) {
  345.                   var4.setParentEntry(this.m_currentEntry);
  346.                   if (!this.m_bSync) {
  347.                      this.m_currentEntry.toggle();
  348.                   }
  349.  
  350.                   var8.insertTocBlock(this.m_currentEntry, var4);
  351.                }
  352.  
  353.                this.m_currentEntry = null;
  354.             } else {
  355.                BsscHelpRedirector.doJavaScript("setTimeout(\"getInitTocInfo();\", 100);");
  356.             }
  357.          }
  358.  
  359.          if (!this.m_bSync) {
  360.             TocBlock var7 = this.getRootBlock();
  361.             if (var7 != null) {
  362.                ((ListView)this).setVerticalMax(var7.getHeight());
  363.             }
  364.  
  365.             ((Component)this).repaint();
  366.          }
  367.       }
  368.  
  369.       this.markEnd();
  370.       if (this.m_bSync) {
  371.          ((ListView)this).setTimeout("syncTocInt", 1);
  372.       }
  373.  
  374.    }
  375.  
  376.    private void markBegin() {
  377.       this.m_bProcess = true;
  378.       ((Component)this).repaint();
  379.    }
  380.  
  381.    public boolean imageUpdate(Image var1, int var2, int var3, int var4, int var5, int var6) {
  382.       if (TocEntry.hasImage(var1)) {
  383.          ((Component)this).repaint();
  384.          return true;
  385.       } else {
  386.          return super.imageUpdate(var1, var2, var3, var4, var5, var6);
  387.       }
  388.    }
  389.  
  390.    protected IEntry getEntryByPos(int var1) {
  391.       Vector var2 = this.getVisibleBlock(var1, 1);
  392.       if (var2 != null) {
  393.          if (var2.size() == 1) {
  394.             TocBlock var7 = (TocBlock)var2.elementAt(0);
  395.             TocEntry var8 = var7.getEntry(var1);
  396.             return var8;
  397.          }
  398.  
  399.          if (var2.size() > 1) {
  400.             TocBlock var3 = (TocBlock)var2.elementAt(0);
  401.             int var4 = var3.getHeight();
  402.             Enumeration var5 = var2.elements();
  403.  
  404.             while(var5.hasMoreElements()) {
  405.                TocBlock var6 = (TocBlock)var5.nextElement();
  406.                if (var6.getHeight() < var4) {
  407.                   var3 = var6;
  408.                   var4 = var6.getHeight();
  409.                }
  410.             }
  411.  
  412.             TocEntry var9 = var3.getEntry(var1);
  413.             return var9;
  414.          }
  415.       }
  416.  
  417.       return null;
  418.    }
  419.  
  420.    private TocEntry getParentEntry(TocEntry var1) {
  421.       if (var1 == null) {
  422.          return null;
  423.       } else {
  424.          TocEntry var2 = var1.getDirectParent();
  425.          if (var2 != null) {
  426.             return var2;
  427.          } else {
  428.             TocBlock var3 = (TocBlock)var1.getContainer();
  429.             return var3 != null ? var3.getParentEntry() : null;
  430.          }
  431.       }
  432.    }
  433.  
  434.    private String calTocPath(TocEntry var1) {
  435.       String var2 = var1.getName();
  436.  
  437.       for(TocEntry var3 = this.getParentEntry(var1); var3 != null; var3 = this.getParentEntry(var3)) {
  438.          var2 = var3.getName() + m_sTocPathSplit + var2;
  439.       }
  440.  
  441.       return var2;
  442.    }
  443.  
  444.    private Vector interpretTocPaths(String var1) {
  445.       Vector var2 = new Vector();
  446.       if (var1.length() == 0) {
  447.          return var2;
  448.       } else {
  449.          int var4 = 0;
  450.          int var5 = -1;
  451.  
  452.          do {
  453.             var5 = var1.indexOf("\r\r", var4);
  454.             String var3;
  455.             if (var5 != -1) {
  456.                var3 = var1.substring(var4, var5);
  457.                var4 = var5 + 2;
  458.             } else {
  459.                var3 = var1.substring(var4);
  460.                var4 = -1;
  461.             }
  462.  
  463.             if (var3.length() > 0) {
  464.                var2.addElement(var3);
  465.             }
  466.          } while(var4 != -1);
  467.  
  468.          return var2;
  469.       }
  470.    }
  471.  
  472.    protected void procScroll() {
  473.       if (!this.m_bProcess) {
  474.          super.procScroll();
  475.       }
  476.  
  477.    }
  478.  
  479.    private int expandToc(TocEntry var1, String var2, Vector var3) {
  480.       var3.size();
  481.       int var4 = var2.indexOf(m_sTocPathSplit);
  482.       Object var5 = null;
  483.       String var6 = null;
  484.       String var12;
  485.       if (var4 != -1) {
  486.          var12 = var2.substring(0, var4);
  487.          var6 = var2.substring(var4 + 1);
  488.       } else {
  489.          var12 = var2;
  490.       }
  491.  
  492.       for(TocEntry var7 = var1; var7 != null; var7 = var7.getNextSibling()) {
  493.          if (var7.getName().equals(var12)) {
  494.             if (var6 == null) {
  495.                var3.addElement(var7);
  496.                return 1;
  497.             }
  498.  
  499.             if (var7.getType() != 3 && var7.getType() != 4) {
  500.                if (var7.getType() != 1) {
  501.                   return 0;
  502.                }
  503.  
  504.                var3.addElement(var7);
  505.                TocEntry var13 = var7.getFirstChild();
  506.                int var14 = this.expandToc(var13, var6, var3);
  507.                if (var14 != 0) {
  508.                   return var14;
  509.                }
  510.  
  511.                var3.removeElementAt(var3.size() - 1);
  512.             } else {
  513.                TocBlock var8 = (TocBlock)var7.getContainer();
  514.                TocBlock var9 = var8.getSubBlock(var7.getIndex());
  515.                if (var9 == null) {
  516.                   var7.action(this);
  517.                   return -1;
  518.                }
  519.  
  520.                var3.addElement(var7);
  521.                TocEntry var10 = var9.getEntryByIdx(0);
  522.                int var11 = this.expandToc(var10, var6, var3);
  523.                if (var11 != 0) {
  524.                   return var11;
  525.                }
  526.  
  527.                var3.removeElementAt(var3.size() - 1);
  528.             }
  529.          }
  530.       }
  531.  
  532.       return 0;
  533.    }
  534.  
  535.    private void jumpToURL(URL var1, String var2, String var3) {
  536.       URL var4 = this.getFullURL(var1, var2);
  537.       if (var4 != null) {
  538.          if (var3 != null) {
  539.             BsscHelpRedirector.showDoc(var4, var3);
  540.             return;
  541.          }
  542.  
  543.          BsscHelpRedirector.showDoc(var4);
  544.       }
  545.  
  546.    }
  547.  
  548.    private Vector getVisibleBlock(int var1, int var2) {
  549.       Vector var3 = new Vector();
  550.  
  551.       for(int var4 = 0; var4 < this.m_vTocBlocks.size(); ++var4) {
  552.          TocBlock var5 = (TocBlock)this.m_vTocBlocks.elementAt(var4);
  553.          int var6 = var5.getTop();
  554.          int var7 = var6 + var5.getHeight();
  555.          if (var5.isVisible() && (var6 <= var1 || var6 < var1 + var2) && (var7 >= var1 + var2 || var7 > var1)) {
  556.             var3.addElement(var5);
  557.          }
  558.       }
  559.  
  560.       return var3;
  561.    }
  562.  
  563.    private void markEnd() {
  564.       if (this.m_bProcess) {
  565.          this.m_bProcess = false;
  566.          ((Component)this).repaint();
  567.          BsscHelpRedirector.showStatus(ResourceLib.GetRes("Done"));
  568.       }
  569.  
  570.    }
  571.  
  572.    protected int getWidth(Graphics var1) {
  573.       int var2 = 0;
  574.  
  575.       for(int var3 = 0; var3 < this.m_vTocBlocks.size(); ++var3) {
  576.          TocBlock var4 = (TocBlock)this.m_vTocBlocks.elementAt(var3);
  577.          int var5 = var4.getWidth(var1);
  578.          if (var5 > var2) {
  579.             var2 = var5;
  580.          }
  581.       }
  582.  
  583.       return var2;
  584.    }
  585.  
  586.    private int compareTocPath(String var1, String var2) {
  587.       if (var1 != null && var2 != null) {
  588.          int var3 = 0;
  589.          int var4 = 0;
  590.          int var5 = -1;
  591.          int var6 = 0;
  592.          int var7 = -1;
  593.  
  594.          do {
  595.             Object var8 = null;
  596.             Object var9 = null;
  597.             var5 = var1.indexOf(m_sTocPathSplit, var4);
  598.             String var12;
  599.             if (var5 != -1) {
  600.                var12 = var1.substring(var4, var5);
  601.                var4 = var5 + 1;
  602.             } else {
  603.                var12 = var1.substring(var4);
  604.                var4 = -1;
  605.             }
  606.  
  607.             var7 = var2.indexOf(m_sTocPathSplit, var6);
  608.             String var13;
  609.             if (var7 != -1) {
  610.                var13 = var2.substring(var6, var7);
  611.                var6 = var7 + 1;
  612.             } else {
  613.                var13 = var2.substring(var6);
  614.                var6 = -1;
  615.             }
  616.  
  617.             if (!var12.equals(var13)) {
  618.                break;
  619.             }
  620.  
  621.             ++var3;
  622.          } while(var4 != -1 && var6 != -1);
  623.  
  624.          return var3;
  625.       } else {
  626.          return 0;
  627.       }
  628.    }
  629.  
  630.    protected void selectedEntry(IEntry var1) {
  631.       if (var1 == null) {
  632.          this.m_sCurrentTocPath = null;
  633.       } else {
  634.          if (var1 instanceof TocEntry) {
  635.             this.m_sCurrentTocPath = this.calTocPath((TocEntry)var1);
  636.          }
  637.  
  638.       }
  639.    }
  640.  
  641.    private String getTocPath(String var1, String var2) {
  642.       String var3 = null;
  643.       URL var4 = null;
  644.  
  645.       try {
  646.          var4 = URLFileHandler.makeURL(BsscXML.getDocumentBase(), var1 + Project.getFileName(), (String)null);
  647.       } catch (MalformedURLException var7) {
  648.       }
  649.  
  650.       for(int var5 = 0; var5 < this.m_chunkedInfos.size(); ++var5) {
  651.          Toc var6 = (Toc)this.m_chunkedInfos.elementAt(var5);
  652.          if (var6.getProjURL().equals(var4)) {
  653.             var3 = var6.getRootTocPath() + var2;
  654.             break;
  655.          }
  656.       }
  657.  
  658.       return var3;
  659.    }
  660. }
  661.