/*********************************************************************** * * Copyright (C) 2005-2006 Novell, Inc. * * 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 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, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * 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"); 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"); return; } finally { if (s != null) { s.Close(); } } //notifyIcon.Click +=new EventHandler(notifyIcon_Click); notifyIcon.DoubleClick +=new EventHandler(notifyIcon_DoubleClick); notifyIcon.MouseUp +=new System.Windows.Forms.MouseEventHandler(notifyIcon_MouseUp); 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 ("Options ...."); 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_MouseUp(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(); 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(); } } }