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

  1. package hhapplet;
  2.  
  3. import XMLConsumer.IEntry;
  4. import java.awt.Color;
  5. import java.awt.Component;
  6. import java.awt.Dimension;
  7. import java.awt.Font;
  8. import java.awt.FontMetrics;
  9. import java.awt.Graphics;
  10. import java.awt.Image;
  11. import java.util.Enumeration;
  12. import java.util.Vector;
  13.  
  14. public abstract class DynListView extends ListView implements IChunkedDataListener {
  15.    private static String m_sLoadingMsg = null;
  16.    private static final Color YELLOW = new Color(255, 255, 225);
  17.    private Vector m_chunkedInfos = null;
  18.    private String m_sKeyBefore = null;
  19.    private String m_sKeyAfter = "";
  20.    private Vector m_vFakeBlocks = null;
  21.    private Vector m_vRealBlocks = null;
  22.    private String m_sCheckKey;
  23.    private int m_nLoadingChunk = 0;
  24.    private INumChunkedData[] m_aDataCon;
  25.    private int m_nCheck = 0;
  26.    private boolean m_bNeedCalc;
  27.    private boolean m_bFindCK;
  28.    private int m_nIns;
  29.    private boolean m_bScrl;
  30.    private int m_nNeeded;
  31.    private String m_sShowKey;
  32.    private boolean m_bProcess;
  33.    private boolean m_bLoading;
  34.    private int m_nItems;
  35.    private IChunkedInfo m_ciRef;
  36.    private int m_nRef;
  37.    private int m_nNeedToFindKeyIndex;
  38.    private String m_sFindKey;
  39.    private String m_sBackFindKey;
  40.    private boolean m_bBackActive;
  41.    private boolean m_bActive;
  42.    private VirtualEntry m_virtualEntry;
  43.  
  44.    protected void procResize() {
  45.       if (!this.m_bProcess) {
  46.          this.markBegin();
  47.          super.procResize();
  48.          if (this.m_nIns == -1) {
  49.             this.getUnitIdx(((ListView)this).getTop(), ((ListView)this).getVisible());
  50.          }
  51.       }
  52.  
  53.    }
  54.  
  55.    private void insertIdxKs(int var1, BlockContainer var2, boolean var3) {
  56.       int var4 = var2.getConsumed();
  57.       int var5 = var2.getCurrent();
  58.       int var6 = var4 - var5;
  59.       int var7 = 0;
  60.       int var8 = this.m_vFakeBlocks.size() - 1;
  61.       int var9 = -1;
  62.       boolean var10 = false;
  63.  
  64.       FakeItemBlock var11;
  65.       do {
  66.          var9 = var7 + var8 >> 1;
  67.          var11 = (FakeItemBlock)this.m_vFakeBlocks.elementAt(var9);
  68.          if (var11.getBegin() > var1) {
  69.             var8 = var9 - 1;
  70.          } else {
  71.             if (var11.getBegin() + var11.getNum() > var1) {
  72.                var10 = true;
  73.                break;
  74.             }
  75.  
  76.             var7 = var9 + 1;
  77.          }
  78.       } while(var8 >= var7);
  79.  
  80.       if (var10) {
  81.          int var12 = var11.getTop();
  82.          int var13 = var12 + var11.getNum();
  83.          int var14 = 0;
  84.          int var15 = var1 - var11.getBegin();
  85.          int var16 = var11.getNum() + var11.getBegin() - (var1 + var4);
  86.          int var17 = var9 + 1;
  87.          if (var15 > 0) {
  88.             var14 = var11.getNum() - var15;
  89.             var11.setNum(var15);
  90.             String var18 = var11.getKeyBefore();
  91.             var11.setKeyBefore(var2.getFirstKey());
  92.             if (var16 > 0) {
  93.                this.m_vFakeBlocks.insertElementAt(new FakeItemBlock(var1 + var4, var16, var2.getLastKey(), var18, var12 + var15 + var5), var9 + 1);
  94.                var17 = var9 + 2;
  95.             }
  96.  
  97.             this.insertRealBlock(var13 - var14, var2, var3);
  98.          } else {
  99.             this.insertRealBlock(var12, var2, var3);
  100.             if (var16 > 0) {
  101.                var11.setBegin(var1 + var4);
  102.                var14 = var11.getNum() - var16;
  103.                var11.setNum(var16);
  104.                var11.posChange(var5);
  105.                var11.setKeyAfter(var2.getLastKey());
  106.             } else {
  107.                this.m_vFakeBlocks.removeElementAt(var9);
  108.                var17 = var9;
  109.             }
  110.          }
  111.  
  112.          if (var6 > 0) {
  113.             for(int var22 = var17; var22 < this.m_vFakeBlocks.size(); ++var22) {
  114.                ((FakeItemBlock)this.m_vFakeBlocks.elementAt(var22)).posChange(-var6);
  115.             }
  116.  
  117.             int var23 = ((ListView)this).getVerticalMax();
  118.             ((ListView)this).setVerticalMax(var23 - var6);
  119.          }
  120.       }
  121.  
  122.    }
  123.  
  124.    protected void listPaint(Graphics var1, Image var2) {
  125.       int var3 = ((ListView)this).getTop();
  126.       int var4 = this.getWidth(var1);
  127.       ((ListView)this).setHorizontalMax(var4);
  128.       Vector var5 = this.getRealBlockToShow(var3, ((ListView)this).getVisible());
  129.       Enumeration var6 = var5.elements();
  130.  
  131.       while(var6.hasMoreElements()) {
  132.          RealItemBlock var7 = (RealItemBlock)var6.nextElement();
  133.          var7.display(var1, var3, ((ListView)this).getVisible(), ((ListView)this).getUnitHeight(), ((Component)this).getBackground(), var2);
  134.       }
  135.  
  136.       if (this.m_bLoading) {
  137.          this.displayLoadingMsg(var1);
  138.       }
  139.  
  140.    }
  141.  
  142.    public abstract void mergeItems(BlockContainer var1, boolean var2, INumChunkedData[] var3, int[] var4, int var5, int[] var6, int var7);
  143.  
  144.    private void endLoading() {
  145.       if (this.m_bLoading) {
  146.          this.m_bLoading = false;
  147.          ((Component)this).repaint();
  148.       }
  149.  
  150.    }
  151.  
  152.    public void findAndSelect(String var1) {
  153.       if (var1 != null && var1.length() != 0) {
  154.          if (!this.m_bProcess) {
  155.             this.m_sFindKey = var1;
  156.             this.m_bActive = false;
  157.             this.findCK();
  158.             return;
  159.          }
  160.  
  161.          this.m_sBackFindKey = var1;
  162.          this.m_bBackActive = false;
  163.       }
  164.  
  165.    }
  166.  
  167.    public void dispatchToDo(String var1) {
  168.       if (var1.equals("checkReady")) {
  169.          this.checkReady();
  170.       } else if (var1.equals("checkAgain")) {
  171.          this.checkAgain();
  172.       } else {
  173.          super.dispatchToDo(var1);
  174.       }
  175.    }
  176.  
  177.    public void putData(IChunkedData var1) {
  178.       this.endLoading();
  179.       if (this.m_nNeedToFindKeyIndex == -1) {
  180.          ((ListView)this).setTimeout("checkReady", 1);
  181.       } else {
  182.          this.m_sKeyAfter = ((INumChunkedData)var1).getKeyByPosition(this.m_nNeedToFindKeyIndex);
  183.          this.m_bNeedCalc = true;
  184.          this.m_bScrl = true;
  185.          this.m_nNeedToFindKeyIndex = -1;
  186.          if (this.m_sKeyAfter != null) {
  187.             ((ListView)this).setTimeout("checkReady", 1);
  188.          } else {
  189.             this.markEnd();
  190.             ((ListView)this).setTimeout("checkAgain", 50);
  191.          }
  192.       }
  193.    }
  194.  
  195.    private void getLimit(INumChunkedData[] var1, int[] var2, int[] var3, int[] var4, int var5) {
  196.       var3[var5] = var1[var5].getNum();
  197.       var4[var5] = -1;
  198.       if (var1[var5].getUsedItems() != null) {
  199.          var1[var5].getUsedItems().getLimit(var2, var3, var4, var5);
  200.       }
  201.  
  202.    }
  203.  
  204.    private boolean findCKInRealBlocks() {
  205.       if (this.m_sFindKey != null) {
  206.          if (this.m_vRealBlocks != null && this.m_vRealBlocks.size() > 0) {
  207.             int var1 = 0;
  208.             int var2 = this.m_vRealBlocks.size() - 1;
  209.             boolean var6 = false;
  210.  
  211.             int var3;
  212.             RealItemBlock var4;
  213.             int var5;
  214.             do {
  215.                var3 = (var1 + var2) / 2;
  216.                var4 = (RealItemBlock)this.m_vRealBlocks.elementAt(var3);
  217.                var5 = var4.getClosestEntryId(this.m_sFindKey);
  218.                if (var5 < 0) {
  219.                   var2 = var3 - 1;
  220.                } else {
  221.                   if (var5 < var4.getNum()) {
  222.                      var6 = true;
  223.                      break;
  224.                   }
  225.  
  226.                   var1 = var3 + 1;
  227.                }
  228.             } while(var1 <= var2);
  229.  
  230.             if (!var6) {
  231.                if (var3 == var1 - 1) {
  232.                   ++var3;
  233.                }
  234.  
  235.                if (var3 < this.m_vRealBlocks.size() && var3 - 1 >= 0) {
  236.                   RealItemBlock var7 = (RealItemBlock)this.m_vRealBlocks.elementAt(var3);
  237.                   String var8 = var7.getFirstKey();
  238.                   if (var8.length() > this.m_sFindKey.length() && Language.compare(var8.substring(0, this.m_sFindKey.length()), this.m_sFindKey) == 0) {
  239.                      var4 = var7;
  240.                      var5 = var7.getClosestEntryId(var8);
  241.                   } else {
  242.                      var4 = (RealItemBlock)this.m_vRealBlocks.elementAt(var3 - 1);
  243.                      var5 = var4.getClosestEntryId(var4.getLastKey());
  244.                   }
  245.                } else if (var3 >= this.m_vRealBlocks.size()) {
  246.                   var4 = (RealItemBlock)this.m_vRealBlocks.elementAt(var3 - 1);
  247.                   var5 = var4.getClosestEntryId(var4.getLastKey());
  248.                } else if (var3 - 1 < 0) {
  249.                   var4 = (RealItemBlock)this.m_vRealBlocks.elementAt(var3);
  250.                   var5 = var4.getClosestEntryId(var4.getFirstKey());
  251.                }
  252.             }
  253.  
  254.             if (var4 != null) {
  255.                int var9 = var4.getTop() + var5;
  256.                IEntry var10 = var4.getEntry(var9);
  257.                ((ListView)this).setTop(var9);
  258.                ((Component)this).repaint();
  259.                ((ListView)this).selectEntry(((ListView)this).getTop(), var9, var10);
  260.                if (this.m_bActive) {
  261.                   var10.action(this);
  262.                }
  263.             }
  264.          }
  265.  
  266.          this.m_sFindKey = this.m_sBackFindKey;
  267.          this.m_bActive = this.m_bBackActive;
  268.          if (this.m_sBackFindKey != null) {
  269.             this.m_sBackFindKey = null;
  270.             this.m_bBackActive = false;
  271.             this.findCK();
  272.             return false;
  273.          }
  274.       }
  275.  
  276.       return true;
  277.    }
  278.  
  279.    public void active() {
  280.       if (this.m_sBackFindKey != null) {
  281.          this.m_bBackActive = true;
  282.       } else if (this.m_sFindKey != null) {
  283.          this.m_bActive = true;
  284.       } else {
  285.          super.active();
  286.       }
  287.    }
  288.  
  289.    public void checkReady() {
  290.       int var1 = this.m_chunkedInfos.size();
  291.       boolean var2 = false;
  292.       int var4 = 0;
  293.       boolean var5 = this.m_sKeyBefore == null;
  294.       String var6 = var5 ? this.m_sKeyAfter : this.m_sKeyBefore;
  295.       if (var6 == null) {
  296.          this.markEnd();
  297.          ((ListView)this).setTimeout("checkAgain", 50);
  298.       } else {
  299.          INumChunkedData[] var3;
  300.          if (this.m_sCheckKey != null && var6 == this.m_sCheckKey && this.m_nLoadingChunk != 0) {
  301.             var4 = this.m_nLoadingChunk;
  302.             var3 = this.m_aDataCon;
  303.          } else {
  304.             this.m_nCheck = 0;
  305.             this.m_sCheckKey = var6;
  306.             var3 = new INumChunkedData[this.m_chunkedInfos.size()];
  307.          }
  308.  
  309.          for(int var7 = this.m_nCheck; var7 < var1; ++var7) {
  310.             INumChunkedData var8 = (INumChunkedData)((IChunkedInfo)this.m_chunkedInfos.elementAt(var7)).getChunkedData(var5, var6);
  311.             if (var8 != null) {
  312.                if (!var8.isLoaded()) {
  313.                   var2 = true;
  314.                   this.m_nLoadingChunk = var4;
  315.                   this.m_nCheck = var7;
  316.                   this.m_aDataCon = var3;
  317.                   this.beginLoading();
  318.                   var8.load(this);
  319.                   return;
  320.                }
  321.  
  322.                var3[var4++] = var8;
  323.             }
  324.          }
  325.  
  326.          if (!var2) {
  327.             int var16 = var4;
  328.             this.m_nLoadingChunk = 0;
  329.             this.m_sKeyAfter = this.m_sKeyBefore = this.m_sShowKey = null;
  330.             int[] var17 = new int[var4];
  331.             int[] var9 = new int[var4];
  332.             int[] var10 = new int[var4];
  333.             int[] var11 = new int[var4];
  334.             if (this.m_bNeedCalc || this.m_bFindCK) {
  335.                this.m_nIns = 0;
  336.             }
  337.  
  338.             for(int var12 = 0; var12 < var16; ++var12) {
  339.                INumChunkedData var13 = var3[var12];
  340.                var17[var12] = var13.getKeyPosition(var5, var6);
  341.                if (var17[var12] == -1 && !var5 || var17[var12] == var3[var12].getNum() && var5) {
  342.                   this.m_nIns = -1;
  343.                   break;
  344.                }
  345.  
  346.                if (this.m_bNeedCalc || this.m_bFindCK) {
  347.                   this.m_nIns += var17[var12] + var13.getLastIndex() - var13.getNum();
  348.                   if (!var5) {
  349.                      this.m_nIns += var3[var12].getEntry(var17[var12]).getNextSpan();
  350.                   }
  351.                }
  352.  
  353.                var9[var12] = var17[var12];
  354.                this.getLimit(var3, var17, var10, var11, var12);
  355.             }
  356.  
  357.             if (this.m_nIns != -1 || this.m_bFindCK) {
  358.                BlockContainer var18 = new BlockContainer(this.m_nNeeded);
  359.                boolean var19 = this.writeItems(var18, var3, var17, var11, var10, var5, 1);
  360.                if (var18.getConsumed() != 0) {
  361.                   this.updateUsedK(var3, var9, var17, var5);
  362.                   int var14;
  363.                   if (!var5) {
  364.                      var14 = this.m_nIns - var18.getConsumed() + 1;
  365.                   } else {
  366.                      var14 = this.m_nIns;
  367.                   }
  368.  
  369.                   this.insertIdxKs(var14, var18, this.m_bScrl);
  370.                   ((Component)this).repaint();
  371.                   this.m_bScrl = false;
  372.                   if (this.m_bFindCK) {
  373.                      this.m_bFindCK = false;
  374.                      this.m_bNeedCalc = true;
  375.                      this.m_sKeyBefore = var18.getFirstKey();
  376.                      this.m_nIns = -1;
  377.                      ((ListView)this).setTimeout("checkReady", 50);
  378.                      return;
  379.                   }
  380.                } else if (this.m_bFindCK) {
  381.                   this.m_bFindCK = false;
  382.                   this.m_bNeedCalc = true;
  383.                   this.m_sKeyBefore = this.getFirstKeyFromPos(var3, var17);
  384.                   this.m_nIns = -1;
  385.                   ((ListView)this).setTimeout("checkReady", 50);
  386.                   return;
  387.                }
  388.  
  389.                if (!this.findCKInRealBlocks()) {
  390.                   return;
  391.                }
  392.  
  393.                this.m_nNeeded -= var18.getCurrent();
  394.                if (var19) {
  395.                   this.m_nIns = -1;
  396.                   this.markEnd();
  397.                   ((ListView)this).setTimeout("checkAgain", 50);
  398.                } else {
  399.                   if (var5) {
  400.                      this.m_nIns += var18.getConsumed();
  401.                   } else {
  402.                      this.m_nIns -= var18.getConsumed();
  403.                   }
  404.  
  405.                   ((ListView)this).setTimeout("checkReady", 50);
  406.                }
  407.  
  408.                this.m_bNeedCalc = false;
  409.                return;
  410.             }
  411.  
  412.             if (!this.findCKInRealBlocks()) {
  413.                return;
  414.             }
  415.  
  416.             this.markEnd();
  417.             ((ListView)this).setTimeout("checkAgain", 50);
  418.          }
  419.  
  420.       }
  421.    }
  422.  
  423.    private IEntry getEntryByPosInternal(int var1) {
  424.       IEntry var2 = null;
  425.       Vector var3 = this.getRealBlockToShow(var1, 1);
  426.       if (var3 != null && var3.size() == 1) {
  427.          RealItemBlock var4 = (RealItemBlock)var3.elementAt(0);
  428.          var2 = var4.getEntry(var1);
  429.       }
  430.  
  431.       return var2;
  432.    }
  433.  
  434.    protected int getWidth(Graphics var1) {
  435.       int var2 = 0;
  436.       int var3 = 0;
  437.       Enumeration var4 = this.m_vRealBlocks.elements();
  438.  
  439.       while(var4.hasMoreElements()) {
  440.          RealItemBlock var5 = (RealItemBlock)var4.nextElement();
  441.          var3 = var5.getWidth(var1);
  442.          if (var3 > var2) {
  443.             var2 = var3;
  444.          }
  445.       }
  446.  
  447.       return var2;
  448.    }
  449.  
  450.    public boolean writeItems(BlockContainer var1, INumChunkedData[] var2, int[] var3, int[] var4, int[] var5, boolean var6, int var7) {
  451.       int var8 = var3.length;
  452.       int[] var9 = new int[var8];
  453.  
  454.       for(int var10 = 0; var10 < var8; ++var10) {
  455.          var9[var10] = var3[var10];
  456.       }
  457.  
  458.       int var17;
  459.       do {
  460.          String var11 = null;
  461.          int[] var12 = new int[var8];
  462.          var17 = 0;
  463.  
  464.          for(int var13 = 0; var13 < var8; ++var13) {
  465.             if (var2[var13].getNum() > 0 && var3[var13] != -1 && var6 && var3[var13] < var5[var13] || !var6 && var3[var13] > var4[var13]) {
  466.                IEntry var14 = var2[var13].getEntry(var3[var13]);
  467.                String var15 = var14.getName();
  468.                if (var11 != null && (!var6 || Language.compare(var11, var15) <= 0) && (var6 || Language.compare(var11, var15) >= 0)) {
  469.                   if (Language.compare(var11, var15) == 0) {
  470.                      var12[var17++] = var13;
  471.                   }
  472.                } else {
  473.                   var11 = var15;
  474.                   var17 = 0;
  475.                   var12[var17++] = var13;
  476.                }
  477.             } else if (var7 == 1 && var5[var13] != var4[var13]) {
  478.                if (var6 && var3[var13] == var5[var13]) {
  479.                   this.m_sKeyAfter = var2[var13].getEntry(var9[var13]).getName();
  480.                   return false;
  481.                }
  482.  
  483.                if (!var6 && var3[var13] == var4[var13]) {
  484.                   this.m_sKeyBefore = var2[var13].getEntry(var9[var13]).getName();
  485.                   return false;
  486.                }
  487.             }
  488.          }
  489.  
  490.          if (var17 >= 1) {
  491.             for(int var18 = 0; var18 < var17; ++var18) {
  492.                var9[var12[var18]] = var3[var12[var18]];
  493.             }
  494.  
  495.             this.mergeItems(var1, var6, var2, var12, var17, var3, var7);
  496.             this.adjustPosition(var6, var2, var12, var17, var3);
  497.             if (var7 == 1 && var1.getNeeded() <= var1.getCurrent()) {
  498.                return true;
  499.             }
  500.          }
  501.       } while(var17 > 0);
  502.  
  503.       return true;
  504.    }
  505.  
  506.    public abstract void adjustPosition(boolean var1, INumChunkedData[] var2, int[] var3, int var4, int[] var5);
  507.  
  508.    private Vector getRealBlockToShow(int var1, int var2) {
  509.       int var3 = 0;
  510.       int var4 = this.m_vRealBlocks.size() - 1;
  511.       int var5 = -1;
  512.       int var6 = 0;
  513.       int var7 = 0;
  514.       Vector var9 = new Vector();
  515.       boolean var10 = false;
  516.       if (this.m_vRealBlocks.size() == 0) {
  517.          return var9;
  518.       } else {
  519.          RealItemBlock var8;
  520.          do {
  521.             var5 = var3 + var4 >> 1;
  522.             var8 = (RealItemBlock)this.m_vRealBlocks.elementAt(var5);
  523.             var6 = var8.getTop();
  524.             var7 = var6 + var8.getNum();
  525.             if (var6 >= var1 + var2) {
  526.                var4 = var5 - 1;
  527.             } else {
  528.                if (var7 > var1) {
  529.                   var10 = true;
  530.                   break;
  531.                }
  532.  
  533.                var3 = var5 + 1;
  534.             }
  535.          } while(var4 >= var3);
  536.  
  537.          if (var10) {
  538.             var9.addElement(var8);
  539.  
  540.             for(int var11 = var5 - 1; var11 >= 0; --var11) {
  541.                var8 = (RealItemBlock)this.m_vRealBlocks.elementAt(var11);
  542.                var6 = var8.getTop();
  543.                var7 = var6 + var8.getNum();
  544.                if (var7 <= var1) {
  545.                   break;
  546.                }
  547.  
  548.                var9.addElement(var8);
  549.             }
  550.  
  551.             for(int var20 = var5 + 1; var20 < this.m_vRealBlocks.size(); ++var20) {
  552.                var8 = (RealItemBlock)this.m_vRealBlocks.elementAt(var20);
  553.                var6 = var8.getTop();
  554.                int var10000 = var6 + var8.getNum();
  555.                if (var6 >= var1 + var2) {
  556.                   break;
  557.                }
  558.  
  559.                var9.addElement(var8);
  560.             }
  561.          }
  562.  
  563.          return var9;
  564.       }
  565.    }
  566.  
  567.    private void insertRealBlock(int var1, BlockContainer var2, boolean var3) {
  568.       RealItemBlock var4 = new RealItemBlock(var1, var2);
  569.       int var5 = 0;
  570.       int var6 = this.m_vRealBlocks.size() - 1;
  571.       int var7 = 0;
  572.       boolean var8 = false;
  573.  
  574.       while(var6 >= var5) {
  575.          var7 = var5 + var6 >> 1;
  576.          RealItemBlock var9 = (RealItemBlock)this.m_vRealBlocks.elementAt(var7);
  577.          RealItemBlock var10;
  578.          if (var7 + 1 <= var6) {
  579.             var10 = (RealItemBlock)this.m_vRealBlocks.elementAt(var7 + 1);
  580.          } else {
  581.             var10 = null;
  582.          }
  583.  
  584.          if (var9.getTop() > var1) {
  585.             var6 = var7 - 1;
  586.          } else {
  587.             if (var10 == null || var10.getTop() >= var1) {
  588.                ++var7;
  589.                var8 = true;
  590.                break;
  591.             }
  592.  
  593.             var5 = var7 + 1;
  594.          }
  595.       }
  596.  
  597.       this.m_vRealBlocks.insertElementAt(var4, var7);
  598.       int var11 = var2.getConsumed() - var2.getCurrent();
  599.       if (var11 != 0) {
  600.          for(int var12 = var7 + 1; var12 < this.m_vRealBlocks.size(); ++var12) {
  601.             RealItemBlock var14 = (RealItemBlock)this.m_vRealBlocks.elementAt(var12);
  602.             var14.posChange(-var11);
  603.          }
  604.       }
  605.  
  606.       if (var3) {
  607.          ((ListView)this).setTop(var1);
  608.       }
  609.  
  610.       if (this.m_virtualEntry != null) {
  611.          IEntry var15 = this.getEntryByPosInternal(this.m_virtualEntry.getPos());
  612.          if (var15 != null) {
  613.             this.m_virtualEntry.fillReal(var15);
  614.             this.m_virtualEntry = null;
  615.          }
  616.       }
  617.  
  618.    }
  619.  
  620.    private void displayLoadingMsg(Graphics var1) {
  621.       Color var2 = var1.getColor();
  622.       Font var3 = var1.getFont();
  623.       Font var4 = new Font(var3.getName(), var3.getStyle() | 1, var3.getSize() + 1);
  624.       var1.setFont(var4);
  625.       FontMetrics var5 = var1.getFontMetrics();
  626.       int var6 = var5.stringWidth(m_sLoadingMsg);
  627.       var1.setColor(Color.black);
  628.       var1.drawRect(2, 2, var6 + 3, var5.getHeight() + 3);
  629.       var1.setColor(YELLOW);
  630.       var1.fillRect(3, 3, var6 + 2, var5.getHeight() + 2);
  631.       var1.setColor(Color.black);
  632.       var1.drawString(m_sLoadingMsg, 3, 3 + var5.getLeading() + var5.getAscent());
  633.       var1.setColor(var2);
  634.       var1.setFont(var3);
  635.    }
  636.  
  637.    protected void procClicked() {
  638.       if (!this.m_bProcess) {
  639.          super.procClicked();
  640.       }
  641.  
  642.    }
  643.  
  644.    private void beginLoading() {
  645.       this.m_bLoading = true;
  646.    }
  647.  
  648.    public DynListView(Vector var1) {
  649.       if (m_sLoadingMsg == null) {
  650.          m_sLoadingMsg = ResourceLib.GetRes("LoadingData");
  651.       }
  652.  
  653.       this.m_chunkedInfos = var1;
  654.       this.m_bProcess = false;
  655.       this.m_bLoading = false;
  656.       this.m_nNeedToFindKeyIndex = -1;
  657.       this.m_nIns = -1;
  658.       this.m_vFakeBlocks = new Vector();
  659.       this.m_vRealBlocks = new Vector();
  660.       ((ListView)this).setUnitHeight(16);
  661.       this.init();
  662.    }
  663.  
  664.    public void checkAgain() {
  665.       if (!this.m_bProcess) {
  666.          if (this.m_sBackFindKey != null) {
  667.             this.m_sFindKey = this.m_sBackFindKey;
  668.             this.m_bActive = this.m_bBackActive;
  669.             this.m_sBackFindKey = null;
  670.             this.m_bBackActive = false;
  671.             this.findCK();
  672.          } else {
  673.             this.markBegin();
  674.             this.getUnitIdx(((ListView)this).getTop(), ((ListView)this).getVisible());
  675.          }
  676.       } else {
  677.          ((ListView)this).setTimeout("checkAgain", 50);
  678.       }
  679.    }
  680.  
  681.    protected void procMoved() {
  682.       if (!this.m_bProcess) {
  683.          super.procMoved();
  684.       }
  685.  
  686.    }
  687.  
  688.    private void markBegin() {
  689.       this.m_bProcess = true;
  690.    }
  691.  
  692.    private int getTotalNum() {
  693.       int var1 = 0;
  694.       Enumeration var2 = this.m_chunkedInfos.elements();
  695.  
  696.       while(var2.hasMoreElements()) {
  697.          Object var3 = var2.nextElement();
  698.          if (var3 instanceof IChunkedInfo) {
  699.             var1 += ((IChunkedInfo)var3).getTotalNum();
  700.          }
  701.       }
  702.  
  703.       return var1;
  704.    }
  705.  
  706.    protected IEntry getEntryByPos(int var1) {
  707.       Object var2 = this.getEntryByPosInternal(var1);
  708.       if (var2 == null) {
  709.          this.m_virtualEntry = new VirtualEntry(var1);
  710.          var2 = this.m_virtualEntry;
  711.       }
  712.  
  713.       return (IEntry)var2;
  714.    }
  715.  
  716.    private String getFirstKeyFromPos(INumChunkedData[] var1, int[] var2) {
  717.       int var3 = var2.length;
  718.       String var4 = Language.getBiggestChar();
  719.  
  720.       for(int var5 = 0; var5 < var3; ++var5) {
  721.          if (var1[var5].getNum() > 0 && var2[var5] >= 0 && var2[var5] < var1[var5].getNum()) {
  722.             IEntry var6 = var1[var5].getEntry(var2[var5]);
  723.             String var7 = var6.getName();
  724.             if (var4 == null || Language.compare(var4, var7) > 0) {
  725.                var4 = var7;
  726.             }
  727.          }
  728.       }
  729.  
  730.       return var4;
  731.    }
  732.  
  733.    private String getEndString() {
  734.       String var1 = Language.getBiggestChar();
  735.       String var2 = var1 + var1 + var1 + var1 + var1 + var1 + var1 + var1;
  736.       return var2;
  737.    }
  738.  
  739.    private void updateUsedK(INumChunkedData[] var1, int[] var2, int[] var3, boolean var4) {
  740.       for(int var5 = 0; var5 < var2.length; ++var5) {
  741.          int var6 = 0;
  742.          int var7 = 0;
  743.          if (var4) {
  744.             var6 = var2[var5];
  745.             var7 = var3[var5] - 1;
  746.          } else {
  747.             if (var3[var5] != -1) {
  748.                var6 = var3[var5] + var1[var5].getEntry(var3[var5]).getNextSpan() + 1;
  749.             } else {
  750.                var6 = 0;
  751.             }
  752.  
  753.             var7 = var2[var5] + var1[var5].getEntry(var2[var5]).getNextSpan();
  754.          }
  755.  
  756.          if (var6 <= var7) {
  757.             var1[var5].getUsedItems().addUsedItem(var6, var7);
  758.             if (var1[var5].getUsedItems().isCovered(0, var1[var5].getNum() - 1)) {
  759.                var1[var5].setDone(true);
  760.             }
  761.          }
  762.       }
  763.  
  764.    }
  765.  
  766.    private void getUnitIdx(int var1, int var2) {
  767.       if (this.m_vFakeBlocks.size() == 0) {
  768.          this.markEnd();
  769.       } else {
  770.          int var3 = 0;
  771.          int var4 = this.m_vFakeBlocks.size() - 1;
  772.          int var5 = -1;
  773.          int var6 = 0;
  774.          int var7 = 0;
  775.          boolean var9 = false;
  776.  
  777.          FakeItemBlock var8;
  778.          do {
  779.             var5 = var3 + var4 >> 1;
  780.             var8 = (FakeItemBlock)this.m_vFakeBlocks.elementAt(var5);
  781.             var6 = var8.getTop();
  782.             var7 = var6 + var8.getNum();
  783.             if (var6 >= var1 + var2) {
  784.                var4 = var5 - 1;
  785.             } else {
  786.                if (var7 > var1) {
  787.                   var9 = true;
  788.                   break;
  789.                }
  790.  
  791.                var3 = var5 + 1;
  792.             }
  793.          } while(var4 >= var3);
  794.  
  795.          if (var9) {
  796.             if (var6 >= var1) {
  797.                this.m_sKeyAfter = var8.getKeyAfter();
  798.                this.m_nNeeded = var2 - var6 + var1;
  799.                this.m_nIns = var8.getBegin();
  800.                this.checkReady();
  801.             } else if (var7 <= var1 + var2) {
  802.                this.m_sKeyBefore = var8.getKeyBefore();
  803.                this.m_nNeeded = var7 - var1;
  804.                this.m_bNeedCalc = true;
  805.                this.checkReady();
  806.             } else {
  807.                this.m_nNeeded = ((ListView)this).getVisible();
  808.                int var10 = var8.getBegin() + (var1 - var6);
  809.                this.showItemsInEvaluation(var10);
  810.             }
  811.          } else {
  812.             this.markEnd();
  813.          }
  814.       }
  815.    }
  816.  
  817.    protected void procScroll() {
  818.       if (!this.m_bProcess) {
  819.          this.markBegin();
  820.          this.getUnitIdx(((ListView)this).getTop(), ((ListView)this).getVisible());
  821.          super.procScroll();
  822.       }
  823.  
  824.    }
  825.  
  826.    private void findCK() {
  827.       if (this.m_sFindKey != null) {
  828.          this.m_sKeyAfter = this.m_sFindKey;
  829.          this.m_bFindCK = true;
  830.          this.m_nNeeded = 1;
  831.          if (!this.m_bProcess) {
  832.             this.markBegin();
  833.          }
  834.  
  835.          this.checkReady();
  836.       }
  837.  
  838.    }
  839.  
  840.    public Dimension getPreferredSize() {
  841.       return ((Component)this).getParent().getSize();
  842.    }
  843.  
  844.    private void init() {
  845.       this.m_nNeeded = 100;
  846.       this.m_nItems = this.getTotalNum();
  847.       this.m_vFakeBlocks.addElement(new FakeItemBlock(0, this.m_nItems, "", this.getEndString(), 0));
  848.       ((ListView)this).setVerticalMax(this.m_nItems);
  849.       this.getMaxChunkInfo();
  850.    }
  851.  
  852.    private void markEnd() {
  853.       if (this.m_bProcess) {
  854.          this.m_bProcess = false;
  855.          BsscHelpRedirector.showStatus(ResourceLib.GetRes("Done"));
  856.       }
  857.  
  858.    }
  859.  
  860.    private void getMaxChunkInfo() {
  861.       int var1 = 0;
  862.       IChunkedInfo var2 = null;
  863.       Enumeration var3 = this.m_chunkedInfos.elements();
  864.  
  865.       while(var3.hasMoreElements()) {
  866.          Object var4 = var3.nextElement();
  867.          if (var4 instanceof IChunkedInfo) {
  868.             int var5 = ((IChunkedInfo)var4).getTotalNum();
  869.             if (var5 > var1) {
  870.                var2 = (IChunkedInfo)var4;
  871.                var1 = var5;
  872.             }
  873.          }
  874.       }
  875.  
  876.       this.m_nRef = var1;
  877.       this.m_ciRef = var2;
  878.    }
  879.  
  880.    private void showItemsInEvaluation(int var1) {
  881.       if (this.m_nItems != 0) {
  882.          double var2 = (double)var1 / (double)this.m_nItems;
  883.          int var4 = (int)Math.floor(var2 * (double)this.m_nRef);
  884.          INumChunkedData var5 = (INumChunkedData)this.m_ciRef.getChunkByIdx(var4);
  885.          if (var5 != null) {
  886.             if (!var5.isLoaded()) {
  887.                this.m_nNeedToFindKeyIndex = var4;
  888.                this.beginLoading();
  889.                var5.load(this);
  890.             } else {
  891.                this.m_sKeyAfter = var5.getKeyByPosition(var4);
  892.                if (this.m_sKeyAfter != null) {
  893.                   this.m_bNeedCalc = true;
  894.                   this.m_bScrl = true;
  895.                   this.checkReady();
  896.                } else {
  897.                   this.markEnd();
  898.                   ((ListView)this).setTimeout("checkAgain", 50);
  899.                }
  900.             }
  901.          } else {
  902.             this.markEnd();
  903.             ((ListView)this).setTimeout("checkAgain", 50);
  904.          }
  905.       } else {
  906.          this.markEnd();
  907.          ((ListView)this).setTimeout("checkAgain", 50);
  908.       }
  909.    }
  910. }
  911.