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

  1. package hhapplet;
  2.  
  3. import XMLConsumer.ITocEntryContainer;
  4. import XMLConsumer.TocEntry;
  5. import java.awt.Color;
  6. import java.awt.Graphics;
  7. import java.awt.Image;
  8. import java.util.Enumeration;
  9. import java.util.Hashtable;
  10. import java.util.Vector;
  11.  
  12. class TocBlock implements ITocEntryContainer {
  13.    private Vector m_vEntries;
  14.    private int m_nTop;
  15.    private int m_nHeight;
  16.    private int m_nWidth;
  17.    private boolean m_bNeedCalWidth;
  18.    private boolean m_bVisible;
  19.    private Hashtable m_hashSubBlock;
  20.    private TocEntry m_teParent;
  21.  
  22.    public void insertTocBlock(TocEntry var1, TocBlock var2) {
  23.       if (var1 != null) {
  24.          int var3 = var1.getIndex();
  25.          var2.setParentEntry(var1);
  26.          if (this.m_hashSubBlock == null) {
  27.             this.m_hashSubBlock = new Hashtable();
  28.          }
  29.  
  30.          this.m_hashSubBlock.put(new Integer(var3), var2);
  31.          boolean var4 = var1.isOpen() && this.isEntryVisible(var1);
  32.          var2.setVisible(var4);
  33.          var2.setTop(this.getPosition(var3) + 1);
  34.          if (var4) {
  35.             this.propagateHeightChange(var2, var2.getHeight());
  36.          }
  37.       }
  38.  
  39.    }
  40.  
  41.    public TocBlock(Vector var1) {
  42.       this.m_vEntries = var1;
  43.       this.m_nWidth = 0;
  44.       this.m_nTop = 0;
  45.       this.m_bVisible = true;
  46.       this.calPosOffset();
  47.       this.m_bNeedCalWidth = true;
  48.    }
  49.  
  50.    public TocEntry getEntry(int var1) {
  51.       int var2 = var1 - this.m_nTop;
  52.       if (var2 >= 0 && var2 < this.m_nHeight) {
  53.          int var3 = this.getFirstIndex(var2, 1);
  54.          if (var3 != -1) {
  55.             TocEntry var4 = (TocEntry)this.m_vEntries.elementAt(var3);
  56.             return var4;
  57.          }
  58.       }
  59.  
  60.       return null;
  61.    }
  62.  
  63.    public void setVisible(boolean var1) {
  64.       boolean var2 = false;
  65.       if (this.m_bVisible != var1) {
  66.          var2 = true;
  67.       }
  68.  
  69.       this.m_bVisible = var1;
  70.       if (var2) {
  71.          this.propagateVisibility();
  72.       }
  73.  
  74.    }
  75.  
  76.    public TocEntry getEntryByIdx(int var1) {
  77.       return var1 >= 0 && var1 < this.m_vEntries.size() ? (TocEntry)this.m_vEntries.elementAt(var1) : null;
  78.    }
  79.  
  80.    public int getTop() {
  81.       return this.m_nTop;
  82.    }
  83.  
  84.    public void setTop(int var1) {
  85.       int var2 = var1 - this.m_nTop;
  86.       this.m_nTop = var1;
  87.       if (this.m_hashSubBlock != null) {
  88.          Enumeration var3 = this.m_hashSubBlock.keys();
  89.  
  90.          while(var3.hasMoreElements()) {
  91.             Integer var4 = (Integer)var3.nextElement();
  92.             TocBlock var5 = (TocBlock)this.m_hashSubBlock.get(var4);
  93.             int var6 = var5.getTop();
  94.             var5.setTop(var6 + var2);
  95.          }
  96.       }
  97.  
  98.    }
  99.  
  100.    protected void updateHeightChange(int var1, int var2) {
  101.       for(int var3 = var1; var3 < this.m_vEntries.size(); ++var3) {
  102.          TocEntry var4 = (TocEntry)this.m_vEntries.elementAt(var3);
  103.          var4.updatePosOffset(var2);
  104.          if (var4.getType() == 3 || var4.getType() == 4) {
  105.             TocBlock var5 = this.getSubBlock(var3);
  106.             if (var5 != null) {
  107.                int var6 = var5.getTop();
  108.                var5.setTop(var6 + var2);
  109.             }
  110.          }
  111.       }
  112.  
  113.    }
  114.  
  115.    public TocBlock getParentBlock() {
  116.       TocEntry var1 = this.getParentEntry();
  117.       return var1 != null ? (TocBlock)var1.getContainer() : null;
  118.    }
  119.  
  120.    public TocBlock getSubBlock(int var1) {
  121.       if (this.m_hashSubBlock != null) {
  122.          Object var2 = this.m_hashSubBlock.get(new Integer(var1));
  123.          if (var2 != null && var2 instanceof TocBlock) {
  124.             return (TocBlock)var2;
  125.          }
  126.       }
  127.  
  128.       return null;
  129.    }
  130.  
  131.    public void calPosOffset() {
  132.       this.m_nHeight = 0;
  133.       TocEntry var1 = (TocEntry)this.m_vEntries.elementAt(0);
  134.       this.m_nHeight = this.calPosOffsetWithEntry(var1, -1, this.m_bVisible) + 1;
  135.    }
  136.  
  137.    public void setNeedCalWidth() {
  138.       this.m_bNeedCalWidth = true;
  139.    }
  140.  
  141.    protected int calPosOffsetWithEntry(TocEntry var1, int var2, boolean var3) {
  142.       while(var1 != null) {
  143.          var2 = this.calOffSpringPosOff(var1, var2, var3);
  144.          var1 = var1.getNextSibling();
  145.       }
  146.  
  147.       return var2;
  148.    }
  149.  
  150.    public TocEntry getParentEntry() {
  151.       return this.m_teParent;
  152.    }
  153.  
  154.    public void setParentEntry(TocEntry var1) {
  155.       this.m_teParent = var1;
  156.    }
  157.  
  158.    protected int calWidth(Graphics var1) {
  159.       TocEntry var2 = (TocEntry)this.m_vEntries.elementAt(0);
  160.       return this.getOffSpringMaxWidth(var1, var2);
  161.    }
  162.  
  163.    protected int getOffSpringMaxWidth(Graphics var1, TocEntry var2) {
  164.       int var3 = 0;
  165.  
  166.       for(int var4 = 0; var2 != null; var2 = var2.getNextSibling()) {
  167.          var4 = var2.getWidth(var1);
  168.          if (var4 > var3) {
  169.             var3 = var4;
  170.          }
  171.  
  172.          if (var2.isOpen()) {
  173.             TocEntry var5 = var2.getFirstChild();
  174.             var4 = this.getOffSpringMaxWidth(var1, var5);
  175.          }
  176.  
  177.          if (var4 > var3) {
  178.             var3 = var4;
  179.          }
  180.       }
  181.  
  182.       return var3;
  183.    }
  184.  
  185.    public boolean isVisible() {
  186.       return this.m_bVisible;
  187.    }
  188.  
  189.    public int getFirstIndex(int var1, int var2) {
  190.       byte var3 = -1;
  191.       if (this.m_vEntries.size() > 0) {
  192.          TocEntry var4 = (TocEntry)this.m_vEntries.elementAt(0);
  193.          if (this.isEntryVisible(var4)) {
  194.             return this.getFirstVisibleEntryIndex(var4, var1, var2);
  195.          }
  196.       }
  197.  
  198.       return var3;
  199.    }
  200.  
  201.    protected int calOffSpringPosOff(TocEntry var1, int var2, boolean var3) {
  202.       if (var3) {
  203.          ++var2;
  204.          var1.setPosOffset(var2);
  205.       } else {
  206.          var1.setPosOffset(var2);
  207.       }
  208.  
  209.       if (var1.getFirstChild() != null) {
  210.          if (var1.isOpen()) {
  211.             var2 = this.calPosOffsetWithEntry(var1.getFirstChild(), var2, var3);
  212.          } else {
  213.             var2 = this.calPosOffsetWithEntry(var1.getFirstChild(), var2, false);
  214.          }
  215.       } else if ((var1.getType() == 3 || var1.getType() == 4) && this.m_hashSubBlock != null) {
  216.          TocBlock var4 = (TocBlock)this.m_hashSubBlock.get(new Integer(var1.getIndex()));
  217.          if (var4 != null) {
  218.             if (var3 && var1.isOpen()) {
  219.                var2 += var4.getHeight();
  220.             }
  221.  
  222.             var4.setVisible(var3 && var1.isOpen());
  223.          }
  224.       }
  225.  
  226.       return var2;
  227.    }
  228.  
  229.    public int getPosition(int var1) {
  230.       TocEntry var2 = (TocEntry)this.m_vEntries.elementAt(var1);
  231.       return this.m_nTop + var2.getPosOffset();
  232.    }
  233.  
  234.    protected void propagateHeightChange(TocBlock var1, int var2) {
  235.       if (this.m_hashSubBlock != null && this.m_hashSubBlock.contains(var1)) {
  236.          Enumeration var3 = this.m_hashSubBlock.keys();
  237.  
  238.          while(var3.hasMoreElements()) {
  239.             Integer var4 = (Integer)var3.nextElement();
  240.             if (this.m_hashSubBlock.get(var4) == var1) {
  241.                int var5 = var4;
  242.                this.updateHeightChange(var5 + 1, var2);
  243.                break;
  244.             }
  245.          }
  246.       }
  247.  
  248.       this.m_nHeight += var2;
  249.       if (this.getParentBlock() != null) {
  250.          this.getParentBlock().propagateHeightChange(this, var2);
  251.       }
  252.  
  253.    }
  254.  
  255.    protected void propagateVisibility() {
  256.       if (this.m_hashSubBlock != null) {
  257.          Enumeration var1 = this.m_hashSubBlock.keys();
  258.  
  259.          while(var1.hasMoreElements()) {
  260.             Integer var2 = (Integer)var1.nextElement();
  261.             TocBlock var3 = (TocBlock)this.m_hashSubBlock.get(var2);
  262.             TocEntry var4 = (TocEntry)this.m_vEntries.elementAt(var2);
  263.             if (var4.isOpen()) {
  264.                var3.setVisible(this.m_bVisible);
  265.             }
  266.          }
  267.       }
  268.  
  269.    }
  270.  
  271.    public int getHeight() {
  272.       return this.m_nHeight;
  273.    }
  274.  
  275.    public int getCount() {
  276.       return this.m_vEntries.size();
  277.    }
  278.  
  279.    public void callPosOffsetByEntry(TocEntry var1) {
  280.       TocEntry var2 = var1.getNextOut();
  281.       int var3 = this.m_vEntries.size() - 1;
  282.       if (var2 != null) {
  283.          var3 = var2.getIndex() - 1;
  284.       }
  285.  
  286.       if (var3 >= 0 && var3 != var1.getIndex()) {
  287.          TocEntry var4 = (TocEntry)this.m_vEntries.elementAt(var3);
  288.          int var5 = var4.getPosOffset();
  289.          int var6 = this.calOffSpringPosOff(var1, var1.getPosOffset() - 1, true);
  290.          int var7 = var6 - var5;
  291.          if (var2 != null) {
  292.             int var8 = var2.getIndex();
  293.             this.updateHeightChange(var8, var7);
  294.          }
  295.  
  296.          this.m_nHeight += var7;
  297.       }
  298.  
  299.    }
  300.  
  301.    public void display(Graphics var1, int var2, int var3, int var4, Color var5, Image var6) {
  302.       int var7 = var2 - this.m_nTop;
  303.       int var8 = var7 > 0 ? var7 : 0;
  304.       int var9 = this.getFirstIndex(var8, var3);
  305.       if (var9 != -1) {
  306.          int var10 = var9;
  307.  
  308.          while(var10 < this.m_vEntries.size()) {
  309.             TocEntry var11 = (TocEntry)this.m_vEntries.elementAt(var10);
  310.             if (var11.getPosOffset() >= var3 + var7) {
  311.                break;
  312.             }
  313.  
  314.             if (this.isEntryVisible(var11)) {
  315.                var11.display(var1, var11.getPosOffset() - var7, var4, var5, var6);
  316.                ++var10;
  317.             } else {
  318.                TocEntry var12 = var11.getDirectParent();
  319.                if (var12 == null) {
  320.                   break;
  321.                }
  322.  
  323.                TocEntry var13 = var12.getNextOut();
  324.                if (var13 == null) {
  325.                   break;
  326.                }
  327.  
  328.                var10 = var13.getIndex();
  329.             }
  330.          }
  331.       }
  332.  
  333.    }
  334.  
  335.    public int getWidth(Graphics var1) {
  336.       if (this.isVisible()) {
  337.          if (this.m_bNeedCalWidth) {
  338.             this.m_bNeedCalWidth = false;
  339.             this.m_nWidth = this.calWidth(var1);
  340.          }
  341.  
  342.          return this.m_nWidth;
  343.       } else {
  344.          return 0;
  345.       }
  346.    }
  347.  
  348.    public int countRightSibiling(int var1) {
  349.       int var2;
  350.       TocEntry var3;
  351.       for(var2 = 0; var1 >= 0 && var1 < this.m_vEntries.size(); var1 += var3.getNextSpan() + 1) {
  352.          var3 = (TocEntry)this.m_vEntries.elementAt(var1);
  353.          if (var3.getNextSpan() == -1) {
  354.             break;
  355.          }
  356.  
  357.          ++var2;
  358.       }
  359.  
  360.       return var2;
  361.    }
  362.  
  363.    private int getFirstVisibleEntryIndex(TocEntry var1, int var2, int var3) {
  364.       Object var4 = null;
  365.  
  366.       while(true) {
  367.          TocEntry var6 = var1.getNextSibling();
  368.          if (var1.getPosOffset() >= var2) {
  369.             if (var1.getPosOffset() < var2 + var3) {
  370.                return var1.getIndex();
  371.             }
  372.  
  373.             return -1;
  374.          }
  375.  
  376.          if (var6 == null || var6.getPosOffset() > var2) {
  377.             if (var6 == null || var6.getPosOffset() >= var2 + var3) {
  378.                return var1.getFirstChild() != null ? this.getFirstVisibleEntryIndex(var1.getFirstChild(), var2, var3) : -1;
  379.             }
  380.  
  381.             if (var1.getFirstChild() != null) {
  382.                int var5 = this.getFirstVisibleEntryIndex(var1.getFirstChild(), var2, var3);
  383.                if (var5 != -1) {
  384.                   return var5;
  385.                }
  386.  
  387.                var1 = var6;
  388.             } else {
  389.                var1 = var6;
  390.             }
  391.          } else {
  392.             var1 = var6;
  393.          }
  394.       }
  395.    }
  396.  
  397.    private boolean isEntryVisible(TocEntry var1) {
  398.       TocEntry var2 = var1.getDirectParent();
  399.       if (var2 != null) {
  400.          return !var2.isOpen() ? false : this.isEntryVisible(var2);
  401.       } else {
  402.          return this.m_bVisible;
  403.       }
  404.    }
  405. }
  406.