www.pudn.com > lphant-v1.00-src.zip > serversListView.cs


#region Copyright (c)2003 Juanjo < http://lphant.sourceforge.net > 
/* 
* This file is part of eLePhant 
* Copyright (C)2003 Juanjo < j_u_a_n_j_o@users.sourceforge.net / http://lphant.sourceforge.net > 
*  
* This program is free software; you can redistribute it and/or 
* modify it under the terms of the GNU General Public License 
* as published by the Free Software Foundation; either 
* version 2 of the License, or (at your option) any later version. 
*  
* This program 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 General Public License for more details. 
*  
* You should have received a copy of the GNU General Public License 
* along with this program; if not, write to the Free Software 
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
*/ 
#endregion 
 
using System; 
using System.ComponentModel; 
using System.Collections; 
using System.Diagnostics; 
using System.Windows.Forms; 
using System.Net; 
using System.Drawing; 
using eLePhant.eDonkey; 
using eLePhant.Types; 
 
namespace eLePhant.Client 
{ 
	///  
	/// Summary description for serversList. 
	///  
 
	public class serversListView : eLePhantListView 
	{ 
		///  
		/// Required designer variable. 
		///  
		private CkernelGateway krnGateway; 
		private ContextMenu ContextMenuServers;  
		private System.ComponentModel.Container components = null; 
		private ServerColumnSorter TheColumnSorter; 
		private MenuItem ConnectMenu;  
		private MenuItem DeleteMenu; 
		private MenuItem CopyLinkMenu; 
		private MenuItem CopyLinkHTMLMenu; 
		private MenuItem PriorityMenu;  
		private MenuItem HighPriorityMenu;  
		private MenuItem NormalPriorityMenu;  
		private MenuItem LowPriorityMenu;  
 
		public serversListView(System.ComponentModel.IContainer container) 
		{ 
			///  
			/// Required for Windows.Forms Class Composition Designer support 
			///  
			container.Add(this); 
			InitializeComponent(); 
 
			// 
			// TODO: Add any constructor code after InitializeComponent call 
			// 
		} 
 
		public serversListView() 
		{ 
			///  
			/// Required for Windows.Forms Class Composition Designer support 
			///  
			InitializeComponent(); 
 
			// 
			// TODO: Add any constructor code after InitializeComponent call 
			// 
		} 
 
		public void Initilize(CkernelGateway in_krnGateway) 
		{ 
			Name="searchListView"; 
			krnGateway=in_krnGateway; 
			krnGateway.OnNewServer+=new ServerEvent(OnNewServer); 
			krnGateway.OnDeleteServer+=new IPEvent(OnDeleteServer); 
			krnGateway.OnRefreshServers+=new RefreshEvent(m_OnRefreshList); 
 
			Columns.Add("Server Name",170,false); 
			Columns.Add("Address",100,false); 
			Columns.Add("Failed",50,false); 
			Columns.Add("Files",60,false); 
            Columns.Add("Users",60,false); 
			Columns.Add("Priority",50,false); 
 
			ContextMenuServers = new ContextMenu();  
			ConnectMenu = new MenuItem("&Connect", new EventHandler(OnConnectServer) );  
			DeleteMenu = new MenuItem("&Delete", new EventHandler(DeleteServer) );  
			CopyLinkMenu = new MenuItem("Copy &link", new EventHandler(OnCopyLink)); 
			CopyLinkHTMLMenu = new MenuItem("Copy link (&HTML)", new EventHandler(OnCopyLinkHTML));  
			PriorityMenu = new MenuItem("&Priority");  
			HighPriorityMenu = new MenuItem("&High priority",new EventHandler(OnHighPriority));  
			NormalPriorityMenu = new MenuItem("&Normal priority",new EventHandler(OnNormalPriority));  
			LowPriorityMenu = new MenuItem("&Low priority",new EventHandler(OnLowPriority));  
			 
			ContextMenuServers.MenuItems.Add(ConnectMenu);           
			ContextMenuServers.MenuItems.Add(DeleteMenu);  
			ContextMenuServers.MenuItems.Add("-"); 
			ContextMenuServers.MenuItems.Add(CopyLinkMenu); 
			ContextMenuServers.MenuItems.Add(CopyLinkHTMLMenu); 
			ContextMenuServers.MenuItems.Add("-"); 
			ContextMenuServers.MenuItems.Add(PriorityMenu); 
			PriorityMenu.MenuItems.Add(HighPriorityMenu);  
			PriorityMenu.MenuItems.Add(NormalPriorityMenu);  
			PriorityMenu.MenuItems.Add(LowPriorityMenu);  
           
			ContextMenuServers.Popup += new EventHandler(OnContextMenuPopup);  
 
			ContextMenu=ContextMenuServers;  
			 
			TheColumnSorter=new ServerColumnSorter(); 
			TheColumnSorter.CurrentColumn=4; 
			TheColumnSorter.sortOrder=1; 
 
			this.ClickHeader+=new HeaderEventHandler(myColumnClick); 
			this.DoubleClick+=new EventHandler(OnConnectServer); 
			this.KeyDown+=new KeyEventHandler(OnKeyDown); 
			m_DefaultWidths=new int[] {170,100,50,60,60,50}; 
			m_Globalize(); 
			ReloadList(); 
			m_LoadWidths(); 
		} 
		 
		private void m_Globalize() 
		{ 
			Columns[0].Text=eLePhantForm.Globalization["LBL_SERVERNAME"]; 
			Columns[1].Text=eLePhantForm.Globalization["LBL_ADDRESS"]; 
			Columns[2].Text=eLePhantForm.Globalization["LBL_FAILED"]; 
			Columns[3].Text=eLePhantForm.Globalization["LBL_FILES"]; 
			Columns[4].Text=eLePhantForm.Globalization["LBL_USERS"]; 
			Columns[5].Text=eLePhantForm.Globalization["LBL_PRIORITY"]; 
			ContextMenu.MenuItems[ContextMenuServers.MenuItems.IndexOf(ConnectMenu)].Text = eLePhantForm.Globalization["LBL_CONNECT"];  
			ContextMenu.MenuItems[ContextMenuServers.MenuItems.IndexOf(DeleteMenu)].Text = eLePhantForm.Globalization["LBL_DELETE"];  
			ContextMenu.MenuItems[ContextMenuServers.MenuItems.IndexOf(CopyLinkMenu)].Text = eLePhantForm.Globalization["LBL_COPYLINK"];  
			ContextMenu.MenuItems[ContextMenuServers.MenuItems.IndexOf(CopyLinkHTMLMenu)].Text = eLePhantForm.Globalization["LBL_COPYLINK"]+" (HTML)"; 
			ContextMenu.MenuItems[ContextMenuServers.MenuItems.IndexOf(PriorityMenu)].Text = eLePhantForm.Globalization["LBL_PRIORITY"];  
			PriorityMenu.MenuItems[PriorityMenu.MenuItems.IndexOf(HighPriorityMenu)].Text = eLePhantForm.Globalization["LBL_HIGH"];  
			PriorityMenu.MenuItems[PriorityMenu.MenuItems.IndexOf(NormalPriorityMenu)].Text = eLePhantForm.Globalization["LBL_NORMAL"];  
			PriorityMenu.MenuItems[PriorityMenu.MenuItems.IndexOf(LowPriorityMenu)].Text = eLePhantForm.Globalization["LBL_LOW"];  
		} 
 
		public void Globalize() 
		{ 
			m_Globalize(); 
			this.Refresh(); 
		} 
 
		private void OnKeyDown(object sender, KeyEventArgs e) 
		{			 
			switch(e.KeyCode) 
			{ 
				case Keys.Delete:  
					m_DeleteServer(); 
					break; 
 
				case Keys.Enter:  
					m_OnConnectServer(); 
					break; 
			} 
		} 
 
		private void myColumnClick(object sender, HeaderEventArgs e) 
		{ 
			TheColumnSorter.CurrentColumn = e.ColumnIndex; 
			TheColumnSorter.sortOrder=this.sortOrder; 
			this.ListViewItemSorter = TheColumnSorter;	 
			this.Sort(); 
			this.ListViewItemSorter = null;			 
		} 
 
		private void OnDeleteServer(uint ip, ushort port) 
		{ 
			InterfaceServer server; 
			foreach (ListViewItem ItemServer in this.Items) 
			{ 
				server=(InterfaceServer)ItemServer.Tag; 
				IPAddress iptodelete = new IPAddress(ip); 
				if ((IPAddress.Parse(server.IP).Equals(iptodelete)&&(server.Port==port)))  
				{ 
					this.Items.Remove(ItemServer); 
					break; 
				} 
			} 
		} 
 
		private void OnCopyLink(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			InterfaceServer server=(InterfaceServer)SelectedItems[0].Tag; 
			Clipboard.SetDataObject("ed2k://|server|"+server.IP+"|"+server.Port.ToString()+"|/"); 
		} 
 
		private void OnCopyLinkHTML(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			InterfaceServer server=(InterfaceServer)SelectedItems[0].Tag; 
			Clipboard.SetDataObject(""+server.Name+""); 
		} 
 
		private void OnHighPriority(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			 
			for(int i=0;i!=SelectedItems.Count;i++) 
			{			 
				string[] strIPPort; 
				ListViewItem ItemServer=this.SelectedItems[i]; 
				if (ItemServer==null) return; 
				strIPPort=ItemServer.SubItems[1].Text.Split(":".ToCharArray()); 
				if (strIPPort.Length==0) return; 
				IPAddress ip=IPAddress.Parse(strIPPort[0]); 
				krnGateway.SetServerPriority(BitConverter.ToUInt32(ip.GetAddressBytes(),0),Convert.ToUInt16(strIPPort[1]),Constants.ServerPriority.High); 
				InterfaceServer server=(InterfaceServer)ItemServer.Tag; 
				server.Priority=Constants.ServerPriority.High; 
				ServerToItem(server,ItemServer); 
			} 
		} 
		private void OnNormalPriority(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			 
			for(int i=0;i!=SelectedItems.Count;i++) 
			{ 
				string[] strIPPort; 
				ListViewItem ItemServer=this.SelectedItems[i]; 
				if (ItemServer==null) return; 
				strIPPort=ItemServer.SubItems[1].Text.Split(":".ToCharArray()); 
				if (strIPPort.Length==0) return; 
				IPAddress ip=IPAddress.Parse(strIPPort[0]); 
				krnGateway.SetServerPriority(BitConverter.ToUInt32(ip.GetAddressBytes(),0),Convert.ToUInt16(strIPPort[1]),Constants.ServerPriority.Normal); 
				InterfaceServer server=(InterfaceServer)ItemServer.Tag; 
				server.Priority=Constants.ServerPriority.Normal; 
				ServerToItem(server,ItemServer); 
 
			} 
		} 
		private void OnLowPriority(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			 
			for(int i=0;i!=SelectedItems.Count;i++) 
			{ 
			 
				string[] strIPPort; 
				ListViewItem ItemServer=this.SelectedItems[i]; 
				if (ItemServer==null) return; 
				strIPPort=ItemServer.SubItems[1].Text.Split(":".ToCharArray()); 
				if (strIPPort.Length==0) return; 
				IPAddress ip=IPAddress.Parse(strIPPort[0]); 
				krnGateway.SetServerPriority(BitConverter.ToUInt32(ip.GetAddressBytes(),0),Convert.ToUInt16(strIPPort[1]),Constants.ServerPriority.Low); 
				InterfaceServer server=(InterfaceServer)ItemServer.Tag; 
				server.Priority=Constants.ServerPriority.Low; 
				ServerToItem(server,ItemServer); 
			} 
		} 
		 
		private void m_OnConnectServer() 
		{ 
			if (SelectedItems.Count==0) return; 
			string[] strIPPort; 
			ListViewItem ItemServer=this.SelectedItems[0]; 
			if (ItemServer==null) return; 
			strIPPort=ItemServer.SubItems[1].Text.Split(":".ToCharArray()); 
			if (strIPPort.Length==0) return; 
			IPAddress ip=IPAddress.Parse(strIPPort[0]); 
			krnGateway.ConnectToServer(BitConverter.ToUInt32(ip.GetAddressBytes(),0),Convert.ToUInt16(strIPPort[1])); 
		} 
 
		private void OnConnectServer(object sender, System.EventArgs e) 
		{ 
			m_OnConnectServer(); 
		} 
 
		private void m_DeleteServer() 
		{ 
			if (SelectedItems.Count==0) return; 
			 
			try 
			{ 
				int SelectedItem = SelectedItems.Count; 
				InterfaceServer[] Items= new InterfaceServer[SelectedItem]; 
 
				for(int i=0;i!=SelectedItem;i++) 
				{ 
					Items[i] = (InterfaceServer)SelectedItems[i].Tag; 
				} 
						 
				for(int i=0;i!=SelectedItem;i++) 
				{ 
					try 
					{ 
						IPAddress ip=IPAddress.Parse(Items[i].IP); 
						krnGateway.DeleteServer(BitConverter.ToUInt32(ip.GetAddressBytes(),0),Items[i].Port); 
					} 
					catch(Exception ex) 
					{ 
						Debug.WriteLine(ex.ToString()); 
					} 
				} 
			} 
			catch(Exception ex) 
			{ 
				Debug.WriteLine(ex.ToString()); 
			} 
		} 
 
		private void DeleteServer(object sender, System.EventArgs e) 
		{ 
			m_DeleteServer(); 
		} 
 
		private void ServerToItem(InterfaceServer server,ListViewItem ItemServer) 
		{ 
			if (server==null) return; 
			if (ItemServer.SubItems[0].Text!=server.Name) ItemServer.SubItems[0].Text=server.Name; 
			if (ItemServer.SubItems[1].Text!=server.IP+":"+server.Port.ToString()) ItemServer.SubItems[1].Text=server.IP+":"+server.Port.ToString(); 
			if (ItemServer.SubItems[2].Text!=server.FailedConnections.ToString()) ItemServer.SubItems[2].Text=server.FailedConnections.ToString(); 
			if (ItemServer.SubItems[3].Text!=server.Files.ToString()) ItemServer.SubItems[3].Text=server.Files.ToString(); 
			if (ItemServer.SubItems[4].Text!=server.Users.ToString()) ItemServer.SubItems[4].Text=server.Users.ToString(); 
			//if (ItemServer.SubItems[5].Text!=server.LastConnection.ToShortTimeString()) ItemServer.SubItems[5].Text=server.LastConnection.ToShortTimeString(); 
			if (ItemServer.SubItems[5].Text!=ServerPriorityToString(server.Priority)) ItemServer.SubItems[5].Text=ServerPriorityToString(server.Priority); 
			ItemServer.Tag=server; 
		}		 
 
		public void OnNewServer(InterfaceServer server) 
		{ 
			ListViewItem ItemServer =new ListViewItem(new string[]{"","","","","",""}); 
			ItemServer.Tag=server; 
			ServerToItem(server,ItemServer); 
			Items.Add(ItemServer); 
		} 
		 
		public void UpdateOrAddServer(InterfaceServer server) 
		{ 
			string ipPort=server.IP+":"+server.Port.ToString(); 
			bool found=false; 
			foreach (ListViewItem ItemServer in this.Items) 
			{ 
				if (ItemServer.SubItems[1].Text==ipPort) 
				{ 
					ServerToItem(server,ItemServer); 
					found=true; 
				} 
			} 
			if (!found) 
				OnNewServer(server); 
		}		 
		 
		private void m_OnRefreshList(CkernelGateway kernelGateway) 
		{ 
			InterfaceServer[] servers=krnGateway.GetServerList(); 
			if (servers==null)  
			{ 
				Items.Clear(); 
				return; 
			} 
			foreach (InterfaceServer server in servers) 
			{ 
				if (server!=null) 
				{ 
					UpdateOrAddServer(server); 
				} 
			} 
			/*not real time sorting 
			ListViewItemSorter = TheColumnSorter;	 
			Sort(); 
			ListViewItemSorter = null;*/ 
		} 
		 
		public void ReloadList() 
		{ 
			InterfaceServer[] servers=krnGateway.GetServerList(); 
			Items.Clear(); 
			if (servers==null) return; 
			foreach (InterfaceServer server in servers) 
			{ 
				if (server!=null) 
				{ 
					OnNewServer(server); 
				} 
			} 
			ListViewItemSorter = TheColumnSorter;	 
			Sort(); 
			ListViewItemSorter = null;	 
		} 
     
		//gczobe 
		private void OnContextMenuPopup(object sender, System.EventArgs e)  
		{  
			ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(ConnectMenu)].DefaultItem = true; 
			m_CheckPriority(); 
 
			if (SelectedItems.Count==0)  
			{  
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(ConnectMenu) ].Enabled = false;  
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(DeleteMenu) ].Enabled = false; 
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(PriorityMenu) ].Enabled = false; 
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(CopyLinkMenu) ].Enabled = false; 
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(CopyLinkHTMLMenu) ].Enabled = false;  
				PriorityMenu.MenuItems[ PriorityMenu.MenuItems.IndexOf(HighPriorityMenu) ].Enabled = false;  
				PriorityMenu.MenuItems[ PriorityMenu.MenuItems.IndexOf(NormalPriorityMenu) ].Enabled = false;  
				PriorityMenu.MenuItems[ PriorityMenu.MenuItems.IndexOf(LowPriorityMenu) ].Enabled = false;  
			}     
			 
			if(SelectedItems.Count==1) 
			{  
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(ConnectMenu) ].Enabled = true;  
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(DeleteMenu) ].Enabled = true;           
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(PriorityMenu) ].Enabled = true;  
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(CopyLinkMenu) ].Enabled = true; 
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(CopyLinkHTMLMenu) ].Enabled = true;  
				PriorityMenu.MenuItems[ PriorityMenu.MenuItems.IndexOf(HighPriorityMenu) ].Enabled = true;  
				PriorityMenu.MenuItems[ PriorityMenu.MenuItems.IndexOf(NormalPriorityMenu) ].Enabled = true;  
				PriorityMenu.MenuItems[ PriorityMenu.MenuItems.IndexOf(LowPriorityMenu) ].Enabled = true;  
			} 
 
			if(SelectedItems.Count>1) 
			{  
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(ConnectMenu) ].Enabled = false;  
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(DeleteMenu) ].Enabled = true;           
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(PriorityMenu) ].Enabled = true;  
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(CopyLinkMenu) ].Enabled = false; 
				ContextMenu.MenuItems[ ContextMenuServers.MenuItems.IndexOf(CopyLinkHTMLMenu) ].Enabled = false; 
				PriorityMenu.MenuItems[ PriorityMenu.MenuItems.IndexOf(HighPriorityMenu) ].Enabled = true;  
				PriorityMenu.MenuItems[ PriorityMenu.MenuItems.IndexOf(NormalPriorityMenu) ].Enabled = true;  
				PriorityMenu.MenuItems[ PriorityMenu.MenuItems.IndexOf(LowPriorityMenu) ].Enabled = true;  
			}  
		}  
		//end gczobe 
 
		private void m_CheckPriority() 
		{	 
			PriorityMenu.MenuItems[0].Checked=false; 
			PriorityMenu.MenuItems[1].Checked=false; 
			PriorityMenu.MenuItems[2].Checked=false; 
			 
			if (SelectedItems.Count==0) return; 
			if (SelectedItems.Count>1) return; 
 
			InterfaceServer server=(InterfaceServer)SelectedItems[0].Tag; 
			byte index=1; 
			 
			switch(server.Priority) 
			{ 
				case Constants.ServerPriority.High:index=0; 
					break; 
				case Constants.ServerPriority.Normal:index=1; 
					break; 
				case Constants.ServerPriority.Low:index=2; 
					break; 
				default: index=1; 
					break; 
			} 
			PriorityMenu.MenuItems[index].Checked=true; 
		} 
 
		public class ServerColumnSorter : IComparer 
		{ 
			public int CurrentColumn = -1; 
			public int sortOrder; 
			 
			public int Compare(object x, object y) 
			{ 
				if ((x==null)||(y==null)) return 0; 
				ListViewItem rowA = (ListViewItem)x; 
				ListViewItem rowB = (ListViewItem)y; 
				switch(CurrentColumn) 
				{ 
						 
					case 2: 
						if ((((InterfaceServer)rowA.Tag).FailedConnections)>(((InterfaceServer)rowB.Tag).FailedConnections)) 
							return sortOrder; 
						else 
							return -sortOrder; 
					case 3: 
						if (((((InterfaceServer)rowA.Tag).Files)>(((InterfaceServer)rowB.Tag).Files))) 
							return -sortOrder; 
						else 
							return sortOrder; 
					case 4: 
						if (((((InterfaceServer)rowA.Tag).Users)>(((InterfaceServer)rowB.Tag).Users))) 
							return -sortOrder; 
						else 
							return sortOrder; 
					case 5: 
						 
										 
						byte prioA=(byte)((byte)((InterfaceServer)rowA.Tag).Priority+1); 
						byte prioB=(byte)((byte)((InterfaceServer)rowB.Tag).Priority+1); 
						 
						if (prioA==2) prioA=0; 
						if (prioB==2) prioB=0; 
						 
						if (prioAprioB)  
							return sortOrder; 
 
						if((((InterfaceServer)rowA.Tag).Files)>(((InterfaceServer)rowB.Tag).Files)) 
							return -sortOrder; 
						else 
							return sortOrder; 
					 
					default: 
						return sortOrder*String.Compare(rowA.SubItems[CurrentColumn].Text, 
							rowB.SubItems[CurrentColumn].Text); 
 
				} 
				  
			} 
		} 
 
			 
 
		#region Component Designer generated code 
		///  
		/// Required method for Designer support - do not modify 
		/// the contents of this method with the code editor. 
		///  
		private void InitializeComponent() 
		{ 
			components = new System.ComponentModel.Container(); 
		} 
		#endregion 
	} 
}