private static void UpdateItemFn(object state) { LviUpdInfo lui = (state as LviUpdInfo); if (lui == null) { Debug.Assert(false); return; } try // Avoid cross-thread exceptions { bool bWork; lock (lui.ValidIDsSyncObject) { if (!lui.ValidIDs.TryGetValue(lui.UpdateID, out bWork)) { Debug.Assert(false); return; } } if (bWork) { string strNew = lui.Function(lui.Text, lui.ListItem); if (strNew == null) { Debug.Assert(false); return; } if (strNew == lui.Text) { return; } // if(lui.ListView.InvokeRequired) lui.ListView.Invoke(new SetItemTextDelegate( SetItemText), new object[] { strNew, lui }); // else SetItemText(strNew, lui); } } catch (Exception) { Debug.Assert(false); } finally { try // Avoid cross-thread exceptions { lock (lui.ValidIDsSyncObject) { if (!lui.ValidIDs.Remove(lui.UpdateID)) { Debug.Assert(false); } } } catch (Exception) { Debug.Assert(false); } } }
public void Queue(string strText, PwListItem li, int iIndexHint, int iSubItem, PwTextUpdateDelegate f) { if (strText == null) { Debug.Assert(false); return; } if (li == null) { Debug.Assert(false); return; } if (iSubItem < 0) { Debug.Assert(false); return; } if (f == null) { Debug.Assert(false); return; } LviUpdInfo state = new LviUpdInfo(); state.ListView = m_lv; state.UpdateID = unchecked ((li.ListViewItemID << 6) + iSubItem); state.Text = strText; state.ListItem = li; state.IndexHint = ((iIndexHint >= 0) ? iIndexHint : 0); state.SubItem = iSubItem; state.Function = f; state.ListEditSyncObject = m_objListEditSync; state.ValidIDsSyncObject = m_objValidIDsSync; state.ValidIDs = m_dValidIDs; lock (m_objValidIDsSync) { Debug.Assert(!m_dValidIDs.ContainsKey(state.UpdateID)); m_dValidIDs[state.UpdateID] = true; } try { if (!ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateItemFn), state)) { throw new InvalidOperationException(); } } catch (Exception) { Debug.Assert(false); lock (m_objValidIDsSync) { m_dValidIDs.Remove(state.UpdateID); } } }
private static void SetItemText(string strText, LviUpdInfo lui) { try // Avoid cross-thread exceptions { long lTargetID = lui.ListItem.ListViewItemID; int iIndexHint = lui.IndexHint; lock (lui.ListEditSyncObject) { ListView.ListViewItemCollection lvic = lui.ListView.Items; int nCount = lvic.Count; // for(int i = 0; i < nCount; ++i) for (int i = nCount; i > 0; --i) { int j = ((iIndexHint + i) % nCount); ListViewItem lvi = lvic[j]; PwListItem li = (lvi.Tag as PwListItem); if (li == null) { Debug.Assert(false); continue; } if (li.ListViewItemID != lTargetID) { continue; } lvi.SubItems[lui.SubItem].Text = strText; break; } } } catch (Exception) { Debug.Assert(false); } }
private static void SetItemText(string strText, LviUpdInfo lui) { try // Avoid cross-thread exceptions { long lTargetID = lui.ListItem.ListViewItemID; int iIndexHint = lui.IndexHint; lock(lui.ListEditSyncObject) { ListView.ListViewItemCollection lvic = lui.ListView.Items; int nCount = lvic.Count; // for(int i = 0; i < nCount; ++i) for(int i = nCount; i > 0; --i) { int j = ((iIndexHint + i) % nCount); ListViewItem lvi = lvic[j]; PwListItem li = (lvi.Tag as PwListItem); if(li == null) { Debug.Assert(false); continue; } if(li.ListViewItemID != lTargetID) continue; lvi.SubItems[lui.SubItem].Text = strText; break; } } } catch(Exception) { Debug.Assert(false); } }
public void Queue(string strText, PwListItem li, int iIndexHint, int iSubItem, PwTextUpdateDelegate f) { if(strText == null) { Debug.Assert(false); return; } if(li == null) { Debug.Assert(false); return; } if(iSubItem < 0) { Debug.Assert(false); return; } if(f == null) { Debug.Assert(false); return; } LviUpdInfo state = new LviUpdInfo(); state.ListView = m_lv; state.UpdateID = unchecked((li.ListViewItemID << 6) + iSubItem); state.Text = strText; state.ListItem = li; state.IndexHint = ((iIndexHint >= 0) ? iIndexHint : 0); state.SubItem = iSubItem; state.Function = f; state.ListEditSyncObject = m_objListEditSync; state.ValidIDsSyncObject = m_objValidIDsSync; state.ValidIDs = m_dValidIDs; lock(m_objValidIDsSync) { Debug.Assert(!m_dValidIDs.ContainsKey(state.UpdateID)); m_dValidIDs[state.UpdateID] = true; } try { if(!ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateItemFn), state)) throw new InvalidOperationException(); } catch(Exception) { Debug.Assert(false); lock(m_objValidIDsSync) { m_dValidIDs.Remove(state.UpdateID); } } }