    public static JScrollPane getScrollingMenu(
                        final MyMenu menu,
                        final DefaultListModel dlm,
                        final MyList list,
                        final Map<MyMenuItem, ButtonCallback> callbackHash) {
        prevScrollingMenuIndex = -1;
        list.setFixedCellHeight(25);
        final int maxSize = dlm.getSize();
        if (maxSize <= 0) {
            return null;
        }
        if (maxSize > 20) {
            list.setVisibleRowCount(20);
        } else {
            list.setVisibleRowCount(maxSize);
        }
        list.addMouseListener(new MouseAdapter() {
            @Override public void mouseExited(final MouseEvent evt) {
                prevScrollingMenuIndex = -1;
                if (callbackHash != null) {
                    for (final MyMenuItem item : callbackHash.keySet()) {
                        callbackHash.get(item).mouseOut();
                        list.clearSelection();
                    }
                }
            }
            @Override public void mouseEntered(final MouseEvent evt) {
                list.requestFocus();
            }
            @Override public void mousePressed(final MouseEvent evt) {
                prevScrollingMenuIndex = -1;
                if (callbackHash != null) {
                    for (final MyMenuItem item : callbackHash.keySet()) {
                        callbackHash.get(item).mouseOut();
                    }
                }
                final Thread thread = new Thread(new Runnable() {
                    @Override public void run() {
                        final int index = list.locationToIndex(evt.getPoint());
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override public void run() {
                                list.setSelectedIndex(index);
                                menu.setSelected(false);
                            }
                        });
                        final MyMenuItem item =
                                            (MyMenuItem) dlm.elementAt(index);
                        item.action();
                    }
                });
                thread.start();
            }
        });
        list.addMouseMotionListener(new MouseMotionAdapter() {
            @Override public void mouseMoved(final MouseEvent evt) {
                final Thread thread = new Thread(new Runnable() {
                    @Override public void run() {
                        int pIndex = list.locationToIndex(evt.getPoint());
                        if (!list.getCellBounds(pIndex, pIndex).contains(
                                                         evt.getPoint())) {
                            pIndex = -1;
                        }
                        final int index = pIndex;
                        final int lastIndex = prevScrollingMenuIndex;
                        if (index == lastIndex) {
                            return;
                        }
                        prevScrollingMenuIndex = index;
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override public void run() {
                                list.setSelectedIndex(index);
                            }
                        });
                        if (callbackHash != null) {
                            if (lastIndex >= 0) {
                                final MyMenuItem lastItem =
                                        (MyMenuItem) dlm.elementAt(lastIndex);
                                callbackHash.get(lastItem).mouseOut();
                            }
                            if (index >= 0) {
                                final MyMenuItem item =
                                            (MyMenuItem) dlm.elementAt(index);
                                callbackHash.get(item).mouseOver();
                            }
                        }
                    }
                });
                thread.start();
            }
        });
        final JScrollPane sp = new JScrollPane(list);
        sp.setViewportBorder(null);
        sp.setBorder(null);
        list.addKeyListener(new KeyAdapter() {
            @Override public void keyTyped(final KeyEvent e) {
                final char ch = e.getKeyChar();
                if (ch == ' ' || ch == '\n') {
                    final MyMenuItem item =
                                       (MyMenuItem) list.getSelectedValue();
                    if (item != null) {
                        item.action();
                    }
                } else {
                    if (Character.isLetterOrDigit(ch)) {
                        final Thread t = new Thread(new Runnable() {
                            @Override public void run() {
                                getGUIData().getMainGlassPane().start("" + ch,
                                                                      null,
                                                                      true);
                                stopProgressIndicator("" + ch);
                            }
                        });
                        t.start();
                    }
                }
            }
        });
        return sp;
    }

    public static JScrollPane getScrollingMenu(
                        final MyMenu menu,
                        final DefaultListModel dlm,
                        final MyList list,
                        final Map<MyMenuItem, ButtonCallback> callbackHash) {
        prevScrollingMenuIndex = -1;
        list.setFixedCellHeight(25);
        final int maxSize = dlm.getSize();
        if (maxSize <= 0) {
            return null;
        }
        if (maxSize > 20) {
            list.setVisibleRowCount(20);
        } else {
            list.setVisibleRowCount(maxSize);
        }
        list.addMouseListener(new MouseAdapter() {
            @Override public void mouseExited(final MouseEvent evt) {
                prevScrollingMenuIndex = -1;
                if (callbackHash != null) {
                    for (final MyMenuItem item : callbackHash.keySet()) {
                        callbackHash.get(item).mouseOut();
                        list.clearSelection();
                    }
                }
            }
            @Override public void mouseEntered(final MouseEvent evt) {
            }
            @Override public void mousePressed(final MouseEvent evt) {
                prevScrollingMenuIndex = -1;
                if (callbackHash != null) {
                    for (final MyMenuItem item : callbackHash.keySet()) {
                        callbackHash.get(item).mouseOut();
                    }
                }
                final Thread thread = new Thread(new Runnable() {
                    @Override public void run() {
                        final int index = list.locationToIndex(evt.getPoint());
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override public void run() {
                                list.setSelectedIndex(index);
                                menu.setSelected(false);
                            }
                        });
                        final MyMenuItem item =
                                            (MyMenuItem) dlm.elementAt(index);
                        item.action();
                    }
                });
                thread.start();
            }
        });
        list.addMouseMotionListener(new MouseMotionAdapter() {
            @Override public void mouseMoved(final MouseEvent evt) {
                final Thread thread = new Thread(new Runnable() {
                    @Override public void run() {
                        int pIndex = list.locationToIndex(evt.getPoint());
                        if (!list.getCellBounds(pIndex, pIndex).contains(
                                                         evt.getPoint())) {
                            pIndex = -1;
                        }
                        final int index = pIndex;
                        final int lastIndex = prevScrollingMenuIndex;
                        if (index == lastIndex) {
                            return;
                        }
                        prevScrollingMenuIndex = index;
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override public void run() {
                                list.setSelectedIndex(index);
                            }
                        });
                        if (callbackHash != null) {
                            if (lastIndex >= 0) {
                                final MyMenuItem lastItem =
                                        (MyMenuItem) dlm.elementAt(lastIndex);
                                callbackHash.get(lastItem).mouseOut();
                            }
                            if (index >= 0) {
                                final MyMenuItem item =
                                            (MyMenuItem) dlm.elementAt(index);
                                callbackHash.get(item).mouseOver();
                            }
                        }
                    }
                });
                thread.start();
            }
        });
        final JScrollPane sp = new JScrollPane(list);
        sp.setViewportBorder(null);
        sp.setBorder(null);
        list.addKeyListener(new KeyAdapter() {
            @Override public void keyTyped(final KeyEvent e) {
                final char ch = e.getKeyChar();
                if (ch == ' ' || ch == '\n') {
                    final MyMenuItem item =
                                       (MyMenuItem) list.getSelectedValue();
                    if (item != null) {
                        item.action();
                    }
                } else {
                    if (Character.isLetterOrDigit(ch)) {
                        final Thread t = new Thread(new Runnable() {
                            @Override public void run() {
                                getGUIData().getMainGlassPane().start("" + ch,
                                                                      null,
                                                                      true);
                                stopProgressIndicator("" + ch);
                            }
                        });
                        t.start();
                    }
                }
            }
        });
        return sp;
    }
