www.pudn.com > lphant-v1.00-src.zip > sharedListView.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.Drawing; 
using System.Drawing.Drawing2D; 
using eLePhant.eDonkey; 
using eLePhant.Types; 
 
namespace eLePhant.Client 
{ 
	///  
	/// Summary description for sharedListView. 
	///  
	public class sharedListView : eLePhantListView 
	{ 
		///  
		/// Required designer variable. 
		///  
		private CkernelGateway krnGateway; 
		private ContextMenu ContextMenuShared; 
		private ColumnSorter TheColumnSorter; 
		private MenuItem PriorityMenu; 
		private InterfacePreferences m_config; 
		 
		public CMenuInfo MenuInfo; 
 
		private System.ComponentModel.Container components = null; 
 
		public sharedListView(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 sharedListView() 
		{ 
			///  
			/// Required for Windows.Forms Class Composition Designer support 
			///  
			InitializeComponent(); 
 
			// 
			// TODO: Add any constructor code after InitializeComponent call 
			// 
		} 
		public void Initilize(CkernelGateway in_krnGateway) 
		{ 
			Name = "sharedListView"; 
			krnGateway=in_krnGateway; 
			krnGateway.OnRefreshShared+=new RefreshEvent(m_InvokeOnRefreshShared); 
			krnGateway.OnNewSharedFile+=new FileEvent(m_InvokeOnNewSharedFile); 
			krnGateway.OnRemovedSharedFile+=new FileEvent(m_InvokeOnRemovedSharedFile); 
 
			Columns.Add("File Name",190,false); 
			Columns.Add("Size",75,false); 
			Columns.Add("Priority",60,false); 
			Columns.Add("Progress",60,true); 
			 
			ContextMenuShared = new ContextMenu(); 
			ContextMenuShared.MenuItems.Add("Open file",new EventHandler(OnOpenFile)); 
			ContextMenuShared.MenuItems.Add("Delete file",new EventHandler(OnDeleteFile)); 
			ContextMenuShared.MenuItems.Add("-"); 
			ContextMenuShared.MenuItems.Add("Copy eLink to clipboard",new EventHandler(OnCopyLink)); 
			ContextMenuShared.MenuItems.Add("Copy eLink to clipboard (HTML)", new EventHandler(OnCopyLinkHTML)); 
			ContextMenuShared.MenuItems.Add("Copy eLink to clipboard (Sources)", new EventHandler(OnCopyLinkSources)); 
			ContextMenuShared.MenuItems.Add("-"); 
			 
			PriorityMenu = new MenuItem( "&Priority");  
			 
			ContextMenuShared.MenuItems.Add(PriorityMenu); 
			PriorityMenu.MenuItems.Add("Very high Priority",new EventHandler(OnReleasePriority)); 
			PriorityMenu.MenuItems.Add("High Priority",new EventHandler(OnHighPriority)); 
			PriorityMenu.MenuItems.Add("Normal Priority",new EventHandler(OnNormalPriority)); 
			PriorityMenu.MenuItems.Add("Low Priority",new EventHandler(OnLowPriority)); 
			PriorityMenu.MenuItems.Add("Very low Priority",new EventHandler(OnVeryLowPriority)); 
 
			ContextMenuShared.MenuItems.Add("-"); 
			MenuItem MenuItemInfo=new MenuItem("Search more info"); 
			ContextMenuShared.MenuItems.Add(MenuItemInfo); 
			MenuInfo=new CMenuInfo(MenuItemInfo); 
 
			ContextMenu=ContextMenuShared; 
			ContextMenuShared.Popup+=new System.EventHandler(myContextMenuPopup); 
			 
			TheColumnSorter=new ColumnSorter(); 
			TheColumnSorter.CurrentColumn=1; 
			TheColumnSorter.sortOrder=-1; 
 
			this.ClickHeader+=new HeaderEventHandler(myColumnClick); 
			this.DoubleClick+=new EventHandler(OnOpenFile); 
			this.KeyDown+=new KeyEventHandler(OnKeyDown); 
 
			m_DefaultWidths=new int[] {190,75,60,60}; 
			m_Globalize(); 
			m_LoadWidths(); 
			SmallImageList=eLePhantForm.SystemIconsList.list; 
			SelectedIndexChanged+=new EventHandler(sharedListView_SelectedIndexChanged); 
			ReloadList(false); 
		} 
		 
		private void m_Globalize() 
		{ 
			Columns[0].Text=eLePhantForm.Globalization["LBL_FILENAME"]; 
			Columns[1].Text=eLePhantForm.Globalization["LBL_SIZE"]; 
			Columns[2].Text=eLePhantForm.Globalization["LBL_PRIORITY"]; 
			Columns[3].Text=eLePhantForm.Globalization["LBL_PROGRESS"]; 
			ContextMenuShared.MenuItems[0].Text=eLePhantForm.Globalization["LBL_OPENFILE"]; 
			ContextMenuShared.MenuItems[1].Text=eLePhantForm.Globalization["LBL_DELETEFILE"]; 
			ContextMenuShared.MenuItems[3].Text=eLePhantForm.Globalization["LBL_COPYLINK"]; 
			ContextMenuShared.MenuItems[4].Text=eLePhantForm.Globalization["LBL_COPYLINK"] + " (HTML)"; 
			ContextMenuShared.MenuItems[5].Text=eLePhantForm.Globalization["LBL_COPYLINK"] + " ("+eLePhantForm.Globalization["LBL_SOURCES"]+")"; 
			ContextMenuShared.MenuItems[7].Text=eLePhantForm.Globalization["LBL_PRIORITY"]; 
			ContextMenuShared.MenuItems[9].Text=eLePhantForm.Globalization["LBL_SEARCHINFO"]; 
			PriorityMenu.MenuItems[0].Text=eLePhantForm.Globalization["LBL_VERYHIGH"]; 
			PriorityMenu.MenuItems[1].Text=eLePhantForm.Globalization["LBL_HIGH"]; 
			PriorityMenu.MenuItems[2].Text=eLePhantForm.Globalization["LBL_NORMAL"]; 
			PriorityMenu.MenuItems[3].Text=eLePhantForm.Globalization["LBL_LOW"]; 
			PriorityMenu.MenuItems[4].Text=eLePhantForm.Globalization["LBL_VERYLOW"]; 
		} 
 
		public void Globalize() 
		{ 
			m_Globalize(); 
			this.Refresh(); 
		} 
 
		private void myContextMenuPopup(object sender, System.EventArgs e) 
		{ 
			m_config=krnGateway.GetConfig(); 
			ContextMenuShared.MenuItems[0].DefaultItem = true; 
			m_CheckPriority(); 
			MenuInfo.OnMenuInfoChange(); 
									 
			if (SelectedItems.Count==0) 
			{ 
				ContextMenuShared.MenuItems[0].Enabled=false; 
				ContextMenuShared.MenuItems[1].Enabled=false; 
				ContextMenuShared.MenuItems[3].Enabled=false; 
				ContextMenuShared.MenuItems[4].Enabled=false; 
				ContextMenuShared.MenuItems[5].Enabled=false; 
				ContextMenuShared.MenuItems[7].Enabled=false; 
				ContextMenuShared.MenuItems[9].Enabled=false; 
				PriorityMenu.MenuItems[0].Enabled=false; 
				PriorityMenu.MenuItems[1].Enabled=false; 
				PriorityMenu.MenuItems[2].Enabled=false; 
				PriorityMenu.MenuItems[3].Enabled=false; 
				PriorityMenu.MenuItems[4].Enabled=false; 
				 
			} 
			if (SelectedItems.Count==1) 
			{								 
				ContextMenuShared.MenuItems[0].Enabled=m_IsCompleted(); 
				ContextMenuShared.MenuItems[1].Enabled=m_IsCompleted(); 
				ContextMenuShared.MenuItems[3].Enabled=true; 
				ContextMenuShared.MenuItems[4].Enabled=true; 
				ContextMenuShared.MenuItems[5].Enabled=m_config.IsHighID; 
				ContextMenuShared.MenuItems[7].Enabled=true; 
				ContextMenuShared.MenuItems[9].Enabled=true; 
				PriorityMenu.MenuItems[0].Enabled=true; 
				PriorityMenu.MenuItems[1].Enabled=true; 
				PriorityMenu.MenuItems[2].Enabled=true; 
				PriorityMenu.MenuItems[3].Enabled=true; 
				PriorityMenu.MenuItems[4].Enabled=true; 
			} 
 
			if (SelectedItems.Count>1) 
			{ 
				ContextMenuShared.MenuItems[0].Enabled=false; 
				ContextMenuShared.MenuItems[1].Enabled=true; 
				ContextMenuShared.MenuItems[3].Enabled=false; 
				ContextMenuShared.MenuItems[4].Enabled=false; 
				ContextMenuShared.MenuItems[5].Enabled=false; 
				ContextMenuShared.MenuItems[7].Enabled=true; 
				ContextMenuShared.MenuItems[9].Enabled=false; 
				PriorityMenu.MenuItems[0].Enabled=true; 
				PriorityMenu.MenuItems[1].Enabled=true; 
				PriorityMenu.MenuItems[2].Enabled=true; 
				PriorityMenu.MenuItems[3].Enabled=true; 
				PriorityMenu.MenuItems[4].Enabled=true; 
			} 
		} 
		 
		private void OnKeyDown(object sender, KeyEventArgs e) 
		{			 
			switch(e.KeyCode) 
			{ 
				case Keys.Delete:  
					m_OnDeleteFile(); 
					break; 
 
				case Keys.Enter:  
					m_OnOpenFile(); 
					break; 
			} 
		} 
 
		private void m_OnOpenFile() 
		{ 
			if (SelectedItems.Count==0) return; 
			InterfaceFile file=(InterfaceFile)SelectedItems[0].Tag; 
			if(file.Status==9) 
			{ 
				try 
				{ 
					System.Diagnostics.Process.Start(file.CompleteName); 
				} 
				catch{} 
			} 
		} 
 
		private void OnOpenFile(object sender, System.EventArgs e) 
		{ 
			m_OnOpenFile();	 
		} 
				 
		private void m_OnDeleteFile() 
		{ 
			if (SelectedItems.Count==0) return; 
			 
			try 
			{ 
				int SelectedItem = SelectedItems.Count; 
				InterfaceFile[] Items= new InterfaceFile[SelectedItem]; 
 
				for(int i=0;i!=SelectedItem;i++) 
				{ 
					Items[i] = (InterfaceFile)SelectedItems[i].Tag; 
				} 
						 
				for(int i=0;i!=SelectedItem;i++) 
				{ 
					if(Items[i].Status!=9) continue; 
					string message = String.Format(eLePhantForm.Globalization["MSG_DELETEFILE"],Items[i].Name); 
					if (MessageBox.Show(message,"lphant",MessageBoxButtons.YesNo,MessageBoxIcon.Warning)==DialogResult.Yes) 
					{						 
						krnGateway.DeleteFile(Items[i].strHash); 
						ReloadList(true); 
					} 
				} 
			} 
			catch(Exception ex) 
			{ 
				Debug.WriteLine(ex.ToString()); 
			} 
		} 
 
		private void OnDeleteFile(object sender, System.EventArgs e) 
		{ 
			m_OnDeleteFile(); 
		} 
 
		private void OnCopyLink(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			InterfaceFile file=(InterfaceFile)SelectedItems[0].Tag; 
			Clipboard.SetDataObject("ed2k://|file|"+file.Name+"|"+file.Size.ToString()+"|"+file.strHash+"|/"); 
		} 
 
		private void OnCopyLinkHTML(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			InterfaceFile file=(InterfaceFile)SelectedItems[0].Tag; 
			Clipboard.SetDataObject(""+file.Name+""); 
		} 
 
		private void OnCopyLinkSources(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			InterfaceFile file=(InterfaceFile)SelectedItems[0].Tag; 
			 
			string IP = (new System.Net.IPAddress(m_config.UserID)).ToString(); 
			Clipboard.SetDataObject("ed2k://|file|"+file.Name+"|"+file.Size.ToString()+"|"+file.strHash+"|/|sources,"+IP+":"+m_config.TCPPort+"|/"); 
		} 
 
		private void OnReleasePriority(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			for(int i=0;i!=SelectedItems.Count;i++) 
			{ 
				krnGateway.SetFileUploadPrioriry(((InterfaceFile)SelectedItems[i].Tag).strHash,Types.Constants.Priority.VeryHigh); 
			} 
			m_RefreshList(); 
		} 
		private void OnHighPriority(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			for(int i=0;i!=SelectedItems.Count;i++) 
			{ 
				krnGateway.SetFileUploadPrioriry(((InterfaceFile)SelectedItems[i].Tag).strHash,Types.Constants.Priority.High); 
			} 
			m_RefreshList(); 
		} 
		private void OnNormalPriority(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			for(int i=0;i!=SelectedItems.Count;i++) 
			{ 
				krnGateway.SetFileUploadPrioriry(((InterfaceFile)SelectedItems[i].Tag).strHash,Types.Constants.Priority.Normal); 
			} 
			m_RefreshList(); 
		} 
		private void OnLowPriority(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			for(int i=0;i!=SelectedItems.Count;i++) 
			{ 
				krnGateway.SetFileUploadPrioriry(((InterfaceFile)SelectedItems[i].Tag).strHash,Types.Constants.Priority.Low); 
			} 
			m_RefreshList(); 
		} 
		private void OnVeryLowPriority(object sender, System.EventArgs e) 
		{ 
			if (SelectedItems.Count==0) return; 
			for(int i=0;i!=SelectedItems.Count;i++) 
			{ 
				krnGateway.SetFileUploadPrioriry(((InterfaceFile)SelectedItems[i].Tag).strHash,Types.Constants.Priority.VeryLow); 
			} 
			m_RefreshList(); 
		} 
 
		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 m_OnNewShared(InterfaceFile shared) 
		{ 
			ListViewItem ItemShared =new ListViewItem(new string[]{"","","",""}); 
			ItemShared.Tag=shared; 
			SharedToItem(shared,ItemShared); 
			Items.Add(ItemShared); 
		} 
 
		private void m_OnRemovedSharedFile(InterfaceFile shared) 
		{ 
			try 
			{ 
				for (int i=0;i completed 
			if(file.Status==9)  
				return true; 
			else 
				return false; 
		} 
 
		private void m_CheckPriority() 
		{	 
			PriorityMenu.MenuItems[0].Checked=false; 
			PriorityMenu.MenuItems[1].Checked=false; 
			PriorityMenu.MenuItems[2].Checked=false; 
			PriorityMenu.MenuItems[3].Checked=false; 
			PriorityMenu.MenuItems[4].Checked=false; 
 
			if (SelectedItems.Count==0) return; 
			if (SelectedItems.Count>1) return; 
 
			InterfaceFile file=(InterfaceFile)SelectedItems[0].Tag; 
			byte index=2; 
			 
			switch(file.UploadPriority) 
			{ 
				case Constants.Priority.VeryHigh:index=0; 
					break; 
				case Constants.Priority.High:index=1; 
					break; 
				case Constants.Priority.Normal:index=2; 
					break; 
				case Constants.Priority.Low:index=3; 
					break; 
				case Constants.Priority.VeryLow:index=4; 
					break; 
				default: index=2; 
					break; 
            } 
			PriorityMenu.MenuItems[index].Checked=true; 
		} 
 
		public void ReloadList(bool reloadToServer) 
		{ 
			if (reloadToServer) krnGateway.RefreshSharedList(); 
			InterfaceFile[] shareds=krnGateway.GetSharedFileList(); 
			Items.Clear(); 
			if (shareds==null) return; 
			lock(this) 
			{ 
				foreach (InterfaceFile shared in shareds) 
				{ 
					if (shared!=null) m_OnNewShared(shared); 
				} 
			} 
			this.ListViewItemSorter = TheColumnSorter;	 
			this.Sort(); 
			this.ListViewItemSorter = null; 
		} 
		 
		private void sharedListView_SelectedIndexChanged(object sender, EventArgs e) 
		{ 
			if (SelectedItems.Count>0) 
			{ 
				InterfaceFile file=(InterfaceFile)SelectedItems[0].Tag; 
				 
				MenuInfo.SearchString=SelectedItems[0].Text; 
				MenuInfo.FileHash=file.strHash; 
				MenuInfo.eD2kLink="ed2k://|file|"+file.Name+"|"+file.Size.ToString()+"|"+file.strHash+"|/"; 
			} 
		} 
 
		protected override void OnDrawItem(int item,int column,Graphics g,Rectangle rec) 
		{ 
 
			InterfaceFile file=(InterfaceFile)(Items[item].Tag); 
			LinearGradientBrush chunkBrush; 
			int xpos=rec.Left; 
			Color b=Color.Red; 
			Color end; 
			if (file.UploadChunksAvaibility==null) 
			{ 
				 
				try 
				{ 
					// calculate the new end color based on start color 
					end = ControlPaint.Dark(b, 0.3F); 
 
					// generate the linear brush 
					chunkBrush = new LinearGradientBrush(new Rectangle(xpos, rec.Top, rec.Right-xpos, rec.Height), b, end, 90); 
					 
					g.FillRectangle(chunkBrush,xpos,rec.Top,rec.Right-xpos,rec.Height); 
					//draw a backcolor margin 
					g.FillRectangle(new SolidBrush(this.BackColor),rec.X,rec.Bottom-1,rec.Width,1); 
 
				} 
				catch(Exception e) 
				{ 
					Debug.WriteLine(e.ToString()); 
				} 
				return; 
			} 
			int ChunkLength; 
			for (int i=0;i0)) 
				{ 
					int col=file.UploadChunksAvaibility[i]*4; 
					if (col>200) col=200; 
					col=Math.Abs(200-col); 
					 
					b=Color.FromArgb(255,col,col,255); 
				} 
				try 
				{ 
					// calculate the new end color based on start color 
					if (ChunkLength<=0) continue; 
					end = ControlPaint.Dark(b, 0.3F); 
 
					// generate the linear brush 
					chunkBrush = new LinearGradientBrush(new Rectangle(xpos, rec.Top, ChunkLength, rec.Height), b, end, 90); 
					 
					g.FillRectangle(chunkBrush, xpos, rec.Top, ChunkLength, rec.Height); 
					//draw a backcolor margin, TODO it produces some flickering 
					g.FillRectangle(new SolidBrush(this.BackColor),rec.X,rec.Bottom-1,rec.Width,1); 
					 
				} 
				catch(Exception e) 
				{ 
					Debug.WriteLine(e.ToString()); 
				} 
				xpos+=ChunkLength; 
			} 
		} 
 
		public class ColumnSorter : 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 1: 
						if ((((InterfaceFile)rowA.Tag).Size)>(((InterfaceFile)rowB.Tag).Size)) 
							return sortOrder; 
						else 
							return -sortOrder; 
					 
					case 2: 
						 
						byte prioA=(byte)((byte)((InterfaceFile)rowA.Tag).UploadPriority+1); 
						byte prioB=(byte)((byte)((InterfaceFile)rowB.Tag).UploadPriority+1); 
						 
						if (prioA==5) prioA=0; 
						if (prioB==5) prioB=0; 
 
						if (prioAprioB)  
							return sortOrder; 
						else  
							return String.Compare(rowA.Text,rowB.Text); 
					 
					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 
	} 
}