public void CompareNatural() { Assert.AreEqual(0, StringUtility.CompareNatural(null, null)); Assert.AreEqual(1, StringUtility.CompareNatural("", null)); Assert.AreEqual(-1, StringUtility.CompareNatural(null, "")); Assert.AreEqual(0, StringUtility.CompareNatural("", "")); Assert.AreEqual(1, StringUtility.CompareNatural("b", "")); Assert.AreEqual(-1, StringUtility.CompareNatural("", "c")); Assert.AreEqual(0, StringUtility.CompareNatural("b", "b")); Assert.AreEqual(1, StringUtility.CompareNatural("b", "a")); Assert.AreEqual(-1, StringUtility.CompareNatural("b", "1")); Assert.AreEqual(-1, StringUtility.CompareNatural("b", "c")); Assert.AreEqual(0, StringUtility.CompareNatural("2", "02")); Assert.AreEqual(1, StringUtility.CompareNatural("2", "01")); Assert.AreEqual(-1, StringUtility.CompareNatural("2", "03")); Assert.AreEqual(0, StringUtility.CompareNatural("b-2", "b-02")); Assert.AreEqual(1, StringUtility.CompareNatural("b-2-xa", "b-02-x")); Assert.AreEqual(1, StringUtility.CompareNatural("b-2", "b-01")); Assert.AreEqual(1, StringUtility.CompareNatural("b-2", "b-01-x")); Assert.AreEqual(-1, StringUtility.CompareNatural("b-2", "b-03")); Assert.AreEqual(0, StringUtility.CompareNatural("2-b", "02-b")); Assert.AreEqual(1, StringUtility.CompareNatural("02-b-2", "2-b-1")); Assert.AreEqual(1, StringUtility.CompareNatural("2-ba", "02-b")); Assert.AreEqual(1, StringUtility.CompareNatural("02-b", "02-ax")); Assert.AreEqual(-1, StringUtility.CompareNatural("2-b", "2-c")); }
/// <summary> /// Updates the "Entity" <see cref="ListView"/> with the current "Category" and "Filter" /// choices.</summary> /// <param name="select"> /// <c>true</c> to select the previously selected item, if any, or else the first item in /// the "Entity" <see cref="ListView"/>; <c>false</c> to not select any item.</param> private void UpdateEntities(bool select) { // remember selected item, if any EntityListItem selectedItem = null; if (select) { int index = EntityList.SelectedIndex; if (index >= 0) { selectedItem = (EntityListItem)EntityList.Items[index]; } } // clear Entity & Property list views EntityList.ItemsSource = null; PropertyList.ShowEntity(null); // get current general filter settings bool?showSite = SiteToggle.IsChecked; bool?showPlaced = PlacedToggle.IsChecked; // get category-specific filter settings EntityCategory category = CurrentCategory; bool? showCategory = null; switch (category) { case EntityCategory.Unit: showCategory = MobileToggle.IsChecked; break; case EntityCategory.Terrain: showCategory = CaptureToggle.IsChecked; break; } // get currently selected site PointI selected = this._mapView.SelectedSite; // get all owned faction entities for current category var entities = this._faction.GetEntities(category); var list = new List <EntityListItem>(entities.Count); foreach (Entity entity in entities) { // Site filter: skip entities on other sites if (showSite == true && (entity.Site == null || entity.Site.Location != selected)) { continue; } // Placed filter: skip placed or unplaced entities if ((showPlaced == true && !entity.IsPlaced) || (showPlaced == false && entity.IsPlaced)) { continue; } // get value that matches category-specific filter bool showEntity = false; switch (category) { case EntityCategory.Unit: showEntity = ((Unit)entity).IsMobile; break; case EntityCategory.Terrain: showEntity = ((Terrain)entity).CanCapture; break; } // skip entities that don't match category-specific filter if ((showCategory == true && !showEntity) || (showCategory == false && showEntity)) { continue; } // show entity name with current site string site = (entity.Site == null ? "—" : entity.Site.ToString()); list.Add(new EntityListItem(entity, site)); } // use ItemsSource for sorting & virtualization list.Sort((x, y) => StringUtility.CompareNatural(x.Item1.ToString(), y.Item1.ToString())); EntityList.ItemsSource = list; // select remembered or first item, if any if (select && EntityList.Items.Count > 0) { if (selectedItem != null) { EntityList.SelectAndShow(selectedItem); } if (EntityList.SelectedIndex < 0) { EntityList.SelectedIndex = 0; } } }