/*
 * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 *
 */


package com.sun.java.swing.ui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class StatusBar extends JPanel
    implements ActionListener, MouseListener
{

    public StatusBar()
    {
        setLayout(new FlowLayout(0));
        setBorder(BorderFactory.createEtchedBorder());
        progressBar = new JProgressBar(0, 0, 100);
        progressBar.setPreferredSize(new Dimension(60, progressBar.getPreferredSize().height + 2));
        progressBar.setVisible(false);
        label = new JLabel("                                                                                        ");
        preferredSize = new Dimension(getWidth(label.getText()), 2 * getFontHeight());
        add(progressBar);
        add(label);
    }

    public static StatusBar getInstance()
    {
        if(statusBar == null)
            statusBar = new StatusBar();
        return statusBar;
    }

    public static void setInstance(StatusBar sb)
    {
        statusBar = sb;
    }

    protected int getWidth(String s)
    {
        FontMetrics fm = getFontMetrics(getFont());
        if(fm == null)
            return 0;
        else
            return fm.stringWidth(s);
    }

    protected int getFontHeight()
    {
        FontMetrics fm = getFontMetrics(getFont());
        if(fm == null)
            return 0;
        else
            return fm.getHeight();
    }

    public Dimension getPreferredSize()
    {
        return preferredSize;
    }

    public void setMessage(String message)
    {
        label.setText(message);
        label.repaint();
    }

    public void startBusyBar()
    {
        forward = true;
        if(timer == null)
        {
            setMessage("");
            progressBar.setVisible(true);
            timer = new Timer(15, this);
            timer.start();
        }
    }

    public void stopBusyBar()
    {
        if(timer != null)
        {
            timer.stop();
            timer = null;
        }
        setMessage("");
        progressBar.setVisible(false);
        progressBar.setValue(0);
    }

    public void actionPerformed(ActionEvent evt)
    {
        int value = progressBar.getValue();
        if(forward)
        {
            if(value < 100)
            {
                progressBar.setValue(value + 1);
            } else
            {
                forward = false;
                progressBar.setValue(value - 1);
            }
        } else
        if(value > 0)
        {
            progressBar.setValue(value - 1);
        } else
        {
            forward = true;
            progressBar.setValue(value + 1);
        }
    }

    public void mouseClicked(MouseEvent mouseevent)
    {
    }

    public void mousePressed(MouseEvent mouseevent)
    {
    }

    public void mouseReleased(MouseEvent mouseevent)
    {
    }

    public void mouseExited(MouseEvent evt)
    {
        setMessage("");
    }

    public void mouseEntered(MouseEvent evt)
    {
        if(evt.getSource() instanceof AbstractButton)
        {
            AbstractButton button = (AbstractButton)evt.getSource();
            Action action = button.getAction();
            if(action != null)
            {
                String message = (String)action.getValue("LongDescription");
                setMessage(message);
            }
        }
    }

    private static final int PROGRESS_MAX = 100;
    private static final int PROGRESS_MIN = 0;
    private JLabel label;
    private Dimension preferredSize;
    private JProgressBar progressBar;
    private Timer timer;
    private boolean forward;
    private static StatusBar statusBar;

}