using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using MyDownloader.Core; using System.Collections; using System.Diagnostics; using System.IO; using MyDownloader.Core.Common; using MyDownloader.Extension.Video; using System.Web; using MyDownloader.Extension.AutoDownloads; using MyDownloader.App.Controls; using MyDownloader.Core.UI; using MyDownloader.Extension.WindowsIntegration.ClipboardMonitor; namespace MyDownloader.App.UI { public partial class DownloadList : UserControl, IClipboardDataHandler { delegate void ActionDownloader(Downloader d, ListViewItem item); Hashtable mapItemToDownload = new Hashtable(); Hashtable mapDownloadToItem = new Hashtable(); ListViewItem lastSelection = null; AutoDownloadsExtension scheduler; ClipboardMonitor clipMonitor; public DownloadList() { InitializeComponent(); lvwDownloads.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(lvwDownloads, true, null); lvwSegments.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(lvwSegments, true, null); DownloadManager.Instance.DownloadAdded += new EventHandler(Instance_DownloadAdded); DownloadManager.Instance.DownloadRemoved += new EventHandler(Instance_DownloadRemoved); DownloadManager.Instance.DownloadEnded += new EventHandler(Instance_DownloadEnded); for (int i = 0; i < DownloadManager.Instance.Downloads.Count; i++) { AddDownload(DownloadManager.Instance.Downloads[i]); } lvwDownloads.SmallImageList = FileTypeImageList.GetSharedInstance(); } private void DownloadList_Load(object sender, EventArgs e) { DownloadManager.Instance.BeginAddBatchDownloads += new EventHandler(Instance_BeginAddBatchDownloads); DownloadManager.Instance.EndAddBatchDownloads += new EventHandler(Instance_EndAddBatchDownloads); DownloadManager.Instance.DownloadRemoved+=new EventHandler(Instance_DownloadRemoved); scheduler = (AutoDownloadsExtension)App.Instance.GetExtensionByType(typeof(AutoDownloadsExtension)); clipMonitor = new ClipboardMonitor(this, this.Handle); this.Disposed += delegate(object snd, EventArgs ea) { clipMonitor.Dispose(); }; } void Instance_EndAddBatchDownloads(object sender, EventArgs e) { this.BeginInvoke((MethodInvoker)lvwDownloads.EndUpdate); } void Instance_BeginAddBatchDownloads(object sender, EventArgs e) { this.BeginInvoke((MethodInvoker)lvwDownloads.BeginUpdate); } public void ImportFromTextFile() { using (ImportFromFileForm importFile = new ImportFromFileForm()) { if (importFile.ShowDialog() == DialogResult.OK) { AddDownloadURLs( importFile.URLs, 1, importFile.DownloadPath, 0); importFile.ApplySettings(); } } } public void NewBatchDownload() { using (CreateBatchDownloadForm batchDownload = new CreateBatchDownloadForm()) { if (batchDownload.ShowDialog() == DialogResult.OK) { AddDownloadURLs( batchDownload.URLs, batchDownload.Segments, batchDownload.DownloadPath, 0); batchDownload.ApplySettings(); } } } string lastClipboardURL; #region IClipboardDataHandler Members protected override void WndProc(ref Message m) { if (clipMonitor == null || !clipMonitor.FilterMessage(ref m)) { base.WndProc(ref m); } } public void HandleClipboardData(IDataObject data) { NewDownloadFromClipboardData(); } #endregion public void NewDownloadFromData(string url) { VideoDownloadExtension ext = (VideoDownloadExtension)App.Instance.GetExtensionByType(typeof(VideoDownloadExtension)); if (ext.GetHandlerByURL(url) != null) { ((VideoDownloadUIExtension)ext.UIExtension).ShowNewVideoDialog(url, false); } else { NewFileDownload(url, false); } } public void NewDownloadFromClipboardData() { string url = ClipboardHelper.GetURLOnClipboard(); if (string.IsNullOrEmpty(url) || lastClipboardURL == url) { return; } lastClipboardURL = url; VideoDownloadExtension ext = (VideoDownloadExtension)App.Instance.GetExtensionByType(typeof(VideoDownloadExtension)); if (ext.GetHandlerByURL(url) != null) { ((VideoDownloadUIExtension)ext.UIExtension).ShowNewVideoDialog(null, false); } else { NewFileDownload(null, false); } } public void NewVideoDownload() { VideoDownloadExtension ext = (VideoDownloadExtension)App.Instance.GetExtensionByType(typeof(VideoDownloadExtension)); ((VideoDownloadUIExtension)ext.UIExtension).ShowNewVideoDialog(null, true); } public void NewFileDownload(string url, bool modal) { if (modal) { using (NewDownloadForm newDownload = new NewDownloadForm()) { if (!String.IsNullOrEmpty(url)) { ResourceLocation[] rl = new ResourceLocation[1]; rl[0]= ResourceLocation.FromURL(url); newDownload.DownloadLocation =rl; } newDownload.ShowDialog(); } } else { NewDownloadForm newDownload = new NewDownloadForm(); if (!String.IsNullOrEmpty(url)) { ResourceLocation[] rl = new ResourceLocation[1]; rl[0] = ResourceLocation.FromURL(url); newDownload.DownloadLocation = rl; } newDownload.ShowInTaskbar = true; newDownload.MinimizeBox = true; newDownload.Show(); newDownload.Focus(); newDownload.TopMost = true; } } public void StartScheduler(bool enabled) { scheduler.Active = enabled; } public bool SchedulerStarted() { return scheduler.Active; } public void StartSelections() { DownloadsAction( delegate(Downloader d, ListViewItem item) { d.ScheduleState=DownloaderScheduleState.Waiting; DownloadManager.Instance.StartNextDownload(); //d.Start(); } ); } public void Pause() { DownloadsAction( delegate(Downloader d, ListViewItem item) { d.Pause(); } ); } public void PauseAll() { DownloadManager.Instance.PauseAll(); UpdateList(); } public void RemoveSelections() { if (MessageBox.Show("Are you sure that you want to remove selected downloads?", this.ParentForm.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { try { lvwDownloads.ItemSelectionChanged -= new ListViewItemSelectionChangedEventHandler(lvwDownloads_ItemSelectionChanged); DownloadManager.Instance.DownloadRemoved -= new EventHandler(Instance_DownloadRemoved); DownloadsAction( delegate(Downloader d, ListViewItem item) { lvwDownloads.Items.RemoveAt(item.Index); DownloadManager.Instance.RemoveDownload(d); System.IO.FileInfo fi = new FileInfo(d.LocalFile); if (fi.Exists) try { fi.Delete(); } catch { MessageBox.Show("Unable to delete: " + fi.FullName); } } ); } finally { lvwDownloads.ItemSelectionChanged += new ListViewItemSelectionChangedEventHandler(lvwDownloads_ItemSelectionChanged); lvwDownloads_ItemSelectionChanged(null, null); DownloadManager.Instance.DownloadRemoved += new EventHandler(Instance_DownloadRemoved); } } } public void SelectAll() { using (DownloadManager.Instance.LockDownloadList(false)) { lvwDownloads.BeginUpdate(); try { lvwDownloads.ItemSelectionChanged -= new ListViewItemSelectionChangedEventHandler(lvwDownloads_ItemSelectionChanged); for (int i = 0; i < lvwDownloads.Items.Count; i++) { lvwDownloads.Items[i].Selected = true; } } finally { lvwDownloads.ItemSelectionChanged += new ListViewItemSelectionChangedEventHandler(lvwDownloads_ItemSelectionChanged); lvwDownloads_ItemSelectionChanged(null, null); lvwDownloads.EndUpdate(); } } } public void RemoveCompleted() { lvwDownloads.BeginUpdate(); try { DownloadManager.Instance.ClearEnded(); UpdateList(); } finally { lvwDownloads.EndUpdate(); } } public void AddDownloadURLs( ResourceLocation arg, int segments, string path, int nrOfSubfolders) { if (arg == null) return; if (path == null) { path = PathHelper.GetWithBackslash(Core.Settings.Default.DownloadFolder); } else { path = PathHelper.GetWithBackslash(path); } try { DownloadManager.Instance.OnBeginAddBatchDownloads(); //foreach (ResourceLocation rl in args) //{ Uri uri = new Uri(arg.URL); string fileName = uri.Segments[uri.Segments.Length - 1]; fileName = HttpUtility.UrlDecode(fileName).Replace("/", "\\"); DownloadManager.Instance.Add( arg, null, path + fileName, segments, false); //} } finally { DownloadManager.Instance.OnEndAddBatchDownloads(); } } public void AddDownloadURLs( ResourceLocation[] args, int segments, string path, int nrOfSubfolders) { if (args == null) return; if (path == null) { path = PathHelper.GetWithBackslash(Core.Settings.Default.DownloadFolder); } else { path = PathHelper.GetWithBackslash(path); } try { DownloadManager.Instance.OnBeginAddBatchDownloads(); foreach (ResourceLocation rl in args) { Uri uri = new Uri(rl.URL); string fileName = uri.Segments[uri.Segments.Length - 1]; fileName = HttpUtility.UrlDecode(fileName).Replace("/", "\\"); DownloadManager.Instance.Add( rl, null, path + fileName, segments, false); } } finally { DownloadManager.Instance.OnEndAddBatchDownloads(); } } private void lvwDownloads_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { UpdateSegments(); UpdateUI(); } public void LoadSettingsView() { lvwDownloads.GridLines = Settings.Default.ViewGrid; lvwSegments.GridLines = Settings.Default.ViewGrid; splitContainer2.Panel2Collapsed = !Settings.Default.ViewTransDetails; } public void UpdateUI() { bool isSelected = lvwDownloads.SelectedItems.Count > 0; removeToolStripMenuItem.Enabled = isSelected; startToolStripMenuItem.Enabled = isSelected; pauseToolStripMenuItem.Enabled = isSelected; isSelected = lvwDownloads.SelectedItems.Count == 1; copyURLToClipboardToolStripMenuItem.Enabled = isSelected; showInExplorerToolStripMenuItem.Enabled = isSelected; openFileToolStripMenuItem.Enabled = isSelected && SelectedDownloaders[0].State == DownloaderState.Ended; OnSelectionChange(); } public event EventHandler SelectionChange; protected virtual void OnSelectionChange() { if (SelectionChange != null) { SelectionChange(this, EventArgs.Empty); } } private void copyURLToClipboardToolStripMenuItem_Click(object sender, EventArgs e) { Clipboard.SetText(SelectedDownloaders[0].ResourceLocation.URL); } private void showInExplorerToolStripMenuItem_Click(object sender, EventArgs e) { Process.Start("explorer.exe", String.Format("/select,{0}", SelectedDownloaders[0].LocalFile)); } private void openFileToolStripMenuItem_Click(object sender, EventArgs e) { try { Process.Start(SelectedDownloaders[0].LocalFile); } catch (Exception) { } } public int SelectedCount { get { return lvwDownloads.SelectedItems.Count; } } public Downloader[] SelectedDownloaders { get { if (lvwDownloads.SelectedItems.Count > 0) { Downloader[] downloaders = new Downloader[lvwDownloads.SelectedItems.Count]; for (int i = 0; i < downloaders.Length; i++) { downloaders[i] = mapItemToDownload[lvwDownloads.SelectedItems[i]] as Downloader; } return downloaders; } return null; } } void Instance_DownloadRemoved(object sender, DownloaderEventArgs e) { this.BeginInvoke((MethodInvoker)delegate() { ListViewItem item = mapDownloadToItem[e.Downloader] as ListViewItem; if (item != null) { if (item.Selected) { lastSelection = null; lvwSegments.Items.Clear(); //lvwDownloads.SelectedItems.Clear(); } mapDownloadToItem[e.Downloader] = null; mapItemToDownload[item] = null; item.Remove(); } } ); } void Instance_DownloadAdded(object sender, DownloaderEventArgs e) { if (IsHandleCreated) { this.BeginInvoke((MethodInvoker)delegate() { AddDownload(e.Downloader); }); } else { AddDownload(e.Downloader); } } private void AddDownload(Downloader d) { d.RestartingSegment += new EventHandler(download_RestartingSegment); d.SegmentStoped += new EventHandler(download_SegmentEnded); d.SegmentFailed += new EventHandler(download_SegmentFailed); d.SegmentStarted += new EventHandler(download_SegmentStarted); d.InfoReceived += new EventHandler(download_InfoReceived); d.SegmentStarting += new EventHandler(Downloader_SegmentStarting); string ext = Path.GetExtension(d.LocalFile); ListViewItem item = new ListViewItem(); item.ImageIndex = FileTypeImageList.GetImageIndexByExtention(ext); item.Text = Path.GetFileName(d.LocalFile); // size item.SubItems.Add(ByteFormatter.ToString(d.FileSize)); // completed item.SubItems.Add(ByteFormatter.ToString(d.Transfered)); // progress item.SubItems.Add(String.Format("{0:0.##}%", d.Progress)); // left item.SubItems.Add(TimeSpanFormatter.ToString(d.Left)); // rate item.SubItems.Add("0"); // added item.SubItems.Add(d.CreatedDateTime.ToShortDateString() + " " + d.CreatedDateTime.ToShortTimeString()); // state item.SubItems.Add(d.State.ToString()); // resume item.SubItems.Add(GetResumeStr(d)); // url item.SubItems.Add(d.ResourceLocation.URL); mapDownloadToItem[d] = item; mapItemToDownload[item] = d; lvwDownloads.Items.Add(item); } private static string GetResumeStr(Downloader d) { return (d.RemoteFileInfo != null && d.RemoteFileInfo.AcceptRanges ? "Yes" : "No"); } public void UpdateList() { lvwDownloads.BeginUpdate(); for (int i = 0; i < lvwDownloads.Items.Count; i++) { ListViewItem item = lvwDownloads.Items[i]; if (item == null) return; Downloader d = mapItemToDownload[item] as Downloader; if (d == null) return; DownloaderState state; if (item.Tag == null) state = DownloaderState.Working; else state = (DownloaderState)item.Tag; if (state != d.State || state == DownloaderState.Working || state == DownloaderState.WaitingForReconnect) { item.SubItems[0].Text = d.FileName; item.SubItems[1].Text = ByteFormatter.ToString(d.FileSize); item.SubItems[2].Text = ByteFormatter.ToString(d.Transfered); item.SubItems[3].Text = String.Format("{0:0.##}%", d.Progress); item.SubItems[4].Text = TimeSpanFormatter.ToString(d.Left); item.SubItems[5].Text = String.Format("{0:0.##}", d.Rate / 1024.0); if (d.LastError != null) { item.SubItems[7].Text = d.ScheduleState.ToString() + ", " + d.LastError.Message; } else { if (String.IsNullOrEmpty(d.StatusMessage)) { item.SubItems[7].Text = d.ScheduleState.ToString(); } else { item.SubItems[7].Text = d.ScheduleState.ToString() + ", " + d.StatusMessage; } } item.SubItems[8].Text = GetResumeStr(d); item.SubItems[9].Text = d.ResourceLocation.URL; item.Tag = d.State; } } UpdateSegments(); lvwDownloads.EndUpdate(); } private void UpdateSegments() { try { lvwSegments.BeginUpdate(); if (lvwDownloads.SelectedItems.Count == 1) { ListViewItem newSelection = lvwDownloads.SelectedItems[0]; Downloader d = mapItemToDownload[newSelection] as Downloader; if (lastSelection == newSelection) { if (d.Segments.Count == lvwSegments.Items.Count) { UpdateSegmentsWithoutInsert(d); } else { UpdateSegmentsInserting(d, newSelection); } } else { UpdateSegmentsInserting(d, newSelection); } } else { lastSelection = null; blockedProgressBar1.BlockList.Clear(); blockedProgressBar1.Refresh(); lvwSegments.Items.Clear(); } } finally { lvwSegments.EndUpdate(); } } private void DownloadsAction(ActionDownloader action) { if (lvwDownloads.SelectedItems.Count > 0) { try { lvwDownloads.BeginUpdate(); lvwDownloads.ItemSelectionChanged -= new ListViewItemSelectionChangedEventHandler(lvwDownloads_ItemSelectionChanged); for (int i = lvwDownloads.SelectedItems.Count - 1; i >= 0; i--) { ListViewItem item = lvwDownloads.SelectedItems[i]; action((Downloader)mapItemToDownload[item], item); } lvwDownloads.ItemSelectionChanged += new ListViewItemSelectionChangedEventHandler(lvwDownloads_ItemSelectionChanged); lvwDownloads_ItemSelectionChanged(null, null); } finally { lvwDownloads.EndUpdate(); UpdateSegments(); } } } private void UpdateSegmentsWithoutInsert(Downloader d) { for (int i = 0; i < d.Segments.Count; i++) { lvwSegments.Items[i].SubItems[0].Text = d.Segments[i].CurrentTry.ToString(); lvwSegments.Items[i].SubItems[1].Text = String.Format("{0:0.##}%", d.Segments[i].Progress); lvwSegments.Items[i].SubItems[2].Text = ByteFormatter.ToString(d.Segments[i].Transfered); lvwSegments.Items[i].SubItems[3].Text = ByteFormatter.ToString(d.Segments[i].TotalToTransfer); lvwSegments.Items[i].SubItems[4].Text = ByteFormatter.ToString(d.Segments[i].InitialStartPosition); lvwSegments.Items[i].SubItems[5].Text = ByteFormatter.ToString(d.Segments[i].EndPosition); lvwSegments.Items[i].SubItems[6].Text = String.Format("{0:0.##}", d.Segments[i].Rate / 1024.0); lvwSegments.Items[i].SubItems[7].Text = TimeSpanFormatter.ToString(d.Segments[i].Left); if (d.Segments[i].LastError != null) { lvwSegments.Items[i].SubItems[8].Text = d.Segments[i].State.ToString() + ", " + d.Segments[i].LastError.Message; } else { lvwSegments.Items[i].SubItems[8].Text = d.Segments[i].State.ToString(); } lvwSegments.Items[i].SubItems[9].Text = d.Segments[i].CurrentURL; this.blockedProgressBar1.BlockList[i].BlockSize = d.Segments[i].TotalToTransfer; this.blockedProgressBar1.BlockList[i].PercentProgress = (float)d.Segments[i].Progress; } this.blockedProgressBar1.Refresh(); } private void UpdateSegmentsInserting(Downloader d, ListViewItem newSelection) { lastSelection = newSelection; lvwSegments.Items.Clear(); List blocks = new List(); for (int i = 0; i < d.Segments.Count; i++) { ListViewItem item = new ListViewItem(); item.Text = d.Segments[i].CurrentTry.ToString(); item.SubItems.Add(String.Format("{0:0.##}%", d.Segments[i].Progress)); item.SubItems.Add(ByteFormatter.ToString(d.Segments[i].Transfered)); item.SubItems.Add(ByteFormatter.ToString(d.Segments[i].TotalToTransfer)); item.SubItems.Add(ByteFormatter.ToString(d.Segments[i].InitialStartPosition)); item.SubItems.Add(ByteFormatter.ToString(d.Segments[i].EndPosition)); item.SubItems.Add(String.Format("{0:0.##}", d.Segments[i].Rate / 1024.0)); item.SubItems.Add(TimeSpanFormatter.ToString(d.Segments[i].Left)); item.SubItems.Add(d.Segments[i].State.ToString()); item.SubItems.Add(d.Segments[i].CurrentURL); lvwSegments.Items.Add(item); blocks.Add(new Block(d.Segments[i].TotalToTransfer, (float)d.Segments[i].Progress)); } this.blockedProgressBar1.BlockList = blocks; } void download_InfoReceived(object sender, EventArgs e) { Downloader d = (Downloader)sender; Log( d, String.Format( "Connected to: {2}. File size = {0}, Resume = {1}", ByteFormatter.ToString(d.FileSize), d.RemoteFileInfo.AcceptRanges, d.ResourceLocation.URL), LogMode.Information); } void Downloader_SegmentStarting(object sender, SegmentEventArgs e) { Log( e.Downloader, String.Format( "Starting segment for {3}, start position = {0}, end position {1}, segment size = {2}", ByteFormatter.ToString(e.Segment.InitialStartPosition), ByteFormatter.ToString(e.Segment.EndPosition), ByteFormatter.ToString(e.Segment.TotalToTransfer), e.Downloader.ResourceLocation.URL), LogMode.Information); } void download_SegmentStarted(object sender, SegmentEventArgs e) { Log( e.Downloader, String.Format( "Started segment for {3}, start position = {0}, end position {1}, segment size = {2}", ByteFormatter.ToString(e.Segment.InitialStartPosition), ByteFormatter.ToString(e.Segment.EndPosition), ByteFormatter.ToString(e.Segment.TotalToTransfer), e.Downloader.ResourceLocation.URL), LogMode.Information); } void download_SegmentFailed(object sender, SegmentEventArgs e) { Log( e.Downloader, String.Format( "Download segment ({0}) failed for {2}, reason = {1}", e.Segment.Index, e.Segment.LastError.Message, e.Downloader.ResourceLocation.URL), LogMode.Error); } void download_SegmentEnded(object sender, SegmentEventArgs e) { Log( e.Downloader, String.Format( "Download segment ({0}) ended for {1}", e.Segment.Index, e.Downloader.ResourceLocation.URL), LogMode.Information); } void download_RestartingSegment(object sender, SegmentEventArgs e) { Log( e.Downloader, String.Format( "Download segment ({0}) is restarting for {1}", e.Segment.Index, e.Downloader.ResourceLocation.URL), LogMode.Information); } void Instance_DownloadEnded(object sender, DownloaderEventArgs e) { Log( e.Downloader, String.Format( "Download ended {0}", e.Downloader.ResourceLocation.URL), LogMode.Information); } enum LogMode { Error, Information } void Log(Downloader downloader, string msg, LogMode m) { try { this.BeginInvoke( (MethodInvoker) delegate() { int len = richLog.Text.Length; if (len > 0) { richLog.SelectionStart = len; } if (m == LogMode.Error) { richLog.SelectionColor = Color.Red; } else { richLog.SelectionColor = Color.Blue; } richLog.AppendText(DateTime.Now + " - " + msg + Environment.NewLine); } ); } catch { } } private void clearLogToolStripMenuItem_Click(object sender, EventArgs e) { richLog.Clear(); } private void newDownloadToolStripMenuItem_Click(object sender, EventArgs e) { NewFileDownload(null, true); } private void startToolStripMenuItem_Click(object sender, EventArgs e) { StartSelections(); } private void pauseToolStripMenuItem_Click(object sender, EventArgs e) { Pause(); } private void removeToolStripMenuItem_Click(object sender, EventArgs e) { RemoveSelections(); } private void SwapElements(int idx) { ListViewItem it1 = lvwDownloads.Items[idx]; ListViewItem it2 = lvwDownloads.Items[idx - 1]; lvwDownloads.Items.RemoveAt(idx); lvwDownloads.Items.RemoveAt(idx - 1); lvwDownloads.Items.Insert(idx - 1, it1); lvwDownloads.Items.Insert(idx, it2); DownloadManager.Instance.SwapDownloads(idx, true); } public void MoveSelectionsDown() { int selCount = lvwDownloads.SelectedItems.Count; if (selCount > 0) { try { lvwDownloads.BeginUpdate(); ListViewItem lvi = null; using (DownloadManager.Instance.LockDownloadList(true)) { for (int i = selCount - 1; i >= 0; i--) { lvi = lvwDownloads.SelectedItems[i]; if (lvi.Index < lvwDownloads.Items.Count - 1 && !lvwDownloads.Items[lvi.Index + 1].Selected) { SwapElements(lvi.Index + 1); } } } lvwDownloads.SelectedItems[selCount - 1].EnsureVisible(); } finally { lvwDownloads.EndUpdate(); } } } public void MoveSelectionsUp() { int selCount = lvwDownloads.SelectedItems.Count; if (selCount > 0) { try { lvwDownloads.BeginUpdate(); ListViewItem lvi = null; using (DownloadManager.Instance.LockDownloadList(true)) { for (int i = 0; i < selCount; i++) { lvi = lvwDownloads.SelectedItems[i]; if (lvi.Index > 0 && !lvwDownloads.Items[lvi.Index - 1].Selected) { SwapElements(lvi.Index); } } } lvwDownloads.SelectedItems[0].EnsureVisible(); } finally { lvwDownloads.EndUpdate(); } } } public bool ClipboardMonitorEnabled { set { if (clipMonitor != null) { clipMonitor.Enabled = value; } } get { if (clipMonitor != null) { return clipMonitor.Enabled; } return false; } } private void popUpContextMenu_Opening(object sender, CancelEventArgs e) { UpdateUI(); } private void lvwDownloads_DoubleClick(object sender, EventArgs e) { UpdateUI(); openFileToolStripMenuItem_Click(sender, e); } } }