/*
VisAD system for interactive analysis and visualization of numerical
data.  Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library 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
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/

package visad.install;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * Widget showing general and detailed progress.
 */
public class ProgressMonitor
  extends JFrame
{
  /**
   * Label used to track and display detailed progress information.
   */
  class DetailLabel
    extends JLabel
  {
    private String text;
    private boolean show;

    DetailLabel(String text, boolean show)
    {
      super(text);

      this.text = text;
      this.show = show;
    }

    /**
     * Indicate whether detailed progress is shown.
     *
     * @return true if detailed progress is shown.
     */
    final boolean isShown() { return show; }

    /**
     * Set new detailed progress text.
     *
     * @param text detailed progress text
     */
    public final void setText(String text)
    {
      this.text = text;

      if (show) {
        super.setText(text);
      }
    }

    /**
     * Toggle visibility of detailed progress text.
     */
    final void toggleShown()
    {
      show = !show;
      if (show) {
        super.setText(text);
      } else {
        super.setText("");
        this.invalidate();
      }
    }
  }

  // font used to draw text
  private Font labelFont;

  // internal widgets
  private JLabel phaseLabel;
  private DetailLabel detailLabel;
  private JCheckBox detailBox;

  /**
   * Create a progress monitor which uses a 12 pt Sans Serif font and
   * initially displays the detailed progress text.
   */
  public ProgressMonitor()
  {
    this(true);
  }

  /**
   * Create a progress monitor which uses a 12 pt Sans Serif font.
   *
   * @param showDetails true if details are initially displayed.
   */
  public ProgressMonitor(boolean showDetails)
  {
    this(new Font("sansserif", Font.PLAIN, 12), showDetails);
  }

  /**
   * Create a progress monitor which
   * initially displays the detailed progress text.
   *
   * @param labelFont the font used to draw all text
   */
  public ProgressMonitor(Font labelFont)
  {
    this(labelFont, true);
  }

  /**
   * Create a progress monitor.
   *
   * @param showDetails true if details are initially displayed.
   * @param labelFont the font used to draw all text
   */
  public ProgressMonitor(Font labelFont, boolean showDetails)
  {
    super("Installation Progress Monitor");

    //
    // compute label height & width
    //

    final String w40 = "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW";
    final String longStr = w40 + w40 + w40;

    FontMetrics fm = getFontMetrics(labelFont);

    final int width = fm.stringWidth(w40);
    final int height = fm.getHeight();

    Dimension d = new Dimension(width, height);

    //
    // build UI elements
    //

    phaseLabel = new JLabel("Phase");
    phaseLabel.setFont(labelFont);
    phaseLabel.setMinimumSize(d);
    phaseLabel.setPreferredSize(d);
    phaseLabel.setMaximumSize(d);

    detailLabel = new DetailLabel("", showDetails);
    detailLabel.setFont(labelFont);
    detailLabel.setMinimumSize(d);
    detailLabel.setPreferredSize(d);
    detailLabel.setMaximumSize(d);

    detailBox = new JCheckBox("Show details", showDetails);
    detailBox.setFont(labelFont);
    detailBox.addItemListener(new ItemListener()
      {
        public void itemStateChanged(ItemEvent e)
        {
          detailLabel.toggleShown();
          if (detailLabel.isShown()) {
            pack();
          }
        }
      });

    //
    // Add UI elements
    //

    JPanel pane = new JPanel();
    pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
    pane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

    pane.add(Box.createHorizontalStrut(10));
    pane.add(phaseLabel);
    pane.add(Box.createHorizontalStrut(10));
    pane.add(detailLabel);
    pane.add(Box.createHorizontalStrut(10));
    pane.add(detailBox);
    pane.add(Box.createHorizontalStrut(10));

    setContentPane(pane);
    pack();
  }

  /**
   * Indicate whether detailed progress is shown.
   *
   * @return true if detailed progress is shown.
   */
  public final boolean isDetailShown() { return detailLabel.isShown(); }

  /**
   * Set new detailed progress text.
   *
   * @param detail detailed progress text
   */
  public final void setDetail(String detail)
  {
    detailLabel.setText(detail);
  }

  /**
   * Set new progress phase text.
   *
   * @param phase	 progress phase text
   */
  public final void setPhase(String phase)
  {
    phaseLabel.setText(phase);
    detailLabel.setText("");
  }
}

 

Ads help maintain this website.