package org.wikiwebserver.distribute.se.gui;

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Image;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

import org.wikiwebserver.distribute.se.ResourceManager;

public class JMainGUI extends JPanel implements WindowListener {
    
    private static final long serialVersionUID = 1L;    
    
    private static JFrame frame;
	private static TrayIcon trayIcon;
	private static boolean firstIconify = true;
    
	public JMainGUI() {
		setLayout(new BorderLayout());
		setBorder(new EmptyBorder(4, 4, 4, 4));
		
		JTabbedPane tabber = new JTabbedPane();
		tabber.addTab(ResourceManager.getString("tabGeneral"), null, new JGeneralConfigPanel());
		tabber.addTab(ResourceManager.getString("tabAdvanced"), null, new JAdvancedConfigPanel());
		
        JScrollPane scrollableHistory = new JScrollPane(new JTaskHistory());
        scrollableHistory.setOpaque(false);
        scrollableHistory.setBorder(new TitledBorder(ResourceManager.getString("tasksPrevious")));
        scrollableHistory.getViewport().setOpaque(false);
        
        JTaskList taskList = new JTaskList();
        taskList.setOpaque(false);
        taskList.setBorder(new TitledBorder(ResourceManager.getString("tasksActive")));
        taskList.setPreferredSize(new Dimension(200, 100));
        
        JSplitPane historyPanel = new JSplitPane(
                JSplitPane.VERTICAL_SPLIT, taskList, scrollableHistory);

        historyPanel.setOpaque(false);
		tabber.addTab(ResourceManager.getString("tabTasks"), null, historyPanel);    
		
        add(tabber, BorderLayout.CENTER);
        add(new JWorkerStatusPanel(), BorderLayout.SOUTH);
	}
	
	
	public static void createAndShowGUI() {


		try {
	        //JFrame.setDefaultLookAndFeelDecorated(true);			
		    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} 
		catch(Exception e) {
		    System.err.println("Error setting system look and feel: " + e);
		}
		

        // Create and set up the window
		String appTitle = ResourceManager.getString("applicationTitle");  
		Image appImage = ResourceManager.getImage("icons/appIcon.png");
        frame = new JFrame(appTitle);
        frame.setIconImage(appImage);
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JMainGUI gui = new JMainGUI();
        frame.getContentPane().add(gui);	

        frame.pack();
        frame.setSize(new Dimension(400, 440));
        
        // Center the frame
        Toolkit kit = Toolkit.getDefaultToolkit(); 
        Dimension d = kit.getScreenSize();
        int x = d.width/2-frame.getWidth()/2;
        int y = d.height/2-frame.getHeight()/2;
        frame.setBounds(x, y, frame.getWidth(), frame.getHeight());
        
        frame.setVisible(true);
        frame.addWindowListener(gui);
        
        // There is an issue with Linux (Gnome) which prevents showing
        // the GUI when clicking on the tray icon. For now disable for linux.
        String os = System.getProperty("os.name");
        
        if (SystemTray.isSupported() && !os.contains("Linux")) {

            SystemTray tray = SystemTray.getSystemTray();
            
            int iconWidth = tray.getTrayIconSize().width;
            int iconHeight = tray.getTrayIconSize().height;
            
            Image trayImage = ResourceManager.getCenteredImage("icons/trayIcon.png", iconWidth, iconHeight);
            trayIcon = new TrayIcon(trayImage, "MyDiskNode", null);
            trayIcon.setImageAutoSize(false);
            
            trayIcon.addMouseListener(new MouseListener() {
                public void mouseClicked(MouseEvent arg0) {
                    frame.setState(Frame.NORMAL);                    
                    frame.setVisible(true);
                    frame.toFront();
                }
                public void mouseEntered(MouseEvent arg0) {}
                public void mouseExited(MouseEvent arg0) {}
                public void mousePressed(MouseEvent arg0) {}
                public void mouseReleased(MouseEvent arg0) {}
            });

            try {
                tray.add(trayIcon);
            } 
            catch (AWTException e) {
                System.err.println("TrayIcon could not be added.");
            }
        }        
    }

    public void windowClosing(WindowEvent e) {
        int r = JOptionPane.showConfirmDialog(this,
                ResourceManager.getString("closeTitle"),
                ResourceManager.getString("closeText"),
                JOptionPane.YES_NO_OPTION);
        
        if (r == JOptionPane.YES_OPTION) {
            System.exit(0);
        }
    }

    public void windowIconified(WindowEvent evt) {
        if (trayIcon != null) {
            if (firstIconify) {
                trayIcon.displayMessage(ResourceManager.getString("trayMessageTitle"), 
                                        ResourceManager.getString("trayMessageText"),
                                        TrayIcon.MessageType.INFO);
                firstIconify = false;
            }
            frame.setVisible(false);        
        }
    }
    

    public void windowActivated(WindowEvent e) { }
    public void windowClosed(WindowEvent e) {}    
    public void windowDeactivated(WindowEvent e) {}
    public void windowDeiconified(WindowEvent e) {}
    public void windowOpened(WindowEvent e) {}     
}

