
// ImageViewer.java
// Andrew Davison, March 2023, ad@coe.psu.ac.th

/* ImageViewer displays an image in a JPanel.
   Use ImageViewer.view() to invoke it inside a JFrame.
*/

import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
import javax.imageio.*;



public class ImageViewer extends JPanel
{
  private static final int OFFSET = 35;   // for positioning windows

  private int width, height; // of this panel
  private BufferedImage im = null;


  // window positioning; starting at the top-right of the screen
  private static int xWin, yWin;
  static {
    GraphicsEnvironment ge = 
         GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice defaultScreen = ge.getDefaultScreenDevice();
    Rectangle rect = defaultScreen.getDefaultConfiguration().getBounds();
    xWin = (int) rect.getMaxX() - 10;
    yWin = (int) rect.getMinY() + 38;
  }



  public ImageViewer(String fnm)
  {
    try {
      im = ImageIO.read(new File(fnm));
    }
    catch(Exception e) {
      System.out.println("Cannot load " + fnm + "\n");
      System.exit(1);
    }

    width = im.getWidth();
    height = im.getHeight();
  }  // end of ImageViewer()

   
  public Dimension getPreferredSize()
  {   return new Dimension(width, height); }
    

  public void paintComponent(Graphics g)
  {
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
                           RenderingHints.VALUE_RENDER_QUALITY);

    g2d.drawImage(im, 0, 0, null);
  } 


  // -----------------------------------------
  // static invocation


  public static void view(String title, String fnm)
  {
    JFrame f = new JFrame(title);

    java.awt.Container c = f.getContentPane();
    c.add( new ImageViewer(fnm));

    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    f.pack();
    f.setResizable(false);

    f.setLocation(ImageViewer.xWin - f.getWidth(), ImageViewer.yWin);
    ImageViewer.xWin -= ImageViewer.OFFSET; // move left
    ImageViewer.yWin += ImageViewer.OFFSET; // move down

    f.setVisible(true);
  }  // end of view()


}  // end of ImageViewer class
