home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / VCAFE.3.0A / Main.bin / ImageListBox.java < prev    next >
Text File  |  1998-12-02  |  115KB  |  3,600 lines

  1. package symantec.itools.awt;
  2.  
  3.  
  4. import java.awt.Panel;
  5. import java.awt.Dimension;
  6. import java.awt.Component;
  7. import java.awt.Image;
  8. import java.awt.Graphics;
  9. import java.awt.Scrollbar;
  10. import java.awt.Font;
  11. import java.awt.FontMetrics;
  12. import java.awt.Color;
  13. import java.awt.Rectangle;
  14. import java.awt.SystemColor;
  15. import java.util.Vector;
  16. import java.awt.image.MemoryImageSource;
  17. import java.awt.event.MouseEvent;
  18. import java.awt.event.KeyEvent;
  19. import java.awt.event.ActionEvent;
  20. import java.awt.event.ActionListener;
  21. import java.awt.event.ItemEvent;
  22. import java.awt.event.ItemListener;
  23. import java.awt.event.AdjustmentEvent;
  24. import java.beans.PropertyVetoException;
  25. import java.beans.PropertyChangeListener;
  26. import java.beans.VetoableChangeListener;
  27. import java.awt.AWTEvent;
  28. import java.awt.AWTEventMulticaster;
  29. import java.net.URL;
  30. import symantec.itools.awt.util.ColorUtils;
  31. import java.util.ResourceBundle;
  32. import java.text.MessageFormat;
  33.  
  34. //     03/02/97    RKM    In ctor, make certain bar size is correct for Macs
  35. //     03/21/97    RKM    Removed repaint hack from paint
  36. //     03/21/97    LAB    Updated to Java 1.1.  Removed setDirectNotify(boolean bDirectNotify),
  37. //                    as it is not needed with the new event model.
  38. //     07/18/97    LAB    Added add/removeNotify to handle event listener registration.
  39. //  07/29/97    CAR marked fields transient as needed
  40. //                  inner adaptor classes implement java.io.Serializable
  41. //                  implemented readObject
  42. //                  added property imageURL (ListItem needs to store URL in addition to Image for serialization)
  43. //  08/09/97    LAB    Removed ListBoxFont property and made the standard Font property do it's work. Removed
  44. //                    DisabledTextColor property.  Removed DefaultEnabledTextColor property.  Added a getter to the
  45. //                    EnabledTextColor property.  Removed dependency on bOsFlag private data member.  Removed the bOsFlag
  46. //                    member. Removed SelectImage and dependencies.  Removed default initialization of Font and
  47. //                    Background color in the constructor.  Now hide the scrollbars before adding them to their
  48. //                    container.  Made the border calculate it's colors based on the background color. Deprecated
  49. //                    preferredSize and minimumSize methods in favor of getPreferredSize and getMinimumSize.
  50. //    08/15/97    LAB    Reworked the way colors were calculated to avoid NullPointerExceptions,
  51. //                    and potential redraw problems.  Now colors are recalculated in paint,
  52. //                    if needed.
  53. //  08/22/97    CAR Fixed bug re: scrollbars were scrolling in the reverse directions
  54. //                  Fixed bug on Windows platform re: ImageListBox in combomode would not display all of list
  55. //                  Fixed bug on Windows platform re: Scrollbars would not appear
  56. //                  Fixed bug in setSelectedItem re: item was not selected or highlighted
  57. //                  Fixed bug in setSelectedIndex re: first item selected was not highlighted
  58. //                  Fixed bug in delSelectedItem re: item not deleted and NegativeArraySizeException
  59. //                  for non-multiple selection and ArrayIndexOUtOfBoundsException for multiple selection
  60. //  08/25/97     ADI Fixed bug Scrollbars:
  61. //                  VBar.setValues(nTopRow, visibleRows, 0, nItems - visibleRows);
  62. //                  modified in:
  63. //                  VBar.setValues(nTopRow, visibleRows, 0, nItems);
  64. //  08/31/97    CAR Fixed bug re: selection of item while multiple selection set to true leads to ArrayIndexOutOfBoundsException
  65. //                  Fixed bug re: last item in multiple selection will not delete
  66. //                  Fixed bug re: after deleting an item that index could not be re-selected w/o first selecting another item
  67. //    09/23/97    RKM    Fixed bug in setFont - was not handling setFont(null)
  68. //    10/01/97    LAB    Fixed a bug where the barSize variable was not getting set correctly, which
  69. //                    resulted in the scrollbars not showing up properly (Addresses Mac Bug #7571
  70. //                    and #7538).  Fixed a bug when in ComboBoxMode, you could autoscroll down,
  71. //                    but not up (changed yAdj from 0 in setComboBoxMode).  Added accessors for
  72. //                    CellHeight and BorderWidth to allow ComboBox (and anyone else) to access them.
  73. //                    Removed the use of yAdj everywhere except in mouseCalcIndex where its use
  74. //                    makes sense.
  75. //  03/02/98    DS  Added isFocusedTraversable & call to RequestFocus to MousePressed
  76. //  12/02/98    MSH Fixed a bug in SetVisibleIndex() that caused an exception in Calendar if the month was set to November.
  77. //                  This problem is probably reproducable using a standard combo box.  #68795
  78.  
  79. /**
  80.  * A box containing a list of images and/or text.
  81.  * <p>
  82.  * Use an ImageListBox to display a set of images and/or text that the user
  83.  * can select.
  84.  * The user cannot enter text in an ImageListBox.
  85.  * <p>
  86.  * @version 1.1, June 7, 1997
  87.  * @author Symantec
  88.  */
  89. public class ImageListBox extends Panel implements java.awt.ItemSelectable
  90. {
  91.     /**
  92.      * The ID of the event posted when the image portion of a list item
  93.      * is selected.
  94.      */
  95.     public static final int EVT_IMAGE_SELECT = 0x4004;
  96.  
  97.     /**
  98.      * Defines the "regular" (lowered) border style. This makes the list box
  99.      * appear lower than the surrounding area.
  100.      * @see #setBorderType
  101.      * @see #getBorderType
  102.      */
  103.     public static final int BORDER_REGULAR = 0;
  104.  
  105.     /**
  106.      * Defines the "no border" style. This indicates the list box will have no
  107.      * border drawn around it.
  108.      * @see #setBorderType
  109.      * @see #getBorderType
  110.      */
  111.     public static final int BORDER_NONE = 1;
  112.  
  113.     /**
  114.      * Defines the width of all images displayed in the list, in pixels.
  115.      */
  116.     public static final int IMAGE_WIDTH = 19;
  117.  
  118.     /**
  119.      * Constructs a default ImageListBox.
  120.      * A default ImageListBox has no label, will size to show all of the
  121.      * existing list items when automatically laid out, and allows single list
  122.      * item selection.
  123.      */
  124.     public ImageListBox()
  125.     {
  126.         this("", -1, false);
  127.     }
  128.  
  129.     /**
  130.      * Constructs an ImageListBox with the specified label. It will size to show
  131.      * all of the existing list items when automatically laid out, and allows
  132.      * single list item selection.
  133.      * Note: he label of an ImageListBox does not get displayed.
  134.      *
  135.      * @param label the label of the list box (not displayed)
  136.      */
  137.     public ImageListBox(String label)
  138.     {
  139.         this(label, -1, false);
  140.     }
  141.  
  142.     /**
  143.      * Constructs an ImageListBox with the specified label and
  144.      * conditionally allows multiple selections.
  145.      * It will size to show all of the existing list items when
  146.      * automatically laid out.
  147.      * Note: the label of an ImageListBox does not get displayed.
  148.      * @param label the name label of the list box (not displayed)
  149.      * @param bMultipleSelections if true then multiple selections are allowed;
  150.      * if false only single item selections are allowed
  151.      */
  152.     public ImageListBox(String label, boolean bMultipleSelections)
  153.     {
  154.         this(label, -1, bMultipleSelections);
  155.     }
  156.  
  157.     /**
  158.      * Constructs an ImageListBox with the specified label, the
  159.      * specified number of visible rows,  and conditionally allows multiple
  160.      * list item selection.
  161.      * @param slabel the label of the list box (not displayed)
  162.      * @param rows the number of row items to show.  If rows is less than or equal
  163.      * to zero,
  164.      * it will size to show all of the existing list items when
  165.      * automatically laid out.
  166.      * @param bMultipleSelections if true then multiple selections are allowed;
  167.      * if false only single item selections are allowed
  168.      */
  169.     public ImageListBox(String slabel, int rows, boolean bMultipleSelections)
  170.     {
  171.         items = new Vector();
  172.  
  173.         ilbLabel = slabel;
  174.         rowsToShow = rows;
  175.         this.bMultipleSelections = bMultipleSelections;
  176.  
  177.         setLayout(null);
  178.  
  179.         VBar = new Scrollbar();
  180.         VBar.setBackground(SystemColor.control);
  181.         VBar.hide();
  182.         add(VBar);
  183.  
  184.         HBar = new Scrollbar(Scrollbar.HORIZONTAL);
  185.         HBar.setBackground(SystemColor.control);
  186.         HBar.hide();
  187.         add(HBar);
  188.  
  189.         //Initilize the cached color.
  190.         cachedBackground    = getBackground();
  191.      }
  192.  
  193.     /**
  194.      * @deprecated
  195.      * see constructor ImageListBox(String slabel, int rows, boolean bMultipleSelections)
  196.      */
  197.     public ImageListBox(Component parent, String slabel, int rows, boolean bMultipleSelections)
  198.     {
  199.         this(slabel, rows, bMultipleSelections);
  200.     }
  201.  
  202.     /**
  203.      * @deprecated
  204.      * see constructor ImageListBox(String slabel, int rows, boolean bMultipleSelections)
  205.      */
  206.     public ImageListBox(Component parent, String label)
  207.     {
  208.         this(label);
  209.     }
  210.  
  211.     //--------------------------------------------------
  212.     // accessor methods
  213.     //--------------------------------------------------
  214.  
  215.     /**
  216.      * Sets ImageListBox "ComboBox mode".
  217.      * "ComboBox mode" allows the selection point to follow
  218.      * the mouse even when the mouse button is not down.
  219.      * This only applies when the ImageListBox is not allowing multiple
  220.      * selections.
  221.      * @exception PropertyVetoException
  222.      * if the specified property value is unacceptable
  223.      * @see #isComboMode
  224.      */
  225.     public void setComboMode(boolean cond) throws PropertyVetoException
  226.     {
  227.         if(bComboMode != cond)
  228.         {
  229.             Boolean oldValue = new Boolean(bComboMode);
  230.             Boolean newValue = new Boolean(cond);
  231.  
  232.             vetos.fireVetoableChange("ComboMode", oldValue, newValue);
  233.  
  234.             bComboMode = cond;
  235.             yAdj = 3;
  236.             invalidate();
  237.  
  238.             changes.firePropertyChange("ComboMode", oldValue, newValue);
  239.         }
  240.     }
  241.  
  242.     /**
  243.      * Gets the current "ComboBox mode" setting.
  244.      * "ComboBox mode" allows the selection point to follow
  245.      * the mouse even when the mouse button is not down.
  246.      * This only applies when the ImageListBox is not allowing multiple
  247.      * selections.
  248.      * @return true if in "ComboBox mode", otherwise false
  249.      * @see #setComboMode
  250.      */
  251.     public boolean isComboMode()
  252.     {
  253.         return bComboMode;
  254.     }
  255.  
  256.     /**
  257.      * @deprecated
  258.      * @see #isComboMode
  259.      */
  260.     public boolean getComboMode()
  261.     {
  262.         return isComboMode();
  263.     }
  264.  
  265.     /**
  266.      * Sets the number of rows to display in the ImageListBox.
  267.      * This affects the dimensions returned by getPreferredSize and determines
  268.      * the number of rows displayed when this component is automatically laid out.
  269.      * @param rows number of rows to automatically display
  270.      * @exception PropertyVetoException
  271.      * if the specified property value is unacceptable
  272.      * @see #getRowsToShow
  273.      */
  274.     public void setRowsToShow(int rows) throws PropertyVetoException
  275.     {
  276.         if(rowsToShow != rows)
  277.         {
  278.             Integer oldValue = new Integer(rowsToShow);
  279.             Integer newValue = new Integer(rows);
  280.  
  281.             vetos.fireVetoableChange("RowsToShow", oldValue, newValue);
  282.  
  283.             rowsToShow = rows;
  284.             invalidate();
  285.  
  286.             changes.firePropertyChange("RowsToShow", oldValue, newValue);
  287.         }
  288.     }
  289.  
  290.     /**
  291.      * Gets the current number of rows to display.
  292.      * This affects the dimensions returned by getPreferredSize and determines
  293.      * the number of rows displayed when this component is automatically laid out.
  294.      * @return the current number of rows to automatically display
  295.      * @see #setRowsToShow
  296.      */
  297.     public int getRowsToShow()
  298.     {
  299.         return rowsToShow;
  300.     }
  301.  
  302.     /**
  303.      * Sets the vertical scrollbar visibility flag.
  304.      * @param cond if true, the vertical scrollbar will be made
  305.      * visible when necessary; if false, the vertical scrollbar
  306.      * will never be made visible
  307.      * @exception PropertyVetoException
  308.      * if the specified property value is unacceptable
  309.      * @see #isShowVerticalScroll
  310.      */
  311.     public void setShowVerticalScroll(boolean cond) throws PropertyVetoException
  312.     {
  313.         if(bAllowShowVBar != cond)
  314.         {
  315.             Boolean oldValue = new Boolean(bAllowShowVBar);
  316.             Boolean newValue = new Boolean(cond);
  317.  
  318.             vetos.fireVetoableChange("ShowVerticalScroll", oldValue, newValue);
  319.  
  320.             bAllowShowVBar = cond;
  321.             invalidate();
  322.  
  323.             changes.firePropertyChange("ShowVerticalScroll", oldValue, newValue);
  324.         }
  325.     }
  326.  
  327.     /**
  328.      * Gets the current vertical scrollbar visibility flag.
  329.      * @return true if the vertical scrollbar will be made
  330.      * visible when necessary; false if the vertical scrollbar
  331.      * will never be made visible
  332.      * @see #setShowVerticalScroll
  333.      */
  334.     public boolean isShowVerticalScroll()
  335.     {
  336.         return bAllowShowVBar;
  337.     }
  338.  
  339.     /**
  340.      * @deprecated
  341.      * @see #isShowVerticalScroll
  342.      */
  343.     public boolean getShowVerticalScroll()
  344.     {
  345.         return isShowVerticalScroll();
  346.     }
  347.  
  348.     /**
  349.      * Sets the horizontal scrollbar visibility flag.
  350.      * @param cond if true, the horizontal scrollbar will be made
  351.      * visible when necessary; if false, the horizontal scrollbar
  352.      * will never be made visible
  353.      * @exception PropertyVetoException
  354.      * if the specified property value is unacceptable
  355.      * @see #isShowHorizontalScroll
  356.      */
  357.     public void setShowHorizontalScroll(boolean cond) throws PropertyVetoException
  358.     {
  359.         if(bAllowShowHBar != cond)
  360.         {
  361.             Boolean oldValue = new Boolean(bAllowShowHBar);
  362.             Boolean newValue = new Boolean(cond);
  363.  
  364.             vetos.fireVetoableChange("ShowHorizontalScroll", oldValue, newValue);
  365.  
  366.             bAllowShowHBar = cond;
  367.             invalidate();
  368.  
  369.             changes.firePropertyChange("ShowHorizontalScroll", oldValue, newValue);
  370.         }
  371.     }
  372.  
  373.     /**
  374.      * Gets the current horizontal scrollbar visibility flag.
  375.      * @return true if the horizontal scrollbar will be made
  376.      * visible when necessary; false if the horizontal scrollbar
  377.      * will never be made visible
  378.      * @see #setShowHorizontalScroll
  379.      */
  380.     public boolean isShowHorizontalScroll()
  381.     {
  382.         return bAllowShowHBar;
  383.     }
  384.  
  385.     /**
  386.      * @deprecated
  387.      * @see #isShowHorizontalScroll
  388.      */
  389.     public boolean getShowHorizontalScroll()
  390.     {
  391.         return isShowHorizontalScroll();
  392.     }
  393.  
  394.     /**
  395.      * Sets the border type of the ImageListBox.
  396.      * A regular border makes the list box appear lower than the surrounding area.
  397.      * @param type new border type, BORDER_REGULAR or BORDER_NONE
  398.      * @exception PropertyVetoException
  399.      * if the specified property value is unacceptable
  400.      * @see #getBorderType
  401.      * @see #BORDER_REGULAR
  402.      * @see #BORDER_NONE
  403.      */
  404.     public void setBorderType(int type) throws PropertyVetoException
  405.     {
  406.         if(borderType != type)
  407.         {
  408.             Integer oldValue = new Integer(borderType);
  409.             Integer newValue = new Integer(type);
  410.  
  411.             vetos.fireVetoableChange("BorderType", oldValue, newValue);
  412.  
  413.             borderType = type;
  414.             if (type == BORDER_REGULAR)
  415.             {
  416.                 borderWidth = 4;
  417.                 halfBorderWidth = 2;
  418.             }
  419.             else
  420.             {
  421.                 borderWidth = 0;
  422.                 halfBorderWidth = 0;
  423.             }
  424.             invalidate();
  425.  
  426.             changes.firePropertyChange("BorderType", oldValue, newValue);
  427.         }
  428.     }
  429.  
  430.     /**
  431.      * Gets the current border type of the ImageListBox.
  432.      * A regular border makes the list box appear lower than the surrounding area.
  433.      * @return the current border type, BORDER_REGULAR or BORDER_NONE
  434.      * @see #setBorderType
  435.      * @see #BORDER_REGULAR
  436.      * @see #BORDER_NONE
  437.      */
  438.     public int getBorderType()
  439.     {
  440.         return borderType;
  441.     }
  442.  
  443.     /**
  444.      * Conditionally show a border around the cell at the specified index.
  445.      * Cell borders are always shown as a solid single-pixel wide line around
  446.      * the cell.
  447.      * @param index the zero-relative index of the cell
  448.      * @param bOn true to show the cell borders; false to not show them
  449.      * @exception PropertyVetoException
  450.      * if the specified property value is unacceptable
  451.      * @see #setCellBorders
  452.      */
  453.     public void setCellBorder(int index, boolean bOn) throws PropertyVetoException
  454.     {
  455.         if (validIndex(index))
  456.         {
  457.             ListItem li = (ListItem) items.elementAt(index);
  458.             if (li.bCellBorder != bOn)
  459.             {
  460.                 Boolean oldValue = new Boolean(li.bCellBorder);
  461.                 Boolean newValue = new Boolean(bOn);
  462.                 vetos.fireVetoableChange("CellBorder", oldValue, newValue);
  463.                 li.bCellBorder = bOn;
  464.                 li.bDirty = true;
  465.                 invalidate();
  466.                 changes.firePropertyChange("CellBorder", oldValue, newValue);
  467.             }
  468.         }
  469.     }
  470.  
  471.     /**
  472.      * Sets the ImageListBox cell border display default, and
  473.      * resets all items to have the border conditionally.
  474.      * Cell borders are always shown as a solid single-pixel wide line around
  475.      * the cell.
  476.      * @param bOn true for "grid lines on by default" mode,
  477.      * false for "grid lines off by default" mode.
  478.      * @exception PropertyVetoException
  479.      * if the specified property value is unacceptable
  480.      * @see #setCellBorder
  481.      * @see #isCellBorders
  482.      */
  483.     public void setCellBorders(boolean bOn) throws PropertyVetoException
  484.     {
  485.         if(bCellBorders != bOn)
  486.         {
  487.             Boolean oldValue = new Boolean(bCellBorders);
  488.             Boolean newValue = new Boolean(bOn);
  489.             vetos.fireVetoableChange("CellBorders", oldValue, newValue);
  490.  
  491.             bCellBorders = bOn;
  492.  
  493.             int s = items.size();
  494.             ListItem li = null;
  495.  
  496.             for (int x = 0; x < s; x++)
  497.             {
  498.                 li = (ListItem) items.elementAt(x);
  499.                 li.bCellBorder = bOn;
  500.             }
  501.             bAllDirty = true;
  502.             invalidate();
  503.             changes.firePropertyChange("CellBorders", oldValue, newValue);
  504.         }
  505.     }
  506.  
  507.     /**
  508.      * Gets the current default cell border display mode.
  509.      * Cell borders are always shown as a solid single-pixel wide line around
  510.      * the cell.
  511.      * @return true if the "grid lines on by default" mode is on, otherwise false
  512.      * @see #setCellBorders
  513.      */
  514.     public boolean isCellBorders()
  515.     {
  516.         return bCellBorders;
  517.     }
  518.  
  519.     /**
  520.      * @deprecated
  521.      * @see #isCellBorders
  522.      */
  523.     public boolean getCellBorders()
  524.     {
  525.         return isCellBorders();
  526.     }
  527.  
  528.     /**
  529.      * Sets the text color for an item at the given index.
  530.      * @param index the zero-relative index of the item
  531.      * @param color the color, null to use the default text color
  532.      * @exception PropertyVetoException
  533.      * if the specified property value is unacceptable
  534.      */
  535.     public void setEnabledTextColor(int index, Color color) throws PropertyVetoException
  536.     {
  537.         if (validIndex(index))
  538.         {
  539.             ListItem tempItem = ((ListItem)items.elementAt(index));
  540.             if (!symantec.itools.util.GeneralUtils.objectsEqual(tempItem, color))
  541.             {
  542.                 Color oldValue = tempItem.color;
  543.  
  544.                 vetos.fireVetoableChange("EnabledTextColor", oldValue, color);
  545.  
  546.                 tempItem.color = color;
  547.  
  548.                 changes.firePropertyChange("EnabledTextColor", oldValue, color);
  549.             }
  550.         }
  551.     }
  552.  
  553.     /**
  554.      * Gets the text color for an item at the given index.
  555.      * @param index the zero-relative index of the item
  556.      * @return the color, null if the default text color is used
  557.      * or the index is not valid.
  558.      */
  559.     public Color getEnabledTextColor(int index)
  560.     {
  561.         if (validIndex(index))
  562.         {
  563.             ListItem tempItem = ((ListItem)items.elementAt(index));
  564.  
  565.             return(tempItem.color);
  566.         }
  567.         return null;
  568.     }
  569.  
  570.     /**
  571.      * Sets the mode of the ImageListBox to "MultiColumnListBox
  572.      * mode".  This method always sets the border type to BORDER_NONE,
  573.      * the "ComboBox mode" to be false,
  574.      * and conditionally sets whether the grid should be displayed.
  575.      * @param bCellBorders true to display the cell grid,
  576.      * false to not display the grid
  577.      * @exception PropertyVetoException
  578.      * if the specified property value is unacceptable
  579.      * @see #BORDER_NONE
  580.      */
  581.     public synchronized void setMultiColumnMode(boolean bCellBorders) throws PropertyVetoException
  582.     {
  583.         if(isCellBorders() != bCellBorders)
  584.         {
  585.             setComboMode(false);
  586.             setBorderType(BORDER_NONE);
  587.             setCellBorders(bCellBorders);
  588.             yAdj = 2;
  589.         }
  590.     }
  591.  
  592.     /**
  593.      * Initializes the list with the string array. Any pre-existing items are
  594.      * lost.
  595.      * @param items the new list items
  596.      * @exception PropertyVetoException
  597.      * if the specified property value is unacceptable
  598.      * @see #getListItems
  599.      * @see #setListItems(java.lang.String[])
  600.      * @see #addItem(java.lang.String)
  601.      * @see #addItem(java.lang.String, boolean)
  602.      * @see #addItem(java.awt.Image, java.lang.String)
  603.      * @see #addItem(java.awt.Image, java.lang.String, boolean)
  604.      * @see #addItem(java.awt.Image, java.lang.String, boolean, java.awt.Color)
  605.      */
  606.     public void setListItems(String[] items) throws PropertyVetoException
  607.     {
  608.         String[] oldValue = getListItems();
  609.         vetos.fireVetoableChange("ListItems", oldValue, items);
  610.  
  611.         clear();
  612.         for (int i = 0; i < items.length; ++i)
  613.         {
  614.             addItem(items[i]);
  615.         }
  616.  
  617.         changes.firePropertyChange("ListItems", oldValue, items);
  618.     }
  619.  
  620.     /**
  621.      * Returns the current list as an array.
  622.      * @return String[] current list
  623.      * @see #setListItems
  624.      */
  625.     public String[] getListItems()
  626.     {
  627.         int len = countItems();
  628.         String[] items = new String[len];
  629.         for (int i = 0; i < len; ++i)
  630.         {
  631.             items[i] = getItem(i);
  632.         }
  633.         return items;
  634.     }
  635.  
  636.     /**
  637.      * Set a flag indicating that the item at the given zero-relative index
  638.      * has been edited.
  639.      * @param index the zero-relative position of the item
  640.      * @param bCond the "edited" flag
  641.      * @exception PropertyVetoException
  642.      * if the specified property value is unacceptable
  643.      * @see #isEdited
  644.      */
  645.     public void setEdited(int index, boolean bCond) throws PropertyVetoException
  646.     {
  647.         if (validIndex(index))
  648.         {
  649.             ListItem tempItem = ((ListItem)items.elementAt(index));
  650.             if(tempItem.bEdited != bCond)
  651.             {
  652.                 Boolean oldValue = new Boolean(tempItem.bEdited);
  653.                 Boolean newValue = new Boolean(bCond);
  654.                 vetos.fireVetoableChange("Edited", oldValue, newValue);
  655.  
  656.                 tempItem.bEdited = bCond;
  657.  
  658.                 changes.firePropertyChange("Edited", oldValue, newValue);
  659.             }
  660.         }
  661.     }
  662.  
  663.     /**
  664.      * Gets the "edited" flag state for the item at the given
  665.      * zero-relative index.
  666.      * @param index the zero-relative position of the item
  667.      * @return true if flagged as edited, false if not
  668.      * @see #setEdited
  669.      */
  670.     public boolean isEdited(int index)
  671.     {
  672.         if (validIndex(index))
  673.         {
  674.             ListItem tempItem = ((ListItem)items.elementAt(index));
  675.             return tempItem.bEdited;
  676.         }
  677.  
  678.         return false;
  679.     }
  680.  
  681.     /**
  682.      * @deprecated
  683.      * @see #isEdited
  684.      */
  685.     public boolean getEdited(int index)
  686.     {
  687.         return isEdited(index);
  688.     }
  689.  
  690.     /**
  691.      * Sets whether this list should allow multiple selections
  692.      * or not.
  693.      * @param cond whether to allow multiple selections
  694.      * @exception PropertyVetoException
  695.      * if the specified property value is unacceptable
  696.      * @see #allowsMultipleSelections
  697.      */
  698.     public void setMultipleSelections(boolean cond) throws PropertyVetoException
  699.     {
  700.         if (bMultipleSelections != cond)
  701.         {
  702.             Boolean oldValue = new Boolean(bMultipleSelections);
  703.             Boolean newValue = new Boolean(cond);
  704.             vetos.fireVetoableChange("MultipleSelections", oldValue, newValue);
  705.  
  706.             if (!cond)  // deselect first because deselect works differently according to bMultipleSelections flag
  707.                 deselectAll();
  708.             bMultipleSelections = cond;
  709.  
  710.             changes.firePropertyChange("MultipleSelections", oldValue, newValue);
  711.         }
  712.     }
  713.  
  714.     /**
  715.      * Returns true if this list allows multiple selections.
  716.      * @return true if multiple selections allowed, false otherwise
  717.      * @see #setMultipleSelections
  718.      */
  719.     public boolean isMultipleSelections()
  720.     {
  721.         return bMultipleSelections;
  722.     }
  723.  
  724.     /**
  725.      * Conditionally enables the specified item in the list.
  726.      * @param index the zero-relative position of the item
  727.      * @param cond if true, enable the item; if false, disable the
  728.      * item
  729.      * @exception PropertyVetoException
  730.      * if the specified property value is unacceptable
  731.      * @see #isEnabled
  732.      */
  733.     public void setEnabled(int index, boolean cond) throws PropertyVetoException
  734.     {
  735.         if (validIndex(index))
  736.         {
  737.             ListItem tempItem = ((ListItem)items.elementAt(index));
  738.             if(tempItem.bEnabled != cond)
  739.             {
  740.                 Boolean oldValue = new Boolean(tempItem.bEnabled);
  741.                 Boolean newValue = new Boolean(cond);
  742.                 vetos.fireVetoableChange("Enabled", oldValue, newValue);
  743.  
  744.                 tempItem.bEnabled = cond;
  745.                 if(!cond)
  746.                 {
  747.                     deselect(index);
  748.                 }
  749.                 tempItem.bDirty = true;
  750.                 if (!bInternalBlockPaint)
  751.                     repaint();
  752.  
  753.                 changes.firePropertyChange("Enabled", oldValue, newValue);
  754.             }
  755.         }
  756.     }
  757.  
  758.     /**
  759.      * Gets the enabled state of a specific item in the list.
  760.      * @param index the zero-relative position of the item in the list
  761.      * @return true if the item is enabled, false
  762.      * if the item is disabled.
  763.      * @see #setEnabled(int, boolean)
  764.      */
  765.     public boolean isEnabled(int index)
  766.     {
  767.         if (validIndex(index))
  768.         {
  769.             ListItem tempItem = ((ListItem)items.elementAt(index));
  770.             return tempItem.bEnabled;
  771.         }
  772.  
  773.         return false;
  774.     }
  775.  
  776.     /**
  777.      * Changes the text associated with the item at the specified
  778.      * zero-relative index.
  779.      * @param index the zero-relative position of the item
  780.      * @param text the new text to associate with the item
  781.      * @exception PropertyVetoException
  782.      * if the specified property value is unacceptable
  783.      * @see #getText
  784.      */
  785.     public void setText(int index, String text) throws PropertyVetoException
  786.     {
  787.         if (validIndex(index))
  788.         {
  789.             ListItem tempItem = ((ListItem)items.elementAt(index));
  790.  
  791.             if(!symantec.itools.util.GeneralUtils.objectsEqual(tempItem, text))
  792.             {
  793.                 String oldValue = tempItem.sText;
  794.                 vetos.fireVetoableChange("Text", oldValue, text);
  795.  
  796.                 tempItem.sText = text;
  797.                 tempItem.bDirty = true;
  798.                 tempItem.updateWidth(fm);
  799.                 updateWidth(tempItem);
  800.                 if (!bInternalBlockPaint)
  801.                     repaint();
  802.  
  803.                 changes.firePropertyChange("Text", oldValue, text);
  804.             }
  805.         }
  806.     }
  807.  
  808.     /**
  809.      * Gets the item text associated with the specified zero-relative index.
  810.      * @param index the zero-relative position of the item
  811.      * @return the item text, or null if the index is invalid
  812.      * @see #setText
  813.      */
  814.     public String getText(int index)
  815.     {
  816.         if (validIndex(index))
  817.             return ((ListItem)items.elementAt(index)).sText;
  818.         else
  819.             return null;
  820.     }
  821.  
  822.     /**
  823.      * @deprecated
  824.      * @see #getText
  825.      */
  826.     public String getItem(int index)
  827.     {
  828.         return getText(index);
  829.     }
  830.  
  831.     /**
  832.      * Sets the URL of the image to display at the given zero based index
  833.      * @param aURL the image URL
  834.      * @exception java.net.MalformedURLException
  835.      * if the URL parameter is bad
  836.      * @exception PropertyVetoException
  837.      * if the specified property value is unacceptable
  838.      * @see #getImage
  839.      */
  840.     public void setImageURL(int index, URL aUrl) throws java.net.MalformedURLException, PropertyVetoException
  841.     {
  842.         if (validIndex(index)) {
  843.             ListItem tempItem = ((ListItem)items.elementAt(index));
  844.             URL oldValue = tempItem.url;
  845.             Image image = getToolkit().getImage(aUrl);
  846.             if (image != null)
  847.             {
  848.                 setImage(index, image);
  849.             }
  850.             tempItem.url = aUrl;
  851.             changes.firePropertyChange("ImageURL", oldValue, aUrl);
  852.         }
  853.     }
  854.  
  855.     /**
  856.      * Gets the URL of the image displayed at the given zero-based index.
  857.      * @param index the zero-relative index of the image to get
  858.      * @return the URL of the image
  859.      * @see #setImage
  860.      */
  861.     public URL getImageURL(int index)
  862.     {
  863.         if (validIndex(index))
  864.             return ((ListItem)items.elementAt(index)).url;
  865.         else
  866.             return null;
  867.     }
  868.  
  869.     /**
  870.      * Change the image associated with an item at a
  871.      * specific zero-relative index.
  872.      * @param index the zero-relative position of the item
  873.      * @param image the image to associate with an item
  874.      * @exception PropertyVetoException
  875.      * if the specified property value is unacceptable
  876.      * @see #getImage(int)
  877.      */
  878.     public void setImage(int index, Image image) throws PropertyVetoException
  879.     {
  880.         if (validIndex(index))
  881.         {
  882.             ListItem tempItem = ((ListItem)items.elementAt(index));
  883.  
  884.             if(!symantec.itools.util.GeneralUtils.objectsEqual(tempItem, image))
  885.             {
  886.                 Image oldValue = tempItem.image;
  887.                 vetos.fireVetoableChange("Image", oldValue, image);
  888.  
  889.                 tempItem.image = image;
  890.                 tempItem.bDirty = true;
  891.                 if (!bInternalBlockPaint)
  892.                     repaint();
  893.  
  894.                 changes.firePropertyChange("Image", oldValue, image);
  895.             }
  896.         }
  897.     }
  898.  
  899.     /**
  900.      * Gets the image associated with the specified zero-relative index.
  901.      * @param index the zero-relative position of the item
  902.      * @return the image at the index, or null if the index is invalid
  903.      * @see #setImage(int, java.awt.Image)
  904.      */
  905.     public Image getImage(int index)
  906.     {
  907.         if (validIndex(index))
  908.             return ((ListItem)items.elementAt(index)).image;
  909.         else
  910.             return null;
  911.     }
  912.  
  913.     /**
  914.      * Sets the slelection state of the first item in the list which has exactly
  915.      * matching text.
  916.      * @param str the String to select in the list
  917.      * @exception PropertyVetoException
  918.      * if the specified property value is unacceptable
  919.      * @see getSelectedItem
  920.      */
  921.     public synchronized void setSelectedItem(String str, boolean isSelected) throws PropertyVetoException
  922.     {
  923.         ListItem li;
  924.         int z = items.size();
  925.         for (int i = 0; i < z; i++)
  926.         {
  927.             li = (ListItem) items.elementAt(i);
  928.  
  929.             if (symantec.itools.util.GeneralUtils.objectsEqual(li.sText, str)/*&& li.bEnabled != isSelected*/)
  930.             {
  931.                 //Make up the new string array before it happens.
  932.                 String[] oldValue = getSelectedItems();
  933.                 Vector tempVect = new Vector(oldValue.length);
  934.                 for(int count = 0; count < oldValue.length; count++)
  935.                     tempVect.insertElementAt(oldValue[count], count);
  936.                 if(isSelected)
  937.                     tempVect.addElement(li.sText);
  938.                 else
  939.                     tempVect.removeElement(li.sText);
  940.                 String[] newValue = new String[tempVect.size()];
  941.                 tempVect.copyInto(newValue);
  942.  
  943.                 vetos.fireVetoableChange("SelectedItems", oldValue, newValue);
  944.  
  945.                 setSelectedIndex(i, isSelected);
  946.  
  947.                 if (!bInternalBlockPaint)
  948.                     repaint();
  949.  
  950.                 changes.firePropertyChange("SelectedItems", oldValue, getSelectedItems());
  951.  
  952.                 return;
  953.             }
  954.         }
  955.     }
  956.  
  957.     /**
  958.      * Returns the currently selected item in the list.
  959.      * If multiple items are selected, the item most recently
  960.      * selected is returned.
  961.      * @return the currently selected item, or null if no item is selected.
  962.      * @see #setSelectedItem
  963.      * @see #getSelectedItems
  964.      * @see #deselect
  965.      * @see #isSelected
  966.      */
  967.     public synchronized String getSelectedItem()
  968.     {
  969.         return (lastSelected < 0) ? null : getItem(lastSelected);
  970.     }
  971.  
  972.     /**
  973.      * Select the item at the specified index.
  974.      * This method deselects all others when multiple
  975.      * selections not enabled.
  976.      * @param index the zero-relative position of the item to select
  977.      * @exception PropertyVetoException
  978.      * if the specified property value is unacceptable
  979.      * @see #getSelectedItem
  980.      * @see #deselect
  981.      * @see #isSelected
  982.      */
  983.     public synchronized void setSelectedIndex(int index, boolean isSelected) throws PropertyVetoException
  984.     {
  985.         ListItem listItem = null;
  986.         if (bMultipleSelections)
  987.         {
  988.             listItem = (ListItem)items.elementAt(index);
  989.  
  990.             //Make up the new int array before it happens.
  991.             int[] oldValue = getSelectedIndexes();
  992.             Vector tempVect = new Vector(oldValue.length);
  993.             for(int count = 0; count < oldValue.length; count++)
  994.                 tempVect.insertElementAt(new Integer(oldValue[count]), count);
  995.             if(isSelected)
  996.                 tempVect.addElement(new Integer(index));
  997.             else
  998.                 tempVect.removeElement(new Integer(index));
  999.             int[] newValue = new int[tempVect.size()];
  1000.             for(int count = 0; count < tempVect.size(); count++)
  1001.                 newValue[count] = ((Integer)tempVect.elementAt(count)).intValue();
  1002.  
  1003.             vetos.fireVetoableChange("SelectedIndex", oldValue, newValue);
  1004.  
  1005.             if(isSelected) {
  1006.                 try {
  1007.                     deselectAll();
  1008.                 } catch (java.beans.PropertyVetoException e) {}
  1009.             }
  1010.             listItem.bSelected = isSelected;
  1011.             listItem.bDirty = true;
  1012.             if(isSelected)
  1013.                 countSelected++;
  1014.  
  1015.             changes.firePropertyChange("SelectedIndex", oldValue, getSelectedIndexes());
  1016.         }
  1017.         else
  1018.         {
  1019.             int s = items.size();
  1020.  
  1021.             if(index < s && index > -1)
  1022.             {
  1023.                 //Make up the new int array before it happens.
  1024.                 int[] oldValue = getSelectedIndexes();
  1025.                 int[] newValue = new int[0];
  1026.                 if(isSelected)
  1027.                 {
  1028.                      newValue = new int[1];
  1029.                      newValue[0] = index;
  1030.                 }
  1031.  
  1032.                 vetos.fireVetoableChange("SelectedIndexes", oldValue, newValue);
  1033.  
  1034.                 listItem = (ListItem)items.elementAt(index);
  1035.                 boolean wasSelected = listItem.bSelected;
  1036.  
  1037.                 //If they want to select something, we must deselect everything else.
  1038.                 if(isSelected)
  1039.                 {
  1040.                     for(int i = 0; i < s; i++)
  1041.                     {
  1042.                         listItem = (ListItem)items.elementAt(i);
  1043.                         if(listItem.bSelected)
  1044.                         {
  1045.                             listItem.bSelected = false;
  1046.                             listItem.bDirty = true;
  1047.                         }
  1048.                     }
  1049.  
  1050.                     listItem = (ListItem)items.elementAt(index);
  1051.                     listItem.bSelected = true;
  1052.                     if(wasSelected)
  1053.                         listItem.bDirty = false;
  1054.  
  1055.                     countSelected = 1;
  1056.                 }
  1057.                 else
  1058.                 {
  1059.                        listItem.bSelected = false;
  1060.                     if(wasSelected){
  1061.                         listItem.bDirty = true;
  1062.                          countSelected--;
  1063.                      }
  1064.                  }
  1065.  
  1066.                 changes.firePropertyChange("SelectedIndexes", oldValue, getSelectedIndexes());
  1067.             }
  1068.         }
  1069.         lastSelected = index;
  1070.         setVisibleIndex(index);
  1071.         if (!bInternalBlockPaint) repaint();
  1072.     }
  1073.  
  1074.     /**
  1075.      * Gets the zero-relative index of the selected item in the list.
  1076.      * If multiple items are selected, the index of the item most recently
  1077.      * selected is returned.
  1078.      * @return the zero-relative index of the selected item, or -1 if no item is
  1079.      * selected
  1080.      * @see #select
  1081.      * @see #deselect
  1082.      * @see #isSelected
  1083.      */
  1084.     public synchronized int getSelectedIndex()
  1085.     {
  1086.         return lastSelected;
  1087.     }
  1088.  
  1089.     /**
  1090.      * Returns the indexes of all the selected items in the list.
  1091.      * @return an array of the zero-relative indexes of the selected items
  1092.      * @see #select
  1093.      * @see #deselect
  1094.      * @see #isSelected
  1095.      */
  1096.     public synchronized int[] getSelectedIndexes()
  1097.     {
  1098.         int sel[] = new int[countSelected];
  1099.  
  1100.         if (countSelected == 1)
  1101.             sel[0] = lastSelected;
  1102.         else if (countSelected > 1)
  1103.         {
  1104.             int x = 0;
  1105.             int s = items.size();
  1106.             for (int i = 0; i < s; i++)
  1107.             {
  1108.                 ListItem tempItem = (ListItem)items.elementAt(i);
  1109.                 if (tempItem.bSelected)
  1110.                 {
  1111.                     sel[x++] = i;
  1112.                     if (x == countSelected)
  1113.                         break;
  1114.                 }
  1115.             }
  1116.         }
  1117.  
  1118.         return sel;
  1119.     }
  1120.  
  1121.     /**
  1122.      * Returns all of the the selected items in the list.
  1123.      * @return an array of all the selected items in the list
  1124.      * @see #getSelectedItem
  1125.      * @see #setSelectedItem
  1126.      * @see #isSelected
  1127.      */
  1128.     public synchronized String[] getSelectedItems()
  1129.     {
  1130.         String str[] = new String[java.lang.Math.max(1,countSelected)];
  1131.         ListItem tempItem;
  1132.  
  1133.         if (!bMultipleSelections)
  1134.         {
  1135.             if (lastSelected != -1)
  1136.             {
  1137.                 tempItem = (ListItem)items.elementAt(lastSelected);
  1138.                 str[0] = tempItem.sText;
  1139.             }
  1140.         }
  1141.         else if (countSelected > 0)
  1142.         {
  1143.             int x = 0;
  1144.             int s = items.size();
  1145.             for (int i = 0; i < s; i++)
  1146.             {
  1147.                 tempItem = (ListItem)items.elementAt(i);
  1148.                 if (tempItem.bSelected)
  1149.                 {
  1150.                     str[x] = tempItem.sText;
  1151.                     if (++x == countSelected)
  1152.                         break;
  1153.                 }
  1154.             }
  1155.         }
  1156.  
  1157.         return str;
  1158.     }
  1159.  
  1160.     /**
  1161.      * Returns the selected items in the list.
  1162.      * Needed in order to implement the java.awt.ItemSelectable interface
  1163.      * @return an array of selected items in the list, as an array of Objects.
  1164.      * @see #getSelectedItem
  1165.      * @see #setSelectedItem
  1166.      * @see #isSelected
  1167.      * @see java.awt.ItemSelectable
  1168.      */
  1169.     public Object[] getSelectedObjects()
  1170.     {
  1171.         return getSelectedItems();
  1172.     }
  1173.  
  1174.     /**
  1175.      * Get the selected state of the item at the given index.
  1176.      * @param index the zero-relative index of the item to be checked
  1177.      * @return true if the item at the specified index
  1178.      * is selected; false if it is not selected
  1179.      * @see #select
  1180.      * @see #deselect
  1181.      * @see #isSelected
  1182.      */
  1183.     public synchronized boolean isSelected(int index)
  1184.     {
  1185.         if (validIndex(index))
  1186.         {
  1187.             ListItem listItem = (ListItem)items.elementAt(index);
  1188.             return listItem.bSelected;
  1189.         }
  1190.         return false;
  1191.     }
  1192.  
  1193.     /**
  1194.      * Sets the current list box label.
  1195.      * @param label the new list box label
  1196.      * @exception PropertyVetoException
  1197.      * if the specified property value is unacceptable
  1198.      * @see #getLabel
  1199.      */
  1200.     public synchronized void setLabel(String label) throws PropertyVetoException
  1201.     {
  1202.         if(!symantec.itools.util.GeneralUtils.objectsEqual(ilbLabel, label))
  1203.         {
  1204.             String oldValue = ilbLabel;
  1205.             vetos.fireVetoableChange("Label", oldValue, label);
  1206.  
  1207.             ilbLabel = label;
  1208.  
  1209.             changes.firePropertyChange("Label", oldValue, label);
  1210.         }
  1211.     }
  1212.  
  1213.     /**
  1214.      * Returns the current list box label.
  1215.      * @return the current list box label
  1216.      * @see #setLabel
  1217.      */
  1218.     public synchronized String getLabel()
  1219.     {
  1220.         return new String(ilbLabel);
  1221.     }
  1222.  
  1223.     /**
  1224.      * Forces the item at the specified index to be visible in
  1225.      * the window.
  1226.      * @param index the zero-relative position of the item to be
  1227.      * made visible
  1228.      * @exception PropertyVetoException
  1229.      * if the specified property value is unacceptable
  1230.      * @see #getVisibleIndex
  1231.      */
  1232.     public synchronized void setVisibleIndex(int index) throws PropertyVetoException
  1233.     {
  1234.         if(visibleIndex != index)
  1235.         {
  1236.             Integer oldValue = new Integer(visibleIndex);
  1237.             Integer newValue = new Integer(index);
  1238.             vetos.fireVetoableChange("VisibleIndex", oldValue, newValue);
  1239.  
  1240.             visibleIndex = index;
  1241.             if ( nTopRow > index )
  1242.                 scrollVertical(index, true);
  1243.             else if (index >= (nTopRow + visibleRows))
  1244.                 scrollVertical(index - (visibleRows + 1 ), true);
  1245.        
  1246.             changes.firePropertyChange("VisibleIndex", oldValue, newValue);
  1247.         }
  1248.     }
  1249.  
  1250.     /**
  1251.      * Gets the index of the item that was last made visible by
  1252.      * the method makeVisible.
  1253.      * @return the zero-relative index of the item last made visible by the
  1254.      * makeVisible method
  1255.      * @see #makeVisible
  1256.      */
  1257.     public int getVisibleIndex()
  1258.     {
  1259.         return visibleIndex;
  1260.     }
  1261.  
  1262.     /**
  1263.      * Forces the item at the specified index to be visible at
  1264.      * the top of the window.
  1265.      * @param index the zero-relative position of the item
  1266.      * @exception PropertyVetoException
  1267.      * if the specified property value is unacceptable
  1268.      * @see #getTopRow
  1269.      */
  1270.     public void setTopRow(int index) throws PropertyVetoException
  1271.     {
  1272.         int s = items.size();
  1273.         if (s < visibleRows)
  1274.             index = 0;
  1275.         else if (index > (s - visibleRows))
  1276.             index = s - visibleRows;
  1277.  
  1278.         if (nTopRow != index)
  1279.         {
  1280.             Integer oldValue = new Integer(nTopRow);
  1281.             Integer newValue = new Integer(index);
  1282.             vetos.fireVetoableChange("TopRow", oldValue, newValue);
  1283.  
  1284.             nTopRow = index;
  1285.             bAllDirty = true;
  1286.             invalidate();
  1287.  
  1288.             changes.firePropertyChange("TopRow", oldValue, newValue);
  1289.         }
  1290.     }
  1291.  
  1292.     /**
  1293.      * Returns the index of the item visible at
  1294.      * the top of the window.
  1295.      * @return index the zero-relative position of the item
  1296.      * @see #setTopRow
  1297.      */
  1298.     public synchronized int getTopRow()
  1299.     {
  1300.         return nTopRow;
  1301.     }
  1302.  
  1303.     /**
  1304.      * Sets the number of columns to be used by getMinimumSize().
  1305.      * @param columns the number of columns
  1306.      * @exception PropertyVetoException
  1307.      * if the specified property value is unacceptable
  1308.      * @see #getColumns
  1309.      */
  1310.     public synchronized void setColumns(int columns) throws PropertyVetoException
  1311.     {
  1312.         if (colsToShow != columns)
  1313.         {
  1314.             Integer oldValue = new Integer(colsToShow);
  1315.             Integer newValue = new Integer(columns);
  1316.             vetos.fireVetoableChange("Columns", oldValue, newValue);
  1317.  
  1318.             colsToShow = columns;
  1319.             invalidate();
  1320.  
  1321.             changes.firePropertyChange("Columns", oldValue, newValue);
  1322.         }
  1323.     }
  1324.  
  1325.     /**
  1326.      * Returns the number of columns to be used by minimumSize().
  1327.      * @return the number of columns
  1328.      * @see #setColumns
  1329.      */
  1330.     public synchronized int getColumns()
  1331.     {
  1332.         return colsToShow;
  1333.     }
  1334.  
  1335.     /**
  1336.      * Returns the number of currently visible lines in this list.
  1337.      * @return the number of visible lines in the list.
  1338.      */
  1339.     public int getRows()
  1340.     {
  1341.         return visibleRows;
  1342.     }
  1343.  
  1344.     /**
  1345.      * Set the font for the items in the list box.
  1346.      * @param f new font to use for list box items
  1347.      */
  1348.     public synchronized void setFont(Font f)
  1349.     {
  1350.         super.setFont(f);
  1351.  
  1352.         f = getFont();
  1353.         if (f != null)
  1354.         {
  1355.             fm = getFontMetrics(f);
  1356.             updateWidths(fm);
  1357.             xCoord = 0;
  1358.  
  1359.             bAllDirty = true;
  1360.             invalidate();
  1361.         }
  1362.     }
  1363.  
  1364.     /**
  1365.      * Set the list to be "dirty" (true) to force a complete
  1366.      * paint on next repaint, or "clean" (false) to avoid a complete
  1367.      * paint on the next repaint.
  1368.      * @param isDirty true if the list is dirty (needs repaint)
  1369.      * @exception PropertyVetoException
  1370.      * if the specified property value is unacceptable
  1371.      * @see #isDirty
  1372.      */
  1373.     public synchronized void setDirty(boolean isDirty) throws PropertyVetoException
  1374.     {
  1375.         Boolean oldValue = new Boolean(bAllDirty);
  1376.         Boolean newValue = new Boolean(isDirty);
  1377.  
  1378.         vetos.fireVetoableChange("Dirty", oldValue, newValue);
  1379.  
  1380.         bAllDirty = isDirty;
  1381.  
  1382.         changes.firePropertyChange("Dirty", oldValue, newValue);
  1383.     }
  1384.  
  1385.     /**
  1386.      * Query the lists all "dirty" state
  1387.      * @return true if on the next repaint the entire list will be
  1388.      * repainted, or false if the list will not be repainted.
  1389.      * @see #setDirty(boolean)
  1390.      */
  1391.     public synchronized boolean isDirty()
  1392.     {
  1393.         return bAllDirty;
  1394.     }
  1395.  
  1396.     /**
  1397.      * @deprecated
  1398.      * @see #setDirty(boolean)
  1399.      * @exception PropertyVetoException
  1400.      * if the specified property value is unacceptable
  1401.      */
  1402.     public synchronized void setDirty() throws PropertyVetoException
  1403.     {
  1404.         setDirty(true);
  1405.     }
  1406.  
  1407.     /**
  1408.      * Query if all rows are selected.
  1409.      * @return returns true if all rows in the ImageListBox
  1410.      * are selected
  1411.      */
  1412.     public boolean isAllSelected()
  1413.     {
  1414.         return (countSelected == items.size());
  1415.     }
  1416.  
  1417.     /**
  1418.      * @deprecated
  1419.      * @see #isAllSelected
  1420.      */
  1421.     public boolean allSelected()
  1422.     {
  1423.         return isAllSelected();
  1424.     }
  1425.  
  1426.     /**
  1427.      * Adds an item to the end of the list and enables the item.
  1428.      * @param item the item to be added
  1429.      * @exception PropertyVetoException
  1430.      * if the specified property value is unacceptable
  1431.      * @see #setListItems(java.lang.String[])
  1432.      * @see #addItem(java.lang.String, boolean)
  1433.      * @see #addItem(java.awt.Image, java.lang.String)
  1434.      * @see #addItem(java.awt.Image, java.lang.String, boolean)
  1435.      * @see #addItem(java.awt.Image, java.lang.String, boolean, java.awt.Color)
  1436.      */
  1437.     public synchronized void addItem(String item) throws PropertyVetoException
  1438.     {
  1439.         addItem(new ListItem((Image)null, item, true, fm, bCellBorders));
  1440.     }
  1441.  
  1442.     /**
  1443.      * Adds an item to the end of the list and conditionally enables
  1444.      * it.
  1445.      * @param item the item to be added
  1446.      * @param bEnabled if true, enable the item; if false, disable
  1447.      * the item
  1448.      * @exception PropertyVetoException
  1449.      * if the specified property value is unacceptable
  1450.      * @see #setListItems(java.lang.String[])
  1451.      * @see #addItem(java.lang.String)
  1452.      * @see #addItem(java.awt.Image, java.lang.String)
  1453.      * @see #addItem(java.awt.Image, java.lang.String, boolean)
  1454.      * @see #addItem(java.awt.Image, java.lang.String, boolean, java.awt.Color)
  1455.      */
  1456.     public synchronized void addItem(String item, boolean bEnabled) throws PropertyVetoException
  1457.     {
  1458.         addItem(new ListItem((Image)null, item, bEnabled, fm, bCellBorders));
  1459.     }
  1460.  
  1461.     /**
  1462.      * Adds an item with an image to the end of the list and enables
  1463.      * it.
  1464.      * @param image the image to display on the item line
  1465.      * @param item the item to be added
  1466.      * @exception PropertyVetoException
  1467.      * if the specified property value is unacceptable
  1468.      * @see #setListItems(java.lang.String[])
  1469.      * @see #addItem(java.lang.String)
  1470.      * @see #addItem(java.lang.String, boolean)
  1471.      * @see #addItem(java.awt.Image, java.lang.String, boolean)
  1472.      * @see #addItem(java.awt.Image, java.lang.String, boolean, java.awt.Color)
  1473.      */
  1474.     public synchronized void addItem(Image image, String item) throws PropertyVetoException
  1475.     {
  1476.         addItem(new ListItem(image, item, true, fm, bCellBorders));
  1477.     }
  1478.  
  1479.     /**
  1480.      * Adds an item with an image to the end of the list and
  1481.      * conditionally enables it.
  1482.      * @param image the image to display on item line
  1483.      * @param item the item to be added
  1484.      * @param bEnabled if true, enable the item; if false, disable the item
  1485.      * @exception PropertyVetoException
  1486.      * if the specified property value is unacceptable
  1487.      * @see #setListItems(java.lang.String[])
  1488.      * @see #addItem(java.lang.String)
  1489.      * @see #addItem(java.lang.String, boolean)
  1490.      * @see #addItem(java.awt.Image, java.lang.String)
  1491.      * @see #addItem(java.awt.Image, java.lang.String, boolean, java.awt.Color)
  1492.      */
  1493.     public synchronized void addItem(Image image, String item, boolean bEnabled) throws PropertyVetoException
  1494.     {
  1495.         addItem(new ListItem(image, item, bEnabled, fm, bCellBorders));
  1496.     }
  1497.  
  1498.     /**
  1499.      * Adds an item with an image to the end of the list and
  1500.      * conditionally enables it. The item text will be displayed in the
  1501.      * given color.
  1502.      * @param image the image to display on item line
  1503.      * @param item the item to be added
  1504.      * @param bEnabled if true, enable the item; if false, disable the item
  1505.      * @param color the color of the item's text
  1506.      * @exception PropertyVetoException
  1507.      * if the specified property value is unacceptable
  1508.      * @see #setListItems(java.lang.String[])
  1509.      * @see #addItem(java.lang.String)
  1510.      * @see #addItem(java.lang.String, boolean)
  1511.      * @see #addItem(java.awt.Image, java.lang.String)
  1512.      * @see #addItem(java.awt.Image, java.lang.String, boolean)
  1513.      */
  1514.     public synchronized void addItem(Image image, String item, boolean bEnabled, Color color) throws PropertyVetoException
  1515.     {
  1516.         ListItem li = new ListItem(image, item, bEnabled, fm, bCellBorders);
  1517.         li.color = color;
  1518.         addItem(li);
  1519.     }
  1520.  
  1521.     /**
  1522.      * Inserts an item with an image at a specific zero-relative index and
  1523.      * conditionally enables it.
  1524.      * @param index the zero-relative index to insert at
  1525.      * @param image the image to display on the item line
  1526.      * @param item the item to be added
  1527.      * @param bEnabled if true, enable the item; if false, disable the item
  1528.      */
  1529.     public synchronized void insertItem(int index, Image image, String item, boolean bEnabled)
  1530.     {
  1531.         ListItem li = null;
  1532.         if ( validIndex(index) )
  1533.         {
  1534.             items.insertElementAt(li = new ListItem(image, item, bEnabled, fm, bCellBorders), index);
  1535.             bAllDirty = true;
  1536.             if (lastSelected >= index)
  1537.                 lastSelected++;
  1538.         }
  1539.         else
  1540.             items.addElement(li = new ListItem(image, item, bEnabled, fm, bCellBorders));
  1541.         updateWidth(li);
  1542.  
  1543.         if (!bInternalBlockPaint) repaint();
  1544.     }
  1545.  
  1546.     /**
  1547.      * Inserts a vector list of items at a specific zero-relative index and
  1548.      * conditionally enables them.
  1549.      * Each item will be displayed with the given image.
  1550.      * @param index the zero-relative index to insert at
  1551.      * @param itemVector the item vector to be added
  1552.      * @param image the image to display for all inserted items
  1553.      * @param bEnabled if true, enable the items; if false, disable the items
  1554.      * @exception PropertyVetoException
  1555.      * if the specified property value is unacceptable
  1556.      */
  1557.     public synchronized void insertItems(int index, Vector itemVector, Image image, boolean bEnabled) throws PropertyVetoException
  1558.     {
  1559.         int s = itemVector.size();
  1560.         int x = 0;
  1561.         int idx = index;
  1562.         if ( validIndex(index) )
  1563.         {
  1564.             for (x = 0; x < s; x++)
  1565.                 items.insertElementAt(new ListItem(image, (String) itemVector.elementAt(x), bEnabled, fm, bCellBorders), index++);
  1566.         }
  1567.         else
  1568.         {
  1569.             for (x = 0; x < s; x++)
  1570.                 items.addElement(new ListItem(image, (String) itemVector.elementAt(x), bEnabled, fm, bCellBorders));
  1571.         }
  1572.         deselectAll();
  1573.         bAllDirty = true;
  1574.         updateWidths(fm);
  1575.  
  1576.         if (!bInternalBlockPaint) repaint();
  1577.     }
  1578.  
  1579.     /**
  1580.      * Returns the total number of items in the list.
  1581.      * @return the number of items in the list
  1582.      * @see #getItem
  1583.      */
  1584.     public int countItems()
  1585.     {
  1586.         return items.size();
  1587.     }
  1588.  
  1589.     /**
  1590.      * @deprecated
  1591.      * @see #setImage(int, java.awt.Image)
  1592.      * @exception PropertyVetoException
  1593.      * if the specified property value is unacceptable
  1594.      */
  1595.     public void changeImage(int index, Image image) throws PropertyVetoException
  1596.     {
  1597.         setImage(index, image);
  1598.     }
  1599.  
  1600.     /**
  1601.      * @deprecated
  1602.      * @see #setText(int, java.lang.String)
  1603.      * @exception PropertyVetoException
  1604.      * if the specified property value is unacceptable
  1605.      */
  1606.     public void changeText(int index, String text) throws PropertyVetoException
  1607.     {
  1608.         setText(index, text);
  1609.     }
  1610.  
  1611.     /**
  1612.      * @deprecated
  1613.      * @see #isMultipleSelections
  1614.      */
  1615.     public boolean allowsMultipleSelections()
  1616.     {
  1617.         return isMultipleSelections();
  1618.     }
  1619.  
  1620.     /**
  1621.      * @deprecated
  1622.      * @see #setEnabled(int, boolean)
  1623.      * @exception PropertyVetoException
  1624.      * if the specified property value is unacceptable
  1625.      */
  1626.     public void enable(int index, boolean cond) throws PropertyVetoException
  1627.     {
  1628.         setEnabled(index, cond);
  1629.     }
  1630.  
  1631.     /**
  1632.      * @deprecated
  1633.      * @see #setEnabled(int, boolean)
  1634.      * @exception PropertyVetoException
  1635.      * if the specified property value is unacceptable
  1636.      */
  1637.     public void enable(int index) throws PropertyVetoException
  1638.     {
  1639.         setEnabled(index, true);
  1640.     }
  1641.  
  1642.     /**
  1643.      * @deprecated
  1644.      * @see #setEnabled(int, boolean)
  1645.      * @exception PropertyVetoException
  1646.      * if the specified property value is unacceptable
  1647.      */
  1648.     public void disable(int index) throws PropertyVetoException
  1649.     {
  1650.         setEnabled(index, false);
  1651.     }
  1652.  
  1653.    /**
  1654.      * Clears the list.
  1655.      * @see #delItem
  1656.      * @see #delItems
  1657.      */
  1658.     public synchronized void clear()
  1659.     {
  1660.         items = new Vector();
  1661.  
  1662.         nTopRow = 0;
  1663.         visibleIndex = -1;
  1664.         lastDownModifiers = -1;
  1665.         lastSelected = -1;
  1666.         lastIndex = -1;
  1667.         lastTempIndex = -1;
  1668.         countSelected = 0;
  1669.         prevSelectTime = -1;
  1670.         prevSelectRow = -1;
  1671.         VBar.setValues(1, 1, 0, 2);
  1672.         VBar.hide();
  1673.         bVBarVisible = false;
  1674.         HBar.setValues(1, 1, 0, 2);
  1675.         HBar.hide();
  1676.         bHBarVisible = false;
  1677.         bAllDirty = true;
  1678.         bInternalBlockPaint = false;
  1679.         bBlockPaint = false;
  1680.         longestLineValue = 0;
  1681.         xCoord = 0;
  1682.         repaint();
  1683.     }
  1684.  
  1685.     /**
  1686.      * Delete an item from the list.
  1687.      * @param index the zero-relative index of the item to delete
  1688.      * @exception PropertyVetoException
  1689.      * if the specified property value is unacceptable
  1690.      * @see #delItems
  1691.      * @see #delSelectedItems
  1692.      */
  1693.     public synchronized void delItem(int index) throws PropertyVetoException
  1694.     {
  1695.         if (validIndex(index))
  1696.         {
  1697.             String[] oldValue = getListItems();
  1698.             String[] newValue = new String[oldValue.length - 1];
  1699.             Vector tempVect = new Vector(oldValue.length);
  1700.             for(int count = 0; count < oldValue.length; count++)
  1701.                 tempVect.insertElementAt(new String(oldValue[count]), count);
  1702.             tempVect.removeElementAt(index);
  1703.             for(int count = 0; count < tempVect.size(); count++)
  1704.                 newValue[count] = new String((String)tempVect.elementAt(count));
  1705.  
  1706.             vetos.fireVetoableChange("ListItems", oldValue, newValue);
  1707.  
  1708.             setSelectedIndex(index, false);
  1709.             if (!bInternalBlockPaint) repaint();
  1710.             items.removeElementAt(index);
  1711.             bAllDirty = true;
  1712.             scrollVertical(nTopRow, true);
  1713.             updateWidths(null);
  1714.             if (!bInternalBlockPaint) repaint();
  1715.  
  1716.             changes.firePropertyChange("ListItems", oldValue, getListItems());
  1717.         }
  1718.     }
  1719.  
  1720.     /**
  1721.      * Delete multiple items from the list.
  1722.      * Note that the end index must be greater than or
  1723.      * equal to the start index.
  1724.      * @param start the zero-relative start index of the items
  1725.      * @param end the zero-relative end index of the items
  1726.      * @exception PropertyVetoException
  1727.      * if the specified property value is unacceptable
  1728.      * @see #delItem
  1729.      * @see #delSelectedItems
  1730.      */
  1731.     public synchronized void delItems(int start, int end) throws PropertyVetoException
  1732.     {
  1733.         int s = items.size();
  1734.         if (s > 0)
  1735.         {
  1736.             if (end >= s)
  1737.                 end = s - 1;
  1738.             if (start < 0)
  1739.                 start = 0;
  1740.             if (start <= end)
  1741.             {
  1742.                 String[] oldValue = getListItems();
  1743.                 String[] newValue = new String[oldValue.length - (end - start) - 1];
  1744.                 Vector tempVect = new Vector(newValue.length);
  1745.                 for(int count = 0; count < start; count++)
  1746.                     tempVect.insertElementAt(new Integer(oldValue[count]), count);
  1747.                 for(int count = end + 1; count < oldValue.length; count ++)
  1748.                     tempVect.insertElementAt(new String(oldValue[count]), start + (count - (end + 1)));
  1749.                 for(int count = 0; count < tempVect.size(); count++)
  1750.                     newValue[count] = new String((String)tempVect.elementAt(count));
  1751.  
  1752.                 vetos.fireVetoableChange("ListItems", oldValue, newValue);
  1753.  
  1754.                 bInternalBlockPaint = true;
  1755.                 for (int i = end; i >= start; i--)
  1756.                 {
  1757.                     setSelectedIndex(i, false);
  1758.                     items.removeElementAt(i);
  1759.                 }
  1760.                 bInternalBlockPaint = false;
  1761.                 bAllDirty = true;
  1762.                 scrollVertical(nTopRow, true);
  1763.                 updateWidths(null);
  1764.                 repaint();
  1765.  
  1766.                 changes.firePropertyChange("ListItems", oldValue, getListItems());
  1767.  
  1768.             }
  1769.         }
  1770.     }
  1771.  
  1772.     /**
  1773.      * Deletes the currently selected items from the list.
  1774.      * @exception PropertyVetoException
  1775.      * if the specified property value is unacceptable
  1776.      * @see #delItem
  1777.      * @see #delItems
  1778.      */
  1779.     public synchronized void delSelectedItems() throws PropertyVetoException
  1780.     {
  1781.         int s = items.size();
  1782.  
  1783.         bInternalBlockPaint = true;
  1784.         for (int x = 0; x < s; )
  1785.         {
  1786.             ListItem tempItem = (ListItem) items.elementAt(x);
  1787.             if (tempItem.bSelected)
  1788.             {
  1789.                 //setSelectedIndex(x, false);
  1790.                 delItem(x);
  1791.                 s--;
  1792.             }
  1793.             else
  1794.                 x++;
  1795.         }
  1796.  
  1797.         bAllDirty = true;
  1798.         scrollVertical(nTopRow, true);
  1799.         updateWidths(null);
  1800.         bInternalBlockPaint = false;
  1801.         repaint();
  1802.     }
  1803.  
  1804.     /**
  1805.      * @deprecated
  1806.      * @see #setSelectedIndex(int, boolean)
  1807.      * @exception PropertyVetoException
  1808.      * if the specified property value is unacceptable
  1809.      */
  1810.     public synchronized void select(int index) throws PropertyVetoException
  1811.     {
  1812.         setSelectedIndex(index, true);
  1813.     }
  1814.  
  1815.     /**
  1816.      * @deprecated
  1817.      * @see #setSelectedItem(java.lang.String, boolean)
  1818.      * @exception PropertyVetoException
  1819.      * if the specified property value is unacceptable
  1820.      */
  1821.     public synchronized void select(String str) throws PropertyVetoException
  1822.     {
  1823.         setSelectedItem(str, true);
  1824.     }
  1825.  
  1826.     /**
  1827.      * Selects an item at the specified index in a multiple-selection-enabled ImageListBox
  1828.      * using Shift, Ctrl or Ctrl-Shift modifiers to mimic mouse
  1829.      * selecting with the Shift, Ctrl or Ctrl-Shift modifiers.
  1830.      * @param index the zero-relative position of the item to select
  1831.      * @param bShift whether to select with the Shift modifier
  1832.      * @param bControl whether to select with the Ctrl modifier
  1833.      * @exception PropertyVetoException
  1834.      * if the specified property value is unacceptable
  1835.      */
  1836.     public synchronized void selectMultiple(int index, boolean bShift, boolean bControl) throws PropertyVetoException
  1837.     {
  1838.         if (!bMultipleSelections)
  1839.         {
  1840.             bShift = false;
  1841.             bControl = false;
  1842.         }
  1843.         if (bShift)
  1844.             shiftSelect(index, bControl);
  1845.         else if (bControl)
  1846.             ctrlSelect(index);
  1847.         else
  1848.             setSelectedIndex(index, true);
  1849.     }
  1850.  
  1851.     /**
  1852.      * Selects all the items in the list.
  1853.      * @see #select
  1854.      * @see #deselectAll
  1855.      */
  1856.     public synchronized void selectAll()
  1857.     {
  1858.         if (!bMultipleSelections)
  1859.             return;
  1860.  
  1861.         int s = items.size();
  1862.         ListItem li;
  1863.         for (int i = 0; i < s; i++)
  1864.         {
  1865.             li = (ListItem)items.elementAt(i);
  1866.             if (li.bEnabled)
  1867.                 li.bSelected = true;
  1868.         }
  1869.         countSelected = s;
  1870.         lastSelected = s - 1;
  1871.         repaint();
  1872.     }
  1873.  
  1874.     /**
  1875.      * @deprecated
  1876.      * @see #setSelectedIndex(int, boolean)
  1877.      * @exception PropertyVetoException
  1878.      * if the specified property value is unacceptable
  1879.      */
  1880.     public synchronized void deselect(int index) throws PropertyVetoException
  1881.     {
  1882.         if (validIndex(index))
  1883.         {
  1884.             setSelectedIndex(index, false);
  1885.             if (!bInternalBlockPaint) repaint();
  1886.         }
  1887.     }
  1888.  
  1889.     /**
  1890.      * Deselects all items in the list.
  1891.      * @exception PropertyVetoException
  1892.      * if the specified property value is unacceptable
  1893.      * @see #selectAll
  1894.      */
  1895.     public synchronized void deselectAll() throws PropertyVetoException
  1896.     {
  1897.         int[] oldValue = getSelectedIndexes();
  1898.         int[] newValue = new int[0];
  1899.          vetos.fireVetoableChange("SelectedIndexes", oldValue, newValue);
  1900.  
  1901.         ListItem li;
  1902.         if (!bMultipleSelections)
  1903.         {
  1904.             if (lastSelected != -1)
  1905.             {
  1906.                 li = (ListItem)items.elementAt(lastSelected);
  1907.                 li.bSelected = false;
  1908.                 li.bDirty = true;
  1909.             }
  1910.         }
  1911.         else
  1912.         {
  1913.             int s = items.size();
  1914.             for (int i = 0; i < s; i++)
  1915.             {
  1916.                 li = (ListItem)items.elementAt(i);
  1917.                 if (li.bSelected)
  1918.                 {
  1919.                     li.bSelected = false;
  1920.                     li.bDirty = true;
  1921.                 }
  1922.             }
  1923.         }
  1924.         lastSelected = -1;
  1925.         countSelected = 0;
  1926.         repaint();
  1927.  
  1928.         changes.firePropertyChange("SelectedIndexes", oldValue, getSelectedIndexes());
  1929.     }
  1930.  
  1931.     /**
  1932.      * @deprecated
  1933.      * @see #setVisibleIndex
  1934.      * @exception PropertyVetoException
  1935.      * if the specified property value is unacceptable
  1936.      */
  1937.     public synchronized void makeVisible(int index) throws PropertyVetoException
  1938.     {
  1939.         setVisibleIndex(index);
  1940.     }
  1941.  
  1942.     /**
  1943.      * Get the height of an individual row.
  1944.      * @return the height in pixels
  1945.      */
  1946.     public int getCellHeight()
  1947.     {
  1948.         return cellHt;
  1949.     }
  1950.  
  1951.     /**
  1952.      * Get the width of the border around the component.
  1953.      * This value is the number of pixels needed to display the border
  1954.      * completely on both sides of the component; it is not the width of
  1955.      * one side of the border.
  1956.      * @return the width in pixels
  1957.      */
  1958.     public int getBorderWidth()
  1959.     {
  1960.         return borderWidth;
  1961.     }
  1962.  
  1963.     /**
  1964.      * Returns the preferred dimensions needed for the list with
  1965.      * the specified number of rows.
  1966.      * @param rows the number of visible rows in the list
  1967.      * @return the preferred size to show the specified number of rows
  1968.      */
  1969.     public Dimension getPreferredSize(int rows)
  1970.     {
  1971.         Dimension d = getMinimumSize(rows);
  1972.         Dimension s = size();
  1973.         return new Dimension(Math.max(d.width, s.width), Math.max(d.height, s.height));
  1974.     }
  1975.  
  1976.     /**
  1977.      * Returns the recommended dimensions to properly display this component.
  1978.      * This is a standard Java AWT method which gets called to determine
  1979.      * the recommended size of this component.
  1980.      *
  1981.      * The size returned is big enough to show the maximum number of visible
  1982.      * rows as requested when constructed, or all the rows currently in the list.
  1983.      *
  1984.      * @see #minimumSize
  1985.      */
  1986.     public Dimension getPreferredSize()
  1987.     {
  1988.         if (rowsToShow > 0)
  1989.             return getPreferredSize(rowsToShow);
  1990.  
  1991.         return getPreferredSize(items.size());
  1992.     }
  1993.  
  1994.     /**
  1995.      * Returns the minimum dimensions needed to show the given number of rows
  1996.      * in the list.
  1997.      * @param rows the number of visible rows in the list
  1998.      * @return the minimum size of this list to show the given number of rows
  1999.      */
  2000.     public Dimension getMinimumSize(int rows)
  2001.     {
  2002.         font = getFont();
  2003.         if (font != null)
  2004.         {
  2005.             fm = getFontMetrics(font);
  2006.             if (fm != null)
  2007.             {
  2008.                 fontHeight = fm.getHeight();
  2009.  
  2010.                 if (bCellBorders)
  2011.                     cellHt = fontHeight+5;
  2012.                 else
  2013.                     cellHt = fontHeight+1;
  2014.  
  2015.                 return new Dimension( ((fm.stringWidth("WN") * colsToShow) / 2) + LINE_SLOP, (rows * cellHt + borderWidth) );
  2016.             }
  2017.         }
  2018.         return new Dimension(borderWidth + LINE_SLOP, borderWidth);
  2019.     }
  2020.  
  2021.     /**
  2022.      * Returns the minimum dimensions to properly display this component.
  2023.      * This is a standard Java AWT method which gets called to determine
  2024.      * the minimum size of this component.
  2025.      *
  2026.      * The size returned is big enough to show the maximum number of visible
  2027.      * rows as requested when constructed, or all the rows currently in the list.
  2028.      *
  2029.      * @see #preferredSize
  2030.      */
  2031.     public Dimension getMinimumSize()
  2032.     {
  2033.         if (rowsToShow > 0)
  2034.             return getMinimumSize(rowsToShow);
  2035.         return getMinimumSize(items.size());
  2036.     }
  2037.  
  2038.     /**
  2039.      * @deprecated
  2040.      * @see #getPreferredSize(int)
  2041.      */
  2042.     public Dimension preferredSize(int rows)
  2043.     {
  2044.         return getPreferredSize(rows);
  2045.     }
  2046.  
  2047.     /**
  2048.      * @deprecated
  2049.      * @see #getPreferredSize
  2050.      */
  2051.     public Dimension preferredSize()
  2052.     {
  2053.         return getPreferredSize();
  2054.     }
  2055.  
  2056.     /**
  2057.      * @deprecated
  2058.      * @see #getMinimumSize(int)
  2059.      */
  2060.     public Dimension minimumSize(int rows)
  2061.     {
  2062.         return getMinimumSize(rows);
  2063.     }
  2064.  
  2065.     /**
  2066.      * @deprecated
  2067.      * @see #getMinimumSize
  2068.      */
  2069.     public Dimension minimumSize()
  2070.     {
  2071.         return getMinimumSize();
  2072.     }
  2073.  
  2074.     /**
  2075.      * Tells this component that it has been added to a container.
  2076.      * This is a standard Java AWT method which gets called by the AWT when
  2077.      * this component is added to a container. Typically, it is used to
  2078.      * create this component's peer.
  2079.      *
  2080.      * It has been overridden here to hook-up event listeners.
  2081.      * It is also used to handle list metrics after the peer is created.
  2082.      *
  2083.      * @see #removeNotify
  2084.      */
  2085.     public synchronized void addNotify()
  2086.     {
  2087.         super.addNotify();
  2088.         errors = ResourceBundle.getBundle("symantec.itools.resources.ErrorsBundle");
  2089.  
  2090.         //Calculate the default width of a scrollbar.
  2091.            barSize = VBar.getPreferredSize().width;
  2092.  
  2093.         //Hook up listeners
  2094.         if (mouse == null)
  2095.         {
  2096.             mouse = new Mouse();
  2097.             addMouseListener(mouse);
  2098.         }
  2099.         if (mouseMotion == null)
  2100.         {
  2101.             mouseMotion = new MouseMotion();
  2102.             addMouseMotionListener(mouseMotion);
  2103.         }
  2104.         if (key == null)
  2105.         {
  2106.             key = new Key();
  2107.             addKeyListener(key);
  2108.         }
  2109.         if (adjustment == null)
  2110.         {
  2111.             adjustment = new Adjustment();
  2112.             VBar.addAdjustmentListener(adjustment);
  2113.             HBar.addAdjustmentListener(adjustment);
  2114.         }
  2115.  
  2116.         font = getFont();
  2117.         fm = getFontMetrics(font);
  2118.         fontHeight = fm.getHeight();
  2119.         updateWidths(fm);
  2120.     }
  2121.     
  2122.     public boolean isFocusTraversable()
  2123.     {
  2124.         return (true);
  2125.     }
  2126.  
  2127.     /**
  2128.      * Tells this component that it is being removed from a container.
  2129.      * This is a standard Java AWT method which gets called by the AWT when
  2130.      * this component is removed from a container. Typically, it is used to
  2131.      * destroy the peers of this component and all its subcomponents.
  2132.      *
  2133.      * It has been overridden here to unhook event listeners.
  2134.      *
  2135.      * @see #addNotify
  2136.      */
  2137.     public synchronized void removeNotify()
  2138.     {
  2139.         //Unhook listeners
  2140.         if (mouse != null)
  2141.         {
  2142.             removeMouseListener(mouse);
  2143.             mouse = null;
  2144.         }
  2145.         if (mouseMotion != null)
  2146.         {
  2147.             removeMouseMotionListener(mouseMotion);
  2148.             mouseMotion = null;
  2149.         }
  2150.         if (key != null)
  2151.         {
  2152.             removeKeyListener(key);
  2153.             key = null;
  2154.         }
  2155.         if (adjustment != null)
  2156.         {
  2157.             VBar.removeAdjustmentListener(adjustment);
  2158.             HBar.removeAdjustmentListener(adjustment);
  2159.             adjustment = null;
  2160.         }
  2161.  
  2162.         super.removeNotify();
  2163.     }
  2164.  
  2165.     /**
  2166.      * Blocks the repainting of the control.
  2167.      * @param cond true to prevent updating the component, false for normal
  2168.      * painting behavior
  2169.      */
  2170.     public synchronized void blockPaint(boolean cond)
  2171.     {
  2172.         bBlockPaint = cond;
  2173.         if (!bBlockPaint)
  2174.             repaint();
  2175.     }
  2176.  
  2177.     /**
  2178.      * Scrolls the ImageListBox vertically.
  2179.      * @param info either an absolute value or Event.SCROLL_PAGE_DOWN,
  2180.      * Event.SCROLL_PAGE_UP, Event.SCROLL_LINE_DOWN, Event.SCROLL_LINE_UP.
  2181.      * The range for an absolute value should be between 0 and (number of rows-1).
  2182.      * @param bAbsolute true to treat the info parameter as an absolute value,
  2183.      * false to treat it as one of the SCROLL_... constants
  2184.      */
  2185.     public synchronized void scrollVertical(int info, boolean bAbsolute)
  2186.     {
  2187.         int temp = nTopRow;
  2188.  
  2189.         if (visibleRows == 0)
  2190.             temp = 0;
  2191.         else
  2192.         {
  2193.             if (bAbsolute)
  2194.                 temp = info;
  2195.             else
  2196.             {
  2197.                 switch (info)
  2198.                 {
  2199.                     case AdjustmentEvent.BLOCK_DECREMENT:       temp -= visibleRows; break;
  2200.                     case AdjustmentEvent.BLOCK_INCREMENT:       temp += visibleRows; break;
  2201.                     case AdjustmentEvent.UNIT_DECREMENT:        temp -= 1; break;
  2202.                     case AdjustmentEvent.UNIT_INCREMENT:        temp += 1; break;
  2203.                 }
  2204.             }
  2205.  
  2206.             if (temp < 0)
  2207.                 temp = 0;
  2208.             else if (temp > (items.size() - visibleRows))
  2209.             {
  2210.                 temp = items.size() - visibleRows;
  2211.                 if (temp < 0)
  2212.                     temp = 0;
  2213.             }
  2214.         }
  2215.  
  2216.         if (nTopRow != temp)
  2217.         {
  2218.             nTopRow = temp;
  2219.             VBar.setValue(temp);
  2220.             bAllDirty = true;
  2221.             if (!bInternalBlockPaint) repaint();
  2222.         }
  2223.     }
  2224.  
  2225.     /**
  2226.      * Scrolls the ImageListBox horizontally
  2227.      * @param info either an absolute value or Event.SCROLL_PAGE_DOWN,
  2228.      * Event.SCROLL_PAGE_UP, Event.SCROLL_LINE_DOWN, Event.SCROLL_LINE_UP.
  2229.      * The range for absolute value should be between 0 and the width of the
  2230.      * largest item, in pixels
  2231.      * @param bAbsolute true to treat the info parameter as an absolute value,
  2232.      * false to treat it as one of the SCROLL_... constants
  2233.      */
  2234.     public synchronized void scrollHorizontal(int info, boolean bAbsolute)
  2235.     {
  2236.         int temp = xCoord;
  2237.  
  2238.         if (bAbsolute)
  2239.             temp = -info;
  2240.         else
  2241.         {
  2242.             switch (info)
  2243.             {
  2244.                 case AdjustmentEvent.BLOCK_DECREMENT:       temp += lWidth; break;
  2245.                 case AdjustmentEvent.BLOCK_INCREMENT:       temp -= lWidth; break;
  2246.                 case AdjustmentEvent.UNIT_DECREMENT:        temp += 1; break;
  2247.                 case AdjustmentEvent.UNIT_INCREMENT:        temp -= 1; break;
  2248.             }
  2249.         }
  2250.  
  2251.         if (temp > 0)
  2252.             temp = 0;
  2253.         else if ( (-temp) > HBar.getMaximum() - lWidth)
  2254.             temp = -(HBar.getMaximum() - lWidth);
  2255.  
  2256.         if (xCoord != temp)
  2257.         {
  2258.             xCoord = temp;
  2259.             HBar.setValue(-temp);
  2260.             bAllDirty = true;
  2261.             if (!bInternalBlockPaint) repaint();
  2262.         }
  2263.     }
  2264.  
  2265.     /**
  2266.      * Handles redrawing of this component on the screen.
  2267.      * This is a standard Java AWT method which gets called by the Java
  2268.      * AWT (repaint()) to handle repainting this component on the screen.
  2269.      * The graphics context clipping region is set to the bounding rectangle
  2270.      * of this component and its [0,0] coordinate is this component's
  2271.      * top-left corner.
  2272.      * Typically this method paints the background color to clear the
  2273.      * component's drawing space, sets graphics context to be the foreground
  2274.      * color, and then calls paint() to draw the component.
  2275.      *
  2276.      * It is overridden here to prevent the flicker associated with the standard
  2277.      * update() method's repainting of the background before painting the component
  2278.      * itself,
  2279.      * and to allow the blocking of painting entirely.
  2280.      *
  2281.      * @param g the graphics context
  2282.      * @see java.awt.Component#repaint
  2283.      * @see #paint
  2284.      */
  2285.     public synchronized void update(Graphics g)
  2286.     {
  2287.         if (!bBlockPaint && !bInternalBlockPaint)
  2288.             paint(g);
  2289.     }
  2290.  
  2291.     /**
  2292.      * Paints this component using the given graphics context.
  2293.      * This is a standard Java AWT method which typically gets called
  2294.      * by the AWT to handle painting this component. It paints this component
  2295.      * using the given graphics context. The graphics context clipping region
  2296.      * is set to the bounding rectangle of this component and its [0,0]
  2297.      * coordinate is this component's top-left corner.
  2298.      *
  2299.      * @param g the graphics context used for painting
  2300.      * @see java.awt.Component#repaint
  2301.      * @see #update
  2302.      */
  2303.     public synchronized void paint(Graphics g)
  2304.     {
  2305.         ListItem item;
  2306.  
  2307.         int nItems;
  2308.         int xSelectStartLoc;
  2309.         int i, j, rows;
  2310.         int vWid = 0;
  2311.         int hHt = 0;
  2312.         int gridAdj = 0;
  2313.         int yLoc = 0;
  2314.         int ySLoc = 0;
  2315.         boolean bShowV = false;
  2316.         boolean bShowH = false;
  2317.  
  2318.         //Make sure cached colors are correct.
  2319.         Color curBackground = getBackground();
  2320.         if (!symantec.itools.util.GeneralUtils.objectsEqual(curBackground, cachedBackground))
  2321.         {
  2322.             cachedBackground = curBackground;
  2323.             calculateBorderColors(curBackground);
  2324.         }
  2325.  
  2326.         // Size size of ListBox
  2327.         Rectangle rect = bounds();
  2328.         font = g.getFont();
  2329.         fm = g.getFontMetrics(font);
  2330.         fontHeight = fm.getHeight();
  2331.         fontDescent = fm.getDescent();
  2332.  
  2333.         nItems = items.size();
  2334.  
  2335.         if (bCellBorders)
  2336.             cellHt = fontHeight+5;
  2337.         else
  2338.             cellHt = fontHeight+1;
  2339.  
  2340.         if (nItems == 0)
  2341.         {
  2342.             nTopRow = 0;
  2343.             visibleRows = 0;
  2344.             bShowH = false;
  2345.             bShowV = false;
  2346.             xCoord = 0;
  2347.         }
  2348.         else
  2349.         {
  2350.             if ( bAllowShowHBar && (longestLineValue > (rect.width - borderWidth)) )
  2351.             {
  2352.                 bShowH = true;
  2353.                 hHt = barSize;
  2354.             }
  2355.             else
  2356.             {
  2357.                 bShowH = false;
  2358.                 hHt = 0;
  2359.             }
  2360.  
  2361.             rows = (rect.height - hHt - borderWidth) / cellHt;
  2362.  
  2363.             if ( bAllowShowVBar && (nItems > rows) )
  2364.             {
  2365.                 bShowV = true;
  2366.                 vWid = barSize;
  2367.                 if (!bShowH)
  2368.                 {
  2369.                     if ( bAllowShowHBar && (longestLineValue > (rect.width - borderWidth - vWid)) )
  2370.                     {
  2371.                         bShowH = true;
  2372.                         hHt = barSize;
  2373.                         rows = (rect.height - hHt - borderWidth) / cellHt;
  2374.                     }
  2375.                 }
  2376.             }
  2377.             else
  2378.             {
  2379.                 bShowV = false;
  2380.                 vWid = 0;
  2381.             }
  2382.  
  2383.             if (visibleRows != rows)
  2384.             {
  2385.                 visibleRows = rows;
  2386.                 bAllDirty = true;
  2387.             }
  2388.             if (bShowV)
  2389.             {
  2390.                 VBar.reshape(rect.width - barSize - halfBorderWidth, halfBorderWidth, barSize, rect.height - borderWidth - hHt);
  2391.                 VBar.setValues(nTopRow, visibleRows, 0, nItems);
  2392.                 VBar.setPageIncrement(visibleRows);
  2393.                 lWidth = rect.width - vWid - borderWidth;
  2394.  
  2395.                 if (!bVBarVisible)
  2396.                 {
  2397.                     bVBarVisible = true;
  2398.                     VBar.show();
  2399.                 }
  2400.             }
  2401.             else
  2402.             {
  2403.                 lWidth = rect.width - borderWidth;
  2404.  
  2405.                 if (bVBarVisible)
  2406.                 {
  2407.                     bVBarVisible = false;
  2408.                     VBar.hide();
  2409.                 }
  2410.             }
  2411.  
  2412.             if (bShowH)
  2413.             {
  2414.                 HBar.reshape(halfBorderWidth, rect.height-barSize-halfBorderWidth, rect.width-borderWidth-vWid, barSize);
  2415.                 HBar.setValues(-xCoord, lWidth, 0, longestLineValue);
  2416.                 HBar.setPageIncrement(lWidth);
  2417.  
  2418.                 if (!bHBarVisible)
  2419.                 {
  2420.                     bHBarVisible = true;
  2421.                     HBar.show();
  2422.                 }
  2423.             }
  2424.             else
  2425.             {
  2426.                 if (bHBarVisible)
  2427.                 {
  2428.                     bHBarVisible = false;
  2429.                     HBar.hide();
  2430.                 }
  2431.             }
  2432.         }
  2433.  
  2434.         if (nItems == 0 || bAllDirty)
  2435.         {
  2436.             g.clearRect(halfBorderWidth, halfBorderWidth, rect.width - borderWidth - 1, rect.height - borderWidth - 1);
  2437.         }
  2438.  
  2439.         if (borderType == 0)
  2440.         {
  2441.             g.setColor(borderDarkerColor);
  2442.             g.drawLine(0, 0, rect.width - 1, 0);
  2443.             g.drawLine(0, 0, 0, rect.height - 1);
  2444.  
  2445.             g.setColor(borderDarkColor);
  2446.             g.drawLine(1, 1, rect.width - 2, 1);
  2447.             g.drawLine(1, 1, 1, rect.height - 2);
  2448.  
  2449.             g.setColor(borderLightColor);
  2450.             g.drawLine(1, rect.height - 2, rect.width - 2, rect.height - 2 );
  2451.             g.drawLine(rect.width - 2, 1, rect.width - 2, rect.height - 2 );
  2452.  
  2453.             g.setColor(borderLighterColor);
  2454.             g.drawLine(0, rect.height - 1, rect.width - 1, rect.height - 1 );
  2455.             g.drawLine(rect.width - 1, 0, rect.width - 1, rect.height - 1 );
  2456.         }
  2457.  
  2458.         g.clipRect(halfBorderWidth, halfBorderWidth, lWidth, rect.height - borderWidth);
  2459.  
  2460.         if (nTopRow >= nItems)
  2461.             nTopRow -= visibleRows + 1;
  2462.  
  2463.         i = nTopRow;
  2464.         j = Math.min(nTopRow + visibleRows, nItems);
  2465.  
  2466.         for (int dp = 0; i < j && items.size() > 0; ++i, ++dp)
  2467.         {
  2468.             yLoc = ( (dp) * (cellHt) ) + halfBorderWidth;
  2469.             ySLoc = ( (dp + 1) * (cellHt) ) + halfBorderWidth;
  2470.  
  2471.             item = (ListItem)items.elementAt(i);
  2472.             if (item.bDirty || bAllDirty)
  2473.             {
  2474.                 item.bDirty = false;
  2475.                 g.clearRect(halfBorderWidth, yLoc, lWidth, cellHt);
  2476.             }
  2477.  
  2478.             if (item.image != null)
  2479.                 xSelectStartLoc = halfBorderWidth + IMAGE_WIDTH + 2;
  2480.             else
  2481.                 xSelectStartLoc = halfBorderWidth;
  2482.  
  2483.             if (item.bCellBorder)
  2484.                 gridAdj = 2;
  2485.             else
  2486.                 gridAdj = 0;
  2487.  
  2488.             if (item.bSelected)
  2489.             {
  2490.                g.setColor(textHighlight);
  2491.                g.fillRect(xCoord + xSelectStartLoc + gridAdj, yLoc, lWidth-xCoord, cellHt);
  2492.                g.setColor(textHighlightText);
  2493.             }
  2494.             else
  2495.             {
  2496.                 if (item.bEnabled)
  2497.                 {
  2498.                     if (item.color == null)
  2499.                         g.setColor(enabledColor);
  2500.                     else
  2501.                         g.setColor(item.color);
  2502.                 }
  2503.                 else
  2504.                     g.setColor(disabledColor);
  2505.             }
  2506.  
  2507.             g.drawString(item.sText, xCoord + xSelectStartLoc + gridAdj + 2, ySLoc-fontDescent);
  2508.  
  2509.             if (item.image != null)
  2510.                 g.drawImage(item.image, xCoord + halfBorderWidth + gridAdj + 2, yLoc+2, IMAGE_WIDTH, cellHt-3, this);
  2511.  
  2512.             if (item.bCellBorder)
  2513.             {
  2514.                 g.setColor(item.cellBorderColor);
  2515.                 g.drawRect(halfBorderWidth, yLoc, lWidth, cellHt);
  2516.             }
  2517.         }
  2518.  
  2519.         extraPaint(g, rect);
  2520.  
  2521.         bAllDirty = false;
  2522.     }
  2523.  
  2524.     /**
  2525.       * Override this method to add any special painting effects after text and images are painted
  2526.       * @param g the graphics
  2527.       * @param rect the bounding rectangle
  2528.       */
  2529.     public void extraPaint(Graphics g, Rectangle rect)
  2530.     {
  2531.     }
  2532.  
  2533.     /**
  2534.      * Makes this component visible.
  2535.      * This is a standard Java AWT method which gets called to show this
  2536.      * component. If this component was invisible due to a previous hide()
  2537.      * call it make this component visible again.
  2538.      *
  2539.      * @see java.awt.Component#hide
  2540.      */
  2541.     public synchronized void show()
  2542.     {
  2543.         bAllDirty = true;
  2544.         super.show();
  2545.     }
  2546.  
  2547.     /**
  2548.      * Moves and/or resizes this component.
  2549.      * This is a standard Java AWT method which gets called to move and/or
  2550.      * resize this component. Components that are in containers with layout
  2551.      * managers should not call this method, but rely on the layout manager
  2552.      * instead.
  2553.      *
  2554.      * @param x horizontal position in the parent's coordinate space
  2555.      * @param y vertical position in the parent's coordinate space
  2556.      * @param width the new width
  2557.      * @param height the new height
  2558.      */
  2559.     public synchronized void reshape(int x, int y, int width, int height)
  2560.     {
  2561.         bAllDirty = true;
  2562.         super.reshape(x, y, width, height);
  2563.     }
  2564.  
  2565.     //--------------------------------------------------
  2566.     // event methods
  2567.     //--------------------------------------------------
  2568.  
  2569.     /**
  2570.      * Adds the specified item listener to receive item events
  2571.      * @param l the item listener
  2572.      * @see #removeItemListener
  2573.      * @see #sourceItemEvent
  2574.      */
  2575.     public synchronized void addItemListener(ItemListener l)
  2576.     {
  2577.         itemListener = AWTEventMulticaster.add(itemListener, l);
  2578.     }
  2579.  
  2580.     /**
  2581.      * Removes the specified item listener so it no longer receives
  2582.      * item events.
  2583.      * @param l the action listener
  2584.      * @see #addItemListener
  2585.      * @see #sourceItemEvent
  2586.      */
  2587.     public synchronized void removeItemListener(ItemListener l)
  2588.     {
  2589.         itemListener = AWTEventMulticaster.remove(itemListener, l);
  2590.     }
  2591.  
  2592.     /**
  2593.      * Adds the specified action listener to receive action events
  2594.      * from this component.
  2595.      * @param l the action listener
  2596.      */
  2597.     public synchronized void addActionListener(ActionListener l)
  2598.     {
  2599.         actionListener = AWTEventMulticaster.add(actionListener, l);
  2600.     }
  2601.  
  2602.     /**
  2603.      * Removes the specified action listener so it no longer receives
  2604.      * action events from this component.
  2605.      * @param l the action listener
  2606.      */
  2607.     public synchronized void removeActionListener(ActionListener l)
  2608.     {
  2609.         actionListener = AWTEventMulticaster.remove(actionListener, l);
  2610.     }
  2611.  
  2612.     /**
  2613.      * Adds a listener for all event changes.
  2614.      * @param PropertyChangeListener listener the listener to add.
  2615.      * @see #removePropertyChangeListener
  2616.      */
  2617.     public synchronized void addPropertyChangeListener(PropertyChangeListener listener)
  2618.     {
  2619.         changes.addPropertyChangeListener(listener);
  2620.     }
  2621.  
  2622.     /**
  2623.      * Removes a listener for all event changes.
  2624.      * @param PropertyChangeListener listener the listener to remove.
  2625.      * @see #addPropertyChangeListener
  2626.      */
  2627.     public synchronized void removePropertyChangeListener(PropertyChangeListener listener)
  2628.     {
  2629.         changes.removePropertyChangeListener(listener);
  2630.     }
  2631.  
  2632.     /**
  2633.      * Adds a vetoable listener for all event changes.
  2634.      * @param VetoableChangeListener listener the listener to add.
  2635.      * @see #removeVetoableChangeListener
  2636.      */
  2637.     public synchronized void addVetoableChangeListener(VetoableChangeListener listener)
  2638.     {
  2639.         vetos.addVetoableChangeListener(listener);
  2640.     }
  2641.  
  2642.     /**
  2643.      * Removes a vetoable listener for all event changes.
  2644.      * @param VetoableChangeListener listener the listener to remove.
  2645.      * @see #addVetoableChangeListener
  2646.      */
  2647.     public synchronized void removeVetoableChangeListener(VetoableChangeListener listener)
  2648.     {
  2649.         vetos.removeVetoableChangeListener(listener);
  2650.     }
  2651.  
  2652.     /**
  2653.      * This is the Mouse Event handling innerclass.
  2654.      */
  2655.     class Mouse extends java.awt.event.MouseAdapter implements java.io.Serializable
  2656.     {
  2657.         /**
  2658.          * Handles Mouse Pressed events
  2659.          * @param e the MouseEvent
  2660.          */
  2661.         public void mousePressed(MouseEvent e)
  2662.         {
  2663.             int x = e.getX();
  2664.             int y = e.getY();
  2665.             int index = -1;
  2666.  
  2667.             requestFocus();
  2668.             fastDownCount++;
  2669.             bMouseDrawHandled = false;
  2670.  
  2671.             if ( (x > -1) && (x < lWidth) )
  2672.             {
  2673.                 index = mouseCalcIndex(y);
  2674.                 if (index == -1)
  2675.                     return;
  2676.  
  2677.                 if (bMultipleSelections)
  2678.                 {
  2679.                     if(e.isShiftDown() && e.isControlDown())
  2680.                     {
  2681.                         bMouseDrawHandled = true;
  2682.                         try { shiftSelect(index, true); } catch(PropertyVetoException exc) {}
  2683.                     }
  2684.                     else if(e.isShiftDown())
  2685.                     {
  2686.                         bMouseDrawHandled = true;
  2687.                         try { shiftSelect(index, false); } catch(PropertyVetoException exc) {}
  2688.                     }
  2689.                     else if(e.isControlDown())
  2690.                     {
  2691.                         bMouseDrawHandled = true;
  2692.                         ctrlSelect(index);
  2693.                     }
  2694.                     else
  2695.                     {
  2696.                         try { setSelectedIndex(index, true); } catch(PropertyVetoException exc) {}
  2697.                     }
  2698.                 }
  2699.                 else
  2700.                 {
  2701.                     lastTempIndex = index;
  2702.                     try { setSelectedIndex(index, true); } catch(PropertyVetoException exc) {}
  2703.                 }
  2704.                 repaint();
  2705.             }
  2706.         }
  2707.  
  2708.         /**
  2709.          * Handles Mouse Released events
  2710.          * @param e the MouseEvent
  2711.          */
  2712.         public void mouseReleased(MouseEvent e)
  2713.         {
  2714.             int x = e.getX();
  2715.             int y = e.getY();
  2716.             int index = -1;
  2717.             boolean bDoubleClick;
  2718.             long selectTime;
  2719.  
  2720.             fastDownCount--;
  2721.             if (bMouseDrawHandled) // multi-selected ctrl or shift
  2722.             {
  2723.                 notifyHelper(-1, y, -1, false);
  2724.                 return;
  2725.             }
  2726.  
  2727.             index = mouseCalcIndex(y);
  2728.             if ( (index == -1) || (x < 0) || (x >= lWidth) )
  2729.             {
  2730.                 fastDownCount = 0;
  2731.                 index = lastTempIndex;
  2732.                 if (index == -1)
  2733.                     return;
  2734.             }
  2735.  
  2736.             if (bComboMode)
  2737.             {
  2738.                 fastDownCount = 0;
  2739.                 bDoubleClick = false;
  2740.             }
  2741.             else
  2742.             {
  2743.                 // sometimes you get two MOUSE_DOWNS before the first MOUSE_UP
  2744.                 if (fastDownCount > 0)
  2745.                 {
  2746.                     fastDownCount = 0;
  2747.                     bDoubleClick = true;
  2748.                     prevSelectTime = -1;
  2749.                     prevSelectRow = -1;
  2750.                 }
  2751.                 else
  2752.                 {
  2753.                     selectTime = System.currentTimeMillis();
  2754.                     if ( (prevSelectTime != -1) &&              // valid prevSelectTime
  2755.                          (prevSelectRow == index) &&            //
  2756.                          ((prevSelectTime + 250) > selectTime)  // A double click
  2757.                       )
  2758.                     {
  2759.                         bDoubleClick = true;
  2760.                         prevSelectTime = -1;
  2761.                         prevSelectRow = -1;
  2762.                     }
  2763.                     else
  2764.                     {
  2765.                         bDoubleClick = false;
  2766.                         prevSelectTime = selectTime;
  2767.                         prevSelectRow = index;
  2768.                     }
  2769.                 }
  2770.             }
  2771.             if (lastSelected != index)
  2772.             {
  2773.                 try { setSelectedIndex(index, true); } catch(PropertyVetoException exc) {}
  2774.                 repaint();
  2775.             }
  2776.             if (bMultipleSelections)
  2777.             {
  2778.                 notifyHelper(x, y, lastSelected, bDoubleClick);
  2779.                 lastIndex = lastSelected;
  2780.             }
  2781.             else
  2782.             {
  2783.                 notifyHelper(x, y, index, bDoubleClick);
  2784.                 lastIndex = index;
  2785.             }
  2786.             lastTempIndex = -1;
  2787.             lastDownModifiers = -1;
  2788.         }
  2789.  
  2790.         /**
  2791.          * Handles Mouse Exited events
  2792.          * @param e the MouseEvent
  2793.          */
  2794.         public void mouseExited(MouseEvent e)
  2795.         {
  2796.             if (!bMultipleSelections && bComboMode)
  2797.                 lastIndex = -1;
  2798.         }
  2799.     }
  2800.  
  2801.     /**
  2802.      * This is the MouseMotion Event handling innerclass.
  2803.      */
  2804.     class MouseMotion implements java.awt.event.MouseMotionListener, java.io.Serializable
  2805.     {
  2806.         /**
  2807.          * Handles Mouse Moved events
  2808.          * @param e the MouseEvent
  2809.          */
  2810.         public void mouseMoved(MouseEvent e)
  2811.         {
  2812.             if(!bMultipleSelections)
  2813.             {
  2814.                 int x = e.getX();
  2815.                 int y = e.getY();
  2816.                 int  index = -1;
  2817.  
  2818.                 if ( (x > -1) && (x < lWidth) )
  2819.                 {
  2820.                     if (bComboMode)
  2821.                     {
  2822.                         index = mouseCalcIndex(y);
  2823.                         if (index == -1 || index == lastIndex)
  2824.                             return;
  2825.                         lastIndex = index;
  2826.  
  2827.                         try { setSelectedIndex(index, true); } catch(PropertyVetoException exc) {}
  2828.                         repaint();
  2829.                     }
  2830.                 }
  2831.             }
  2832.         }
  2833.  
  2834.         /**
  2835.          * Handles Mouse Dragged events
  2836.          * @param e the MouseEvent
  2837.          */
  2838.         public void mouseDragged(MouseEvent e)
  2839.         {
  2840.             int x = e.getX();
  2841.             int y = e.getY();
  2842.             int  index = -1;
  2843.  
  2844.             if ( (x > -1) && (x < lWidth) )
  2845.             {
  2846.                 if (bComboMode)
  2847.                 {
  2848.                     index = mouseCalcIndex(y);
  2849.                     if (index == -1 || index == lastIndex)
  2850.                         return;
  2851.                     lastIndex = index;
  2852.  
  2853.                     try { setSelectedIndex(index, true); } catch(PropertyVetoException exc) {}
  2854.                     repaint();
  2855.                 }
  2856.                 else
  2857.                 {
  2858.                     index = mouseCalcIndex(y);
  2859.                     if (index != -1 && index != lastIndex)
  2860.                     {
  2861.                         if (bMultipleSelections)
  2862.                         {
  2863.                             if (e.getModifiers() != 0)
  2864.                                 return;
  2865.  
  2866.                             bInternalBlockPaint = true;
  2867.                             try { setVisibleIndex(index); } catch(PropertyVetoException exc){}
  2868.                             bInternalBlockPaint = false;
  2869.                             try { shiftSelect(index, false); } catch(PropertyVetoException exc) {}
  2870.                         }
  2871.                         else
  2872.                         {
  2873.                             try { setSelectedIndex(index, true); } catch(PropertyVetoException exc) {}
  2874.                         }
  2875.                         lastIndex = index;
  2876.                     }
  2877.                 }
  2878.             }
  2879.         }
  2880.     }
  2881.  
  2882.     /**
  2883.      * This is the Key Event handling innerclass.
  2884.      */
  2885.     class Key extends java.awt.event.KeyAdapter implements java.io.Serializable
  2886.     {
  2887.         /**
  2888.          * Handles Key Pressed events
  2889.          * @param e the KeyEvent
  2890.          */
  2891.         public void keyPressed(KeyEvent e)
  2892.         {
  2893.             if (e.isControlDown() || e.isMetaDown() || e.isAltDown())
  2894.                 return;
  2895.  
  2896.             int index = -1;
  2897.  
  2898.             switch(e.getKeyCode())
  2899.             {
  2900.                 case KeyEvent.VK_HOME:
  2901.                     index = keyCalcIndex(0, true);
  2902.                     break;
  2903.                 case KeyEvent.VK_END:
  2904.                     index = keyCalcIndex(items.size() - 1, true);
  2905.                     break;
  2906.                 case KeyEvent.VK_PAGE_UP:
  2907.                     index = keyCalcIndex(-visibleRows, false);
  2908.                     break;
  2909.                 case KeyEvent.VK_PAGE_DOWN:
  2910.                     index = keyCalcIndex(visibleRows, false);
  2911.                     break;
  2912.                 case KeyEvent.VK_UP:
  2913.                     index = keyCalcIndex(-1, false);
  2914.                     break;
  2915.                 case KeyEvent.VK_DOWN:
  2916.                     index = keyCalcIndex(1, false);
  2917.                     break;
  2918.             }
  2919.             if (index == -1)
  2920.                 return;
  2921.  
  2922.             if (bMultipleSelections && e.isShiftDown())
  2923.             {
  2924.                 try { setVisibleIndex(index); } catch(PropertyVetoException exc){}
  2925.                 try { shiftSelect(index, false); } catch(PropertyVetoException exc){}
  2926.                 return;
  2927.             }
  2928.  
  2929.             // regular select, multiple or single
  2930.             try { setSelectedIndex(index, true); } catch(PropertyVetoException exc) {}
  2931.             repaint();
  2932.             notifyHelper(-1, -1, index, false);
  2933.             prevSelectTime = -1;
  2934.             prevSelectRow = -1;
  2935.         }
  2936.     }
  2937.  
  2938.     /**
  2939.      * This is the Adjustment Event handling innerclass.
  2940.      */
  2941.     class Adjustment implements java.awt.event.AdjustmentListener, java.io.Serializable
  2942.     {
  2943.         /**
  2944.          * Handles ScrollBar events
  2945.          * @param e the AdjustmentEvent
  2946.          */
  2947.         public void adjustmentValueChanged(AdjustmentEvent e)
  2948.         {
  2949.             //We are only listening to the VBar and the HBar...
  2950.             if(e.getSource() == VBar)
  2951.             {
  2952.                 if(e.getAdjustmentType() == AdjustmentEvent.TRACK)
  2953.                     scrollVertical(e.getValue(), true);
  2954.                 else
  2955.                     scrollVertical(e.getAdjustmentType(), false);
  2956.             }
  2957.             else if(e.getSource() == HBar)
  2958.             {
  2959.                 if(e.getAdjustmentType() == AdjustmentEvent.TRACK)
  2960.                     scrollHorizontal(e.getValue(), true);
  2961.                 else
  2962.                     scrollHorizontal(e.getAdjustmentType(), false);
  2963.             }
  2964.         }
  2965.     }
  2966.  
  2967.     /**
  2968.      * Fire an item event to the listeners
  2969.      * @see #addItemListener
  2970.      * @see #removeItemListener
  2971.      */
  2972.     protected void sourceItemEvent()
  2973.     {
  2974.         if (itemListener != null)
  2975.             itemListener.itemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, this, ItemEvent.SELECTED));
  2976.     }
  2977.  
  2978.     /**
  2979.      * Fire an action event to the listeners
  2980.      * @param command the string containing the command to send
  2981.      * with the event.
  2982.      */
  2983.     protected void sourceActionEvent(String command)
  2984.     {
  2985.         if (actionListener != null)
  2986.             actionListener.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, command));
  2987.     }
  2988.  
  2989.     /**
  2990.      * Determines if the given index is valid.
  2991.      * @param index a zero-relative index to check
  2992.      * @return true if the index is valid, false if not
  2993.      */
  2994.     protected boolean validIndex(int index)
  2995.     {
  2996.         if (index >= 0 && index < items.size())
  2997.             return true;
  2998.         return false;
  2999.     }
  3000.  
  3001.     /**
  3002.      * Determines if the item at the given index is visible.
  3003.      * @param index the zero-relative index of the item to check
  3004.      * @return true if the item is visible, false if not
  3005.      */
  3006.     protected boolean isVisibleIndex(int index)
  3007.     {
  3008.         if (index >= nTopRow && index < (nTopRow + visibleRows))
  3009.             return true;
  3010.         return false;
  3011.     }
  3012.  
  3013.     /**
  3014.      * Returns a string representing the state of this object.
  3015.      * This is a standard Java AWT method which can be usefull for debugging.
  3016.      *
  3017.      * @return a handy string for debugging purposes
  3018.      */
  3019.     protected String paramString()
  3020.     {
  3021.         return super.paramString() + ", selected=" + getSelectedItem();
  3022.     }
  3023.  
  3024.     /**
  3025.      * Selects an index in a multiple-selection-enabled ImageListBox
  3026.      * using Shift or Ctrl-Shift modifiers to mimic mouse
  3027.      * selecting with the Shift or Ctrl-Shift modifiers.
  3028.      * @param index the zero-relative position of the item to select
  3029.      * @param bControl whether to select with the Ctrl modifier
  3030.      * @exception PropertyVetoException
  3031.      * if the specified property value is unacceptable
  3032.      */
  3033.     protected void shiftSelect(int index, boolean bControl) throws PropertyVetoException
  3034.     {
  3035.         int i = 0;
  3036.         int s = 0;
  3037.         ListItem li;
  3038.  
  3039.         if (lastSelected == -1)
  3040.             setSelectedIndex(index, true);
  3041.         else if (lastSelected == index)
  3042.         {
  3043.             if (!bControl)
  3044.             {
  3045.                 bInternalBlockPaint = true;
  3046.                 setSelectedIndex(index, true);
  3047.                 bInternalBlockPaint = false;
  3048.             }
  3049.         }
  3050.         else if (lastSelected < index)
  3051.         {
  3052.             if ( !isEnabled(index) )
  3053.                 return;
  3054.  
  3055.             if (bControl)
  3056.             {
  3057.                 i = lastSelected + 1;
  3058.                 s = Math.min(items.size(), index + 1);
  3059.             }
  3060.             else
  3061.             {
  3062.                 i = 0;
  3063.                 s = items.size();
  3064.             }
  3065.             for (; i < s; i++)
  3066.             {
  3067.                 li = (ListItem)items.elementAt(i);
  3068.                 if (i < lastSelected || i > index)
  3069.                 {
  3070.                     if (li.bSelected)
  3071.                     {
  3072.                         li.bDirty = true;
  3073.                         li.bSelected = false;
  3074.                         countSelected--;
  3075.                     }
  3076.                 }
  3077.                 else
  3078.                 {
  3079.                     if (!li.bSelected)
  3080.                     {
  3081.                         li.bDirty = true;
  3082.                         li.bSelected = true;
  3083.                         countSelected++;
  3084.                     }
  3085.                 }
  3086.             }
  3087.         }
  3088.         else if (lastSelected > index)
  3089.         {
  3090.             if ( !isEnabled(index) )
  3091.                 return;
  3092.  
  3093.             if (bControl)
  3094.             {
  3095.                 i = index;
  3096.                 s = Math.min(items.size(), lastSelected);
  3097.             }
  3098.             else
  3099.             {
  3100.                 i = 0;
  3101.                 s = items.size();
  3102.             }
  3103.             for (i = 0; i < s; i++)
  3104.             {
  3105.                 li = (ListItem)items.elementAt(i);
  3106.                 if (i < index || i > lastSelected)
  3107.                 {
  3108.                     if (li.bSelected)
  3109.                     {
  3110.                         li.bDirty = true;
  3111.                         li.bSelected = false;
  3112.                         countSelected--;
  3113.                     }
  3114.                 }
  3115.                 else
  3116.                 {
  3117.                     if (!li.bSelected)
  3118.                     {
  3119.                         li.bDirty = true;
  3120.                         li.bSelected = true;
  3121.                         countSelected++;
  3122.                     }
  3123.                 }
  3124.             }
  3125.         }
  3126.         if (!bInternalBlockPaint) repaint();
  3127.     }
  3128.  
  3129.     /**
  3130.      * Selects an index in a ImageListBox using the Ctrl modifier
  3131.      * to mimic mouse selecting with the Ctrl modifier.
  3132.      * @param index the zero-relative position of the item to select
  3133.      */
  3134.     protected void ctrlSelect(int index)
  3135.     {
  3136.         ListItem listItem = (ListItem)items.elementAt(index);
  3137.         if (!listItem.bEnabled)
  3138.             return;
  3139.  
  3140.         if (listItem.bSelected)
  3141.         {
  3142.             listItem.bSelected = false;
  3143.             countSelected--;
  3144.             lastSelected = -1;
  3145.         }
  3146.         else
  3147.         {
  3148.             listItem.bSelected = true;
  3149.             countSelected++;
  3150.             lastSelected = index;
  3151.         }
  3152.         listItem.bDirty = true;
  3153.         if (!bInternalBlockPaint) repaint();
  3154.     }
  3155.  
  3156.     /**
  3157.      * A utility routine that determines the index of the item the mouse is in,
  3158.      * given the vertical coordinate of the mouse.
  3159.      * @param y mouse vertical (y) coordinate
  3160.      * @return the zero-relative index of the item the mouse is in, or -1 if
  3161.      * past the end of the list
  3162.      */
  3163.     protected int mouseCalcIndex(int y)
  3164.     {
  3165.         int mci;
  3166.  
  3167.         if (y < yAdj)
  3168.             mci = nTopRow - 1;
  3169.         else
  3170.             mci = ((y - yAdj) / cellHt) + nTopRow;
  3171.  
  3172.         if (mci >= items.size())
  3173.             mci = -1;
  3174.         else if (mci < 0)
  3175.             mci = 0;
  3176.  
  3177.         return mci;
  3178.     }
  3179.  
  3180.     /**
  3181.      * Adds an ListItem to the end of the list.
  3182.      * @param li the item to add
  3183.      * @exception PropertyVetoException
  3184.      * if the specified property value is unacceptable
  3185.      * @see #setListItems(java.lang.String[])
  3186.      * @see #addItem(java.lang.String)
  3187.      * @see #addItem(java.lang.String, boolean)
  3188.      * @see #addItem(java.awt.Image, java.lang.String)
  3189.      * @see #addItem(java.awt.Image, java.lang.String, boolean)
  3190.      * @see #addItem(java.awt.Image, java.lang.String, boolean, java.awt.Color)
  3191.      */
  3192.     protected void addItem(ListItem li) throws PropertyVetoException
  3193.     {
  3194.         if(li != null)
  3195.         {
  3196.             String[] oldValue = getListItems();
  3197.             String[] newValue = new String[oldValue.length + 1];
  3198.             for(int count = 0; count < oldValue.length; count++)
  3199.                 newValue[count] = new String(oldValue[count]);
  3200.             newValue[oldValue.length] = new String(li.sText);
  3201.  
  3202.             vetos.fireVetoableChange("ListItems", oldValue, newValue);
  3203.  
  3204.             if(nTopRow < 0)
  3205.             {
  3206.                 nTopRow = 0;
  3207.             }
  3208.  
  3209.             items.addElement(li);
  3210.             updateWidth(li);
  3211.             if (!bInternalBlockPaint) repaint();
  3212.             changes.firePropertyChange("ListItems", oldValue, getListItems());
  3213.         }
  3214.     }
  3215.  
  3216.     private void updateWidth(ListItem li)
  3217.     {
  3218.         int lineWidth = li.lineWidth + LINE_SLOP;
  3219.         if (li.image != null)
  3220.             lineWidth += IMAGE_WIDTH;
  3221.         if ( lineWidth > longestLineValue)
  3222.             longestLineValue = lineWidth;
  3223.     }
  3224.  
  3225.     private void updateWidths(FontMetrics fm)
  3226.     {
  3227.         longestLineValue = 0;
  3228.         int s = items.size();
  3229.         int lineWidth = 0;
  3230.         ListItem li;
  3231.         for (int x = 0; x < s; x++)
  3232.         {
  3233.             li = (ListItem)items.elementAt(x);
  3234.             li.updateWidth(fm);
  3235.  
  3236.             lineWidth = li.lineWidth + LINE_SLOP;
  3237.             if (li.image != null)
  3238.                 lineWidth += IMAGE_WIDTH;
  3239.             if ( lineWidth > longestLineValue)
  3240.                 longestLineValue = lineWidth;
  3241.         }
  3242.     }
  3243.  
  3244.     /**
  3245.      * Utility routine to generate action and/or item events in response to
  3246.      * key or mouse events.
  3247.      * @param x mouse component-relative horizontal position, in pixels
  3248.      * @param x mouse component-relative vertical position, in pixels
  3249.      * @param index zero-relative index of currently selected item
  3250.      * @param bDoubleClick true if mouse double-clicked on item
  3251.      */
  3252.     protected void notifyHelper(int x, int y, int index, boolean bDoubleClick)
  3253.     {
  3254.         if (bDoubleClick)
  3255.         {
  3256.             sourceActionEvent("DoubleClicked");
  3257.         }
  3258.         else
  3259.         {
  3260.             //inside image display area, and line has image!
  3261.             if (x >= 0 && (x - xCoord) < IMAGE_WIDTH)
  3262.             {
  3263.                 ListItem listItem = (ListItem)items.elementAt(index);
  3264.                 if (listItem.image != null)
  3265.                 {
  3266.                     sourceActionEvent("ImageSelected");
  3267.                 }
  3268.             }
  3269.             sourceItemEvent();
  3270.         }
  3271.     }
  3272.  
  3273.     /**
  3274.      * Used to calculate the border colors from the background color.
  3275.      * @see #addNotify
  3276.      * @see java.awt.Component#setBackground
  3277.      */
  3278.     protected void calculateBorderColors(Color c)
  3279.     {
  3280.         borderLighterColor    = ColorUtils.calculateHilightColor(c);
  3281.         borderDarkerColor    = ColorUtils.calculateShadowColor(c);
  3282.         borderLightColor    = ColorUtils.darken(borderLighterColor, 0.200);
  3283.         borderDarkColor        = ColorUtils.darken(borderDarkerColor, 0.200);
  3284.     }
  3285.  
  3286.     /**
  3287.      * Determines the current index given a new absolute or relative index.
  3288.      * @param offset the value used to compute the new index
  3289.      * @param boolean true if offset is zero-relative, false if offset is
  3290.      * relative to the current index value
  3291.      * @return the new current index value
  3292.      */
  3293.     protected int keyCalcIndex(int offset, boolean bAbsolute)
  3294.     {
  3295.         if (bAbsolute)
  3296.             lastIndex = offset;
  3297.         else
  3298.             lastIndex += offset;
  3299.  
  3300.         if (lastIndex >= items.size())
  3301.             lastIndex = items.size() - 1;
  3302.         else if (lastIndex < 0)
  3303.             lastIndex = 0;
  3304.  
  3305.         return lastIndex;
  3306.     }
  3307.  
  3308.     private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException
  3309.     {
  3310.         in.defaultReadObject();
  3311.  
  3312.         ListItem li = null;
  3313.         for (int i = 0; i < items.size(); i++)
  3314.         {
  3315.             li = (ListItem) items.elementAt(i);
  3316.             if (li.url != null) {
  3317.                 li.image = getToolkit().getImage(li.url);
  3318.  
  3319.                 java.awt.MediaTracker tracker = new java.awt.MediaTracker(this);
  3320.                 tracker.addImage(li.image, 0);
  3321.                 try {
  3322.                     tracker.waitForAll();
  3323.                 }
  3324.                 catch(InterruptedException e) {
  3325.                     Object[] args = { li.url };
  3326.                     throw new java.io.IOException(MessageFormat.format(errors.getString("ErrorLoadingImageForURL"), args));
  3327.                 }
  3328.             }
  3329.         }
  3330.  
  3331.     }
  3332.     /**
  3333.      * Zero-relative index of the item displayed in the top row.
  3334.      */
  3335.     protected int   nTopRow = 0;
  3336.     /**
  3337.      * Width of the list content portion of this component, in pixels.
  3338.      * This excludes the border and vertical scroll bar, if present.
  3339.      */
  3340.     protected int   lWidth = 0;
  3341.     /**
  3342.      * Height of a single list cell, in pixels.
  3343.      */
  3344.     protected int   cellHt = 0;
  3345.     /**
  3346.      * Top margin before the contents of the first list item, in pixels.
  3347.      */
  3348.     protected int   yAdj = 0;
  3349.     /**
  3350.      * Width of the left and right borders combined, in pixels.
  3351.      */
  3352.     protected int       borderWidth = 4;
  3353.     /**
  3354.      * Width of the left or right border, in pixels.
  3355.      */
  3356.     protected int       halfBorderWidth = 2;
  3357.  
  3358.     ActionListener actionListener = null;
  3359.     ItemListener itemListener = null;
  3360.  
  3361.     /**
  3362.      * Extra space at end of a line.
  3363.      */
  3364.     protected final int LINE_SLOP = 6;
  3365.     /**
  3366.      * The label of this listbox (not displayed).
  3367.      */
  3368.     protected String ilbLabel;
  3369.     /**
  3370.      * The vertical scroll bar. It always exists event if not shown or showable.
  3371.      */
  3372.     protected Scrollbar   VBar = null;
  3373.     /**
  3374.      * The horizontal scroll bar. It always exists event if not shown or showable.
  3375.      */
  3376.     protected Scrollbar   HBar = null;
  3377.     /**
  3378.      * A vector of the items in the list.
  3379.      */
  3380.     protected Vector      items;
  3381.     /**
  3382.      * The font used for drawing text.
  3383.      */
  3384.     protected Font        font;
  3385.     /**
  3386.      * The font metrics of the font used for drawing text.
  3387.      */
  3388.     transient protected FontMetrics fm = null;
  3389.     /**
  3390.      * If true the list is dirty (needs repaint).
  3391.      */
  3392.     transient protected boolean bAllDirty = true;
  3393.     /**
  3394.      * It true multiple list items can be selected at the same time.
  3395.      */
  3396.     protected boolean bMultipleSelections = false;
  3397.     /**
  3398.      * If true the repainting of the control is prevented.
  3399.      */
  3400.     protected boolean bBlockPaint = false;
  3401.     /**
  3402.      * True if the vertical scroll bar is currently visible.
  3403.      */
  3404.     protected boolean bVBarVisible = false;
  3405.     /**
  3406.      * True if the horizontal scroll bar is currently visible.
  3407.      */
  3408.     protected boolean bHBarVisible = false;
  3409.     /**
  3410.      * True if repainting is temporarily disabled for efficiency purposes.
  3411.      */
  3412.     transient protected boolean bInternalBlockPaint = false;
  3413.     /**
  3414.      * The number of rows to show when this component is automatically laid out.
  3415.      * If rows is less than or equal to zero, it will size to show all of the
  3416.      * existing list items when automatically laid out.
  3417.      */
  3418.     protected int     rowsToShow = -1;
  3419.     /**
  3420.      * The number of columns to show when this component is automatically laid out.
  3421.      */
  3422.     protected int     colsToShow = 10;
  3423.     /**
  3424.      * The number of currently visible lines in this list.
  3425.      */
  3426.     transient protected int     visibleRows = -1;
  3427.     /**
  3428.      * The number of currently visible columns in this list.
  3429.      */
  3430.     transient protected int     visibleCols = -1;
  3431.     /**
  3432.      * The zero-relative index of the first visible list item.
  3433.      */
  3434.     protected int     visibleIndex = -1;
  3435.     /**
  3436.      * The standard height of a line of text in the current font.
  3437.      */
  3438.     transient protected int     fontHeight;
  3439.     /**
  3440.      * The typical distance from the base line to the bottom of most characters
  3441.      * in the current font.
  3442.      */
  3443.     transient protected int     fontDescent;
  3444.     /**
  3445.      * Not used.
  3446.      */
  3447.     transient protected int     lastDownModifiers = -1;
  3448.     /**
  3449.      * The zero-relative index of the currently selected item in the list.
  3450.      * If multiple items are selected, this is the index of the item most
  3451.      * recently selected. If no items are selected, the value is -1.
  3452.      */
  3453.     transient protected int     lastSelected = -1;
  3454.     /**
  3455.      * The zero-relative index of the item the mouse was last moved over,
  3456.      * dragged over, or clicked on. This field is only valid while the
  3457.      * mouse is over this component. When the mouse is not over this component
  3458.      * the value is -1.
  3459.      */
  3460.     transient protected int     lastIndex = -1;
  3461.     /**
  3462.      * The zero-relative index of the item the mouse was pressed on.
  3463.      * It is used when bMultipleSelections is false, and valid
  3464.      * between the time the mouse is pressed and released.
  3465.      * All other times it equals -1.
  3466.      */
  3467.     transient protected int     lastTempIndex = -1;
  3468.     /**
  3469.      * The number of list items currently selected.
  3470.      */
  3471.     transient protected int     countSelected = 0;
  3472.     /**
  3473.      * The current border type of this ImageListBox, one of BORDER_REGULAR or
  3474.      * BORDER_NONE.
  3475.      * A regular border makes the list box appear lower than the surrounding area.
  3476.      * @see #getBorderType
  3477.      * @see #BORDER_REGULAR
  3478.      * @see #BORDER_NONE
  3479.      */
  3480.     protected int     borderType = 0;
  3481.     /**
  3482.      * The width of the widest list item, in pixels.
  3483.      */
  3484.     protected int     longestLineValue = 0;
  3485.     /**
  3486.      * The width of scroll bars, in pixels.  Calculated in addNotify.
  3487.      */
  3488.     transient protected int barSize = 0;
  3489.     /**
  3490.      * The amount the list items are scrolled horizontally, in pixels.
  3491.      */
  3492.     protected int     xCoord = 0;
  3493.     /**
  3494.      * The time at which the mouse was released, in milliseconds.
  3495.      * This is used to determine when a double-click occurs.
  3496.      */
  3497.     transient protected long    prevSelectTime = -1;
  3498.     /**
  3499.      * The zero-relative index of the row at which the mouse was
  3500.      * previously released.
  3501.      * This is used to determine when a double-click occurs.
  3502.      */
  3503.     transient protected long    prevSelectRow = -1;
  3504.     /**
  3505.      * If true this ImageListBox is in "ComboBox mode".
  3506.      * "ComboBox mode" allows the selection point to follow
  3507.      * the mouse even when the mouse button is not down.
  3508.      * This only applies when the ImageListBox is not allowing multiple
  3509.      * selections.
  3510.      *
  3511.      * @see #setComboMode
  3512.      */
  3513.     protected boolean bComboMode = false;
  3514.     /**
  3515.      * If true list items have borders by default.
  3516.      * Borders are always shown as a solid single-pixel wide line around
  3517.      * the cell.
  3518.      *
  3519.      * @see #setCellBorders
  3520.      */
  3521.     protected boolean bCellBorders = false;
  3522.     /**
  3523.      * If true the vertical scrollbar will be made
  3524.      * visible when necessary, false if it will never be made visible.
  3525.      * @see #setShowVerticalScroll
  3526.      */
  3527.     protected boolean bAllowShowVBar = true;
  3528.     /**
  3529.      * If true the horizontal scrollbar will be made
  3530.      * visible when necessary, false if it will never be made visible.
  3531.      * @see #setShowHorizontalScroll
  3532.      */
  3533.     protected boolean bAllowShowHBar = true;
  3534.  
  3535.     /**
  3536.      * Color used in drawing of the border.
  3537.      */
  3538.     protected Color borderLighterColor    = null;
  3539.     /**
  3540.      * Color used in drawing of the border.
  3541.      */
  3542.     protected Color borderDarkerColor    = null;
  3543.     /**
  3544.      * Color used in drawing of the border.
  3545.      */
  3546.     protected Color borderLightColor    = null;
  3547.     /**
  3548.      * Color used in drawing of the border.
  3549.      */
  3550.     protected Color borderDarkColor    = null;
  3551.     /**
  3552.      * Cached value of the background color.  Used to determine if calculated colors need to be updated.
  3553.      */
  3554.     protected Color cachedBackground    = null;
  3555.  
  3556.     //!!! LAB !!! Come back and remove this isMacintosh stuff once MRJ handles SystemColor!
  3557.  
  3558.     /**
  3559.      * The background color for highlighted text.
  3560.      */
  3561.     protected Color textHighlight = symantec.itools.lang.OS.isMacintosh() ? new Color(0,0,128) : SystemColor.textHighlight;
  3562.  
  3563.     /**
  3564.      * The text color for highlighted text.
  3565.      */
  3566.     protected Color textHighlightText = symantec.itools.lang.OS.isMacintosh() ? Color.white : SystemColor.textHighlightText;
  3567.  
  3568.     /**
  3569.      * The default color for enabled text items.
  3570.      */
  3571.     protected Color enabledColor = symantec.itools.lang.OS.isMacintosh() ? Color.black : SystemColor.textText;
  3572.     /**
  3573.      * The default color for disabled text items.
  3574.      */
  3575.     protected Color disabledColor = symantec.itools.lang.OS.isMacintosh() ? Color.gray : SystemColor.textInactiveText;
  3576.     /**
  3577.      * Used to detect two mouse pressed events without a mouse released
  3578.      * event in-between. This may sometimes happen if the mouse is pressed
  3579.      * twice very quickly.
  3580.      */
  3581.     protected int fastDownCount = 0;
  3582.     /**
  3583.      * True if drawing was handled on mouse down and no drawing action needs
  3584.      * to be taken on mouse up.
  3585.      */
  3586.     protected boolean bMouseDrawHandled = false;
  3587.     /**
  3588.      * Error strings.
  3589.      */
  3590.     transient protected ResourceBundle errors;
  3591.  
  3592.     private Mouse            mouse        = null;
  3593.     private MouseMotion    mouseMotion    = null;
  3594.     private Key            key            = null;
  3595.     private Adjustment        adjustment    = null;
  3596.     private symantec.itools.beans.VetoableChangeSupport vetos = new symantec.itools.beans.VetoableChangeSupport(this);
  3597.     private symantec.itools.beans.PropertyChangeSupport changes = new symantec.itools.beans.PropertyChangeSupport(this);
  3598. }
  3599.  
  3600.