public ImgZoomPanel(ZoomTileServer zoomTileServer) {
        m_zoomTileServer = zoomTileServer;
        m_levels = m_zoomTileServer.getLevels();

        // Get the size of the default screen
        Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();

        //TODO consider returning Dimension also; emphasizes 2D nature here
        for (m_level = 0; m_level < m_levels; ++m_level) {
            Dimension levelDimension = m_zoomTileServer.getDimensionByLevel(m_level);
            System.out.println("levelDim is " + levelDimension);
            if (levelDimension.width < screenDim.width && levelDimension.height < screenDim.height) {
                // TODO what if nothing fits??
                m_width = levelDimension.width;
                m_height = levelDimension.height;
                break;
            }
        }
        m_initLevel = m_level;
System.out.println("width " + m_width + " height " + m_height + "level " + m_level);
        m_bufferedImage = new BufferedImage(m_width, m_height, BufferedImage.TYPE_INT_ARGB);

        SwingWorker worker = new SwingWorker<Void, Void>() {
             public Void doInBackground() {
                 show(m_level, 0, 0);
                 return null;
             }
        };
        worker.execute();

        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        JPanel imageCanvas = new JPanel() {
            @Override
            public void paint(Graphics g) {
                System.out.println("PAINT");
                if (null != m_bufferedImage) {
                    g.drawImage(m_bufferedImage, 0, 0, this);
                }
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(m_width, m_height);
            }
        };
        add(imageCanvas);
        MouseInputListener listener = new MouseInputListener() {
            public void mousePressed(MouseEvent e) {
            }
            public void mouseReleased(MouseEvent e) {
            }
            public void mouseEntered(MouseEvent e) {
            }
            public void mouseExited(MouseEvent e) {
            }
            public void mouseClicked(MouseEvent e) {
                System.out.println("e button is " + e.getButton());
                switch (e.getButton()) {
                    case 1:
                        if (m_level > 0) {
                            --m_level;
                            SwingWorker worker = new SwingWorker<Void, Void>() {
                                public Void doInBackground() {
                                    show(m_level, 0, 0);
                                    return null;
                                }
                            };
                            worker.execute();
                        }
                        break;
                    case 3:
                        if (m_level < m_initLevel) {
                            ++m_level;
                            SwingWorker worker = new SwingWorker<Void, Void>() {
                                public Void doInBackground() {
                                    show(m_level, 0, 0);
                                    return null;
                                }
                            };
                            worker.execute();
                        }
                        break;
                }
            }
            public void mouseMoved(MouseEvent e) {
            }
            public void mouseDragged(MouseEvent e) {
            }
        };
        addMouseListener(listener);
        addMouseMotionListener(listener);
    }