public void UpdateList() { lock (this) { //SuspendLayout(); List <ConnectionInfo> serversList; lock (Engine.Instance.Connections) { serversList = Engine.Instance.GetConnections(ShowAll); } Dictionary <string, ConnectionInfo> servers = new Dictionary <string, ConnectionInfo>(); foreach (ConnectionInfo infoServer in serversList) { servers[infoServer.Code] = infoServer; } foreach (ConnectionInfo infoServer in servers.Values) { if (ItemsServers.ContainsKey(infoServer.Code) == false) { Controls.ListViewItemServer listItemServer = new Controls.ListViewItemServer(); listItemServer.Info = infoServer; listItemServer.Update(); ItemsServers.Add(infoServer.Code, listItemServer); Items.Add(listItemServer); // TOFIX: Mono impressive slow. 'Show all' took around 5 seconds to add 150 items. } else { Controls.ListViewItemServer listItemServer = ItemsServers[infoServer.Code] as ListViewItemServer; listItemServer.Update(); } } List <ListViewItemServer> itemsToRemove = new List <ListViewItemServer>(); foreach (ListViewItemServer viewItem in ItemsServers.Values) { if (servers.ContainsKey(viewItem.Info.Code) == false) { itemsToRemove.Add(viewItem); } } if (itemsToRemove.Count > 0) { if (Platform.IsWindows()) { foreach (ListViewItemServer viewItem in itemsToRemove) { Items.Remove(viewItem); ItemsServers.Remove(viewItem.Info.Code); } } else { // Mono workaround to avoid a crash, like this: http://sourceforge.net/p/keepass/bugs/1314/ // Reproduce the crash by whitelist some server and switch "Show all" continuosly. List <ListViewItemServer> items = new List <ListViewItemServer>(); foreach (ListViewItemServer itemCurrent in Items) { if (itemsToRemove.Contains(itemCurrent) == false) { items.Add(itemCurrent); } } Items.Clear(); ItemsServers.Clear(); foreach (ListViewItemServer itemCurrent in items) { ItemsServers.Add(itemCurrent.Info.Code, itemCurrent); Items.Add(itemCurrent); } } } Sort(); //ResumeLayout(); } }
public void UpdateList() { lock (this) { //SuspendLayout(); List<ServerInfo> servers; lock (Engine.Instance.Servers) { servers = Engine.Instance.GetServers(ShowAll); } foreach (ServerInfo infoServer in servers) { if (ItemsServers.ContainsKey(infoServer.Name) == false) { Controls.ListViewItemServer listItemServer = new Controls.ListViewItemServer(); listItemServer.Name = infoServer.Name; listItemServer.Info = infoServer; listItemServer.Update(); ItemsServers.Add(infoServer.Name, listItemServer); Items.Add(listItemServer); } else { Controls.ListViewItemServer listItemServer = ItemsServers[infoServer.Name] as ListViewItemServer; listItemServer.Update(); } } List<ListViewItemServer> itemsToRemove = new List<ListViewItemServer>(); foreach (ListViewItemServer viewItem in ItemsServers.Values) { if (servers.Contains(viewItem.Info) == false) { itemsToRemove.Add(viewItem); } } if (Platform.IsWindows()) { foreach (ListViewItemServer viewItem in itemsToRemove) { Items.Remove(viewItem); ItemsServers.Remove(viewItem.Info.Name); } } else { // Mono workaround to avoid a crash, like this: http://sourceforge.net/p/keepass/bugs/1314/ List<ListViewItemServer> items = new List<ListViewItemServer>(); foreach (ListViewItemServer itemCurrent in Items) { if (itemsToRemove.Contains(itemCurrent) == false) items.Add(itemCurrent); } Items.Clear(); ItemsServers.Clear(); foreach (ListViewItemServer itemCurrent in items) { ItemsServers.Add(itemCurrent.Info.Name, itemCurrent); Items.Add(itemCurrent); } } Sort(); //ResumeLayout(); } }
public void UpdateList() { lock (this) { //SuspendLayout(); List <ServerInfo> servers; lock (Engine.Instance.Servers) { servers = Engine.Instance.GetServers(ShowAll); } foreach (ServerInfo infoServer in servers) { if (ItemsServers.ContainsKey(infoServer.Name) == false) { Controls.ListViewItemServer listItemServer = new Controls.ListViewItemServer(); listItemServer.Name = infoServer.Name; listItemServer.Info = infoServer; listItemServer.Update(); ItemsServers.Add(infoServer.Name, listItemServer); Items.Add(listItemServer); } else { Controls.ListViewItemServer listItemServer = ItemsServers[infoServer.Name] as ListViewItemServer; listItemServer.Update(); } } List <ListViewItemServer> itemsToRemove = new List <ListViewItemServer>(); foreach (ListViewItemServer viewItem in ItemsServers.Values) { if (servers.Contains(viewItem.Info) == false) { itemsToRemove.Add(viewItem); } } if (Platform.IsWindows()) { foreach (ListViewItemServer viewItem in itemsToRemove) { Items.Remove(viewItem); ItemsServers.Remove(viewItem.Info.Name); } } else { // Mono workaround to avoid a crash, like this: http://sourceforge.net/p/keepass/bugs/1314/ List <ListViewItemServer> items = new List <ListViewItemServer>(); foreach (ListViewItemServer itemCurrent in Items) { if (itemsToRemove.Contains(itemCurrent) == false) { items.Add(itemCurrent); } } Items.Clear(); ItemsServers.Clear(); foreach (ListViewItemServer itemCurrent in items) { ItemsServers.Add(itemCurrent.Info.Name, itemCurrent); Items.Add(itemCurrent); } } Sort(); //ResumeLayout(); } }
public void UpdateList() { lock (this) { //SuspendLayout(); List<ServerInfo> serversList; lock (Engine.Instance.Servers) { serversList = Engine.Instance.GetServers(ShowAll); } Dictionary<string, ServerInfo> servers = new Dictionary<string, ServerInfo>(); foreach (ServerInfo infoServer in serversList) { servers[infoServer.Code] = infoServer; } foreach (ServerInfo infoServer in servers.Values) { if (ItemsServers.ContainsKey(infoServer.Code) == false) { Controls.ListViewItemServer listItemServer = new Controls.ListViewItemServer(); listItemServer.Info = infoServer; listItemServer.Update(); ItemsServers.Add(infoServer.Code, listItemServer); Items.Add(listItemServer); // TOFIX: Mono impressive slow. 'Show all' took around 5 seconds to add 150 items. } else { Controls.ListViewItemServer listItemServer = ItemsServers[infoServer.Code] as ListViewItemServer; listItemServer.Update(); } } List<ListViewItemServer> itemsToRemove = new List<ListViewItemServer>(); foreach (ListViewItemServer viewItem in ItemsServers.Values) { if (servers.ContainsKey(viewItem.Info.Code) == false) { itemsToRemove.Add(viewItem); } } if (itemsToRemove.Count > 0) { if (Platform.IsWindows()) { foreach (ListViewItemServer viewItem in itemsToRemove) { Items.Remove(viewItem); ItemsServers.Remove(viewItem.Info.Code); } } else { // Mono workaround to avoid a crash, like this: http://sourceforge.net/p/keepass/bugs/1314/ // Reproduce the crash by whitelist some server and switch "Show all" continuosly. List<ListViewItemServer> items = new List<ListViewItemServer>(); foreach (ListViewItemServer itemCurrent in Items) { if (itemsToRemove.Contains(itemCurrent) == false) items.Add(itemCurrent); } Items.Clear(); ItemsServers.Clear(); foreach (ListViewItemServer itemCurrent in items) { ItemsServers.Add(itemCurrent.Info.Code, itemCurrent); Items.Add(itemCurrent); } } } Sort(); //ResumeLayout(); } }