import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;
import javax.swing.filechooser.FileNameExtensionFilter;

public class FrameOrtasiResim {
	
	public static JPanel anaPanel = new JPanel();
	public static JPanel merkezPanel = new JPanel();
	
	public static int anaPanelGenislik; 
    public static int anaPanelYukseklik;
    
    public static int resimGenislik; 
    public static int resimYukseklik;
    
    public static int x; // merkezPanel'in koordinatlari
    public static int y;
    
    public static BufferedImage resim;
	
	public FrameOrtasiResim() throws IOException {
		
		resim = ImageIO.read(new File("src/images/otobusIci.jpg"));  // açilis resmi.
		
		JFrame frame = new JFrame("Frame Merkezinde Resim Göster | Java Blackboard [149]");
		frame.setLayout(null);
		
		JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");

        JMenuItem openItem = new JMenuItem("Open...");
        JMenuItem saveItem = new JMenuItem("Save");
        JMenuItem exitItem = new JMenuItem("Exit");

        fileMenu.add(openItem);
        fileMenu.add(saveItem);
        fileMenu.addSeparator(); // Ayırıcı ekleyelim bi tane
        fileMenu.add(exitItem);

        menuBar.add(fileMenu);
		
		// ComponentAdapter ile frame boyutu değiştiğinde tetiklenecek olayları dinliyoruz
        frame.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                // Frame boyutu değiştikçe anaPanel'in boyutunu güncelleyelim
                anaPanel.setSize(frame.getSize());
                
                // Boyut değiştikten sonra değerleri alalim
                anaPanelGenislik = anaPanel.getWidth();
                anaPanelYukseklik = anaPanel.getHeight();
 
                x = anaPanelGenislik/2-(resimGenislik/2);
        		y = anaPanelYukseklik/2-((resimYukseklik/2)+22);  // +22 frame baslik + menuBar yükseklik
        		
        		merkezPanel.setBackground(new Color(232, 74, 74));
        		merkezPanel.setLayout(null);
        		merkezPanel.setBounds(x, y, resimGenislik, resimYukseklik);
        		
        		try {
					merkezPanel.add(resimPaneli());
				} catch (IOException e1) {
					e1.printStackTrace();
				}
        		
        		anaPanel.add(merkezPanel);
            }
        });
        
        // ActionListener ekleyerek "Open..." menü öğesine tıklanınca çağrılacak metod
        openItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // "Open..." seçildiğinde yapılacak işlemler
                anaPanel.removeAll(); // Eski resimPanel'i temizle
                merkezPanel.removeAll();

                resim = resimSec();

                // Yeni resim boyutları
                resimGenislik = resim.getWidth();
                resimYukseklik = resim.getHeight();

                merkezPanel.setBackground(new Color(232, 74, 74));
                merkezPanel.setLayout(null);
                merkezPanel.setBounds(x, y, resimGenislik, resimYukseklik);

                try {
                    merkezPanel.add(resimPaneli());
                } catch (IOException e1) {
                    e1.printStackTrace();
                }

                anaPanel.add(merkezPanel);

                // Yeni resim boyutlarına göre anaPanel ve merkezPanel boyutlarını ayarlayalim
                anaPanel.setSize(resimGenislik, resimYukseklik);
                // Pencere kenarlık ve başlık çubuğu için +39
                frame.setSize(resimGenislik + 200, resimYukseklik + 239); 
                
                anaPanel.repaint();
            }
        });
        
        exitItem.addActionListener(new ActionListener() {
        	public void actionPerformed(ActionEvent e) {
        		
        		// Yöntem 1 -> Uygulamayi kapatir.
        		System.exit(0);
        		
        		// Yöntem 2 -> belirli bir JFrame'in kapatılmasını sağlar.
        		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));

        	}
        });

		anaPanel.setLayout(null);
		anaPanel.setBackground(new Color(233, 245, 219));
		
		frame.setJMenuBar(menuBar);
		
		frame.getContentPane().add(anaPanel);
		
		frame.setSize(960, 540); // 16:9
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(true);
		frame.setVisible(true);
	    
	}
	
	public static JPanel resimPaneli() throws IOException {
		
		resimGenislik = resim.getWidth();
	    resimYukseklik = resim.getHeight();
		
		JPanel resimPanel = new JPanel() {
            
			public void paintComponent(Graphics grafik) {
                
				grafik.drawImage(resim, 0, 0, null);  // resmi orijinal haliyle gostermek için.
			 
			}
			
        };
   
        resimPanel.setBounds(0, 0, resimGenislik, resimYukseklik);

        return resimPanel;
        
	}
	
	 
    public static BufferedImage resimSec() {
    	
        JFileChooser fileChooser = new JFileChooser();
        
        // ilk parametresi, dosya filtresinin açıklamasını temsil eder.
        // "Yalnız: JPG JPEG PNG", Kullaniciya yönlendirme mesajı.
        FileNameExtensionFilter dosyaTuru = new FileNameExtensionFilter("Yalnız: JPG JPEG PNG", "jpg", "jpeg", "png");
        
        // kullanıcının sadece belirli türde dosyaları seçebilmesini sağlar. 
        fileChooser.setFileFilter(dosyaTuru);

        // null parametresi, pencerenin merkezi konumda açılmasını sağlar.
        int result = fileChooser.showOpenDialog(null);
        
        // bir dosya seçeilirse, bu metodun dönüş değeri APPROVE_OPTION olur
        if (result == JFileChooser.APPROVE_OPTION) {
            
        	File selectedFile = fileChooser.getSelectedFile();
            
        	try {
        		
                return ImageIO.read(selectedFile);
            
        	} catch (IOException e) {
                
        		e.printStackTrace();
                // Hata durumunda null dönebiliriz veya isteğe bağlı olarak hata mesajı gösterebiliriz.
        		System.out.print("Bir hata oldu.");
            }

        // bir dosya seçmez veya pencere kapanırsa, dönüş değeri CANCEL_OPTION olur.
        } else if(result == JFileChooser.CANCEL_OPTION) {
        	
        	try {
    			resim = ImageIO.read(new File("src/images/secimYok.jpg"));
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
            
            return resim;
            
        }
        
        // Kullanıcı dosya seçmezse veya bir hata oluşursa:
        return null;
        
    }

	
	public static void main(String[] args) throws IOException {
		
		new FrameOrtasiResim();

	}

}
