/***********************************************************************
 * 
 *  Copyright (C) 2005-2006 Novell, Inc. All Rights Reserved.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; version 2.1
 *  of the License.
 *
 *  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 Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, Novell, Inc.
 * 
 *  To contact Novell about this file by physical or electronic mail, 
 *  you may find current contact information at www.novell.com.
 * 
 ***********************************************************************/


using Gtk;
using Glade;
using System;
using System.IO;
using System.Diagnostics;
using System.Threading;

using Novell.CASA;
using Novell.CASA.MiCasa.Common;
using Novell.CASA.MiCasa.Communication;

namespace Novell.CASA.GUI 
{
	public class CasaTray
	{

#if W32
		private static System.Windows.Forms.NotifyIcon		notifyIcon;
		public static System.Drawing.Icon					m_iconNormal;
		public static System.Drawing.Icon					m_iconLocked;
#endif
#if LINUX
		Egg.TrayIcon icon;
		EventBox eb;
		private Gtk.Image m_imageLocked = new Image("images/CASA_16.png", IconSize.Menu);
		private Gtk.Image m_imageUnlocked = new Image(Stock.Find, IconSize.Menu);
		
#endif
		
		private static CasaMain mCasaMain = null;
		private Menu popupMenu = null;
	
		public CasaTray(CasaMain casaInstance)
		{
			mCasaMain = casaInstance;
			Setup();
		}

		public CasaTray()
		{
			Setup();
		}

		private void Setup()
		{
#if W32		
			Stream		s = null;
			notifyIcon = new System.Windows.Forms.NotifyIcon();
			try 
			{
				s = File.OpenRead("../images/CASAIcons.ico");				
				m_iconNormal = new System.Drawing.Icon(s);
				notifyIcon.Icon = m_iconNormal;
			}

			catch (Exception e)
			{
				//MessageBox.Show("File 'notify.ico' cannot be found", "Error");
				//Console.WriteLine(e.ToString());
				//Console.WriteLine("File 'notify.ico' cannot be found");				
				Logger.DbgLog("GUI:CasaTray.Setup() EXCEPTION: \n" + e.ToString());
				Logger.DbgLog("GUI:CasaTray.Setup(): File 'notify.ico' cannot be found");
				return;
			}

			finally 
			{
				if (s != null) 
				{
					s.Close();					
				}
			}

			try 
			{
				s = File.OpenRead("../images/CASAIconsLocked.ico");
				m_iconLocked = new System.Drawing.Icon(s);
			
			}

			catch (Exception e)
			{			
				//Console.WriteLine("File 'CASAIcons.ico' cannot be found");
				Logger.DbgLog("GUI:CasaTray.Setup(): File 'CASAIcons.ico' cannot be found");
				return;
			}

			finally 
			{
				if (s != null) 
				{
					s.Close();					
				}
			}
			//notifyIcon.Click +=new EventHandler(notifyIcon_Click);
			notifyIcon.DoubleClick +=new EventHandler(notifyIcon_DoubleClick);			
			notifyIcon.MouseDown += new System.Windows.Forms.MouseEventHandler(notifyIcon_MouseDown);
			
			notifyIcon.Visible = true;	

			UpdateTrayIcon(MiCASAStore.IsLocked());

#endif	
#if LINUX
		/* in order to receive signals, we need a eventbox,	because Gtk.Image doesn't receive signals */
		eb = new EventBox();
		eb.Add(m_imageUnlocked); // using stock icon
		// hooking event
		eb.ButtonPressEvent += new ButtonPressEventHandler (this.OnImageClick);	
			
		icon = new Egg.TrayIcon("Test");
		icon.Add(eb);
		// showing the trayicon
		icon.ShowAll();	
		
#endif
		}
	
		private void ShowContextMenu()
		{
			if (popupMenu != null && popupMenu.Visible)
			{
				popupMenu.Destroy();
			}


			if (popupMenu == null || !popupMenu.Visible)
			{
				popupMenu = new Menu(); // creates the menu 
 
				MenuItem miSep = new MenuItem();
				MenuItem miSep2 = new MenuItem();
				MenuItem miSep3 = new MenuItem();

				ImageMenuItem menuLaunchGUI = new ImageMenuItem ("Manage Secrets");
				Image appimg = new Image(Stock.New, IconSize.Menu);
				menuLaunchGUI.Image = appimg; // sets the menu item's image
				menuLaunchGUI.Activated +=new EventHandler(menuLaunchGUI_Activated);		
				popupMenu.Add(menuLaunchGUI);
				popupMenu.Add(miSep);

				ImageMenuItem menuLockMiCasa = new ImageMenuItem ("Lock Secrets");	
	
				//appimg = new Image(Stock.Close, IconSize.Menu);
				appimg = new Image("gtk-dialog-authentication", IconSize.Menu);
				menuLockMiCasa.Image = appimg; // sets the menu item's image		
				menuLockMiCasa.Activated +=new EventHandler(menuLockMiCasa_Activated);		

				ImageMenuItem menuUnLockMiCasa = new ImageMenuItem ("Unlock Secrets");		
				appimg = new Image(Stock.Open, IconSize.Menu);
				menuUnLockMiCasa.Image = appimg; // sets the menu item's image
				menuUnLockMiCasa.Activated +=new EventHandler(menuLockMiCasa_Activated);


				popupMenu.Add(menuLockMiCasa);
				popupMenu.Add(menuUnLockMiCasa);
	
				popupMenu.Add(miSep2);

				ImageMenuItem menuDestroyMiCasa = new ImageMenuItem ("Destroy Secrets");
				appimg = new Image(Stock.Delete, IconSize.Menu);
				menuDestroyMiCasa.Image = appimg; // sets the menu item's image
				menuDestroyMiCasa.Activated +=new EventHandler(menuDestroyMiCasa_Activated);
				popupMenu.Add(menuDestroyMiCasa);

				if (MiCASAStore.IsLocked())
				{
					menuLockMiCasa.Sensitive = false;			
					menuDestroyMiCasa.Sensitive = false;
				}
				else
				{
					menuUnLockMiCasa.Sensitive = false;
					menuDestroyMiCasa.Sensitive = true;
				}

				ImageMenuItem menuOptionsMiCasa = new ImageMenuItem ("Preferences");
				menuOptionsMiCasa.Sensitive = false;
				popupMenu.Add(menuOptionsMiCasa);
		
				popupMenu.Add(miSep3);

				// creates a menu item with no image as default
				ImageMenuItem menuPopup1 = new ImageMenuItem ("Exit");				
				appimg = new Image(Stock.Quit, IconSize.Menu);
				menuPopup1.Image = appimg; // sets the menu item's image
				popupMenu.Add(menuPopup1); // adds the menu item to the menu
		
				// hooks a event when the user clicks the icon
				menuPopup1.Activated += new EventHandler(this.OnPopupClick);
				popupMenu.ShowAll(); // shows everything
		
				// pops up the actual menu when the user right clicks
				//popupMenu.Popup(null, null, null, IntPtr.Zero, args.Event.Button, args.Event.Time);
		
				popupMenu.Popup();
			}
		}

		private void OnImageClick (object o, ButtonPressEventArgs args) // handler for mouse click
		{
			if (args.Event.Button == 3) //right click
			{
				ShowContextMenu();
			}
			if (args.Event.Button == 1)
			{
				menuLaunchGUI_Activated(null, null);
			}
		}
		private void OnPopupClick(object o, EventArgs args)
		{
			if (mCasaMain != null)
			{
				this.Destroy();				
			}
			else
				Application.Quit(); // quits the application when the users clicks the popup menu
		}
#if W32

		private void notifyIcon_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
		{
			if (e.Button == System.Windows.Forms.MouseButtons.Right)
				ShowContextMenu();
		}

#endif

		public void CasaManagerQuit()
		{
			//mCasaMain = null;
			if (mCasaMain != null)
				mCasaMain.Hide();
		}

		private void menuLaunchGUI_Activated(object sender, EventArgs e)
		{

			if (mCasaMain == null)
				mCasaMain = new CasaMain(null);
			else 
			{
				mCasaMain.Show();
				mCasaMain.Focus();								
			}
		}

		private void menuLockMiCasa_Activated(object sender, EventArgs e)
		{

			if (MiCASAStore.IsLocked())
			{
				//if( false == miCASA.IsSecretPersistent(1,"") )
				CommonGUI cg = new CommonGUI();
				cg.HandleUnlock(mCasaMain, this);	
				
				//UpdateTrayIcon(false);
				
			}
			else
			{
				MiCasaRequestReply.Send(MiCasaRequestReply.VERB_LOCK_STORE);
				if (mCasaMain != null)
				{
					mCasaMain.LockGUI();
					mCasaMain.RefreshStores();
				}
				UpdateTrayIcon(true);

			}
		}



		/*
		public bool IsMasterPasswordSet()
		{		    	
			string MICASA_PASSCODE_BY_MASTER_PASSWD_FILE = "/.miCASAPCByMPasswd";
			string fileName = Environment.GetEnvironmentVariable("HOME")+MICASA_PASSCODE_BY_MASTER_PASSWD_FILE;           		
			return (File.Exists(fileName));
		}
		*/

		private void notifyIcon_DoubleClick(object sender, EventArgs e)
		{

			//menuLockMiCasa_Activated(sender, e);
			menuLaunchGUI_Activated(sender, e);
		}

		private void menuDestroyMiCasa_Activated(object sender, EventArgs e)
		{
			CommonGUI temp = new CommonGUI();
			temp.menuDestroyMiCasa_Activated(mCasaMain, this);
		}

		internal void UpdateTrayIcon(bool StoreIsLocked)
		{
#if W32
			if (StoreIsLocked)
			{
				notifyIcon.Text = "miCASA - Locked";
				notifyIcon.Icon = m_iconLocked;
			}
			else
			{
				notifyIcon.Text = "miCASA - Not Locked";
				notifyIcon.Icon = m_iconNormal;
			}
#endif

		}

		internal void Destroy()
		{

			if (mCasaMain != null)
				mCasaMain.Dispose();

#if W32
			notifyIcon.Dispose();
#endif
#if LINUX
			// Does not work
			icon.Dispose();
#endif
			Application.Quit();
			
		}
	}
}