//--------------------------------------------------------------------- public bool MoveNext() { if (atEnd) return false; if (moveNextNotCalled) { InitializeCurrentSite(); moveNextNotCalled = false; return true; } Location nextLocation = RowMajor.Next(currentSite.Location, landscape.Columns); if (nextLocation.Row > landscape.Rows) { atEnd = true; return false; } if (currentSite.IsActive) { // current site is the active site etor's Current property // so advance etor to next active site. if (activeSiteEtor.MoveNext()) { // There is one or more active sites remaining. nextActiveSite = activeSiteEtor.Current; if (nextLocation == nextActiveSite.Location) { // Leave current site pointing to active site etor } else { // Next site is inactive. currentSite = inactiveSite; inactiveSite.SetLocation(nextLocation); } } else { // No more active sites left to visit, so next site is // inactive. nextActiveSite = null; currentSite = inactiveSite; inactiveSite.SetLocation(nextLocation); } } else { // Current site is inactive if (nextActiveSite != null && nextLocation == nextActiveSite.Location) currentSite = nextActiveSite; else { // Leave current site pointing to the local inactive site // instance, and just change its location. inactiveSite.SetLocation(nextLocation); } } return true; }
//--------------------------------------------------------------------- private void InitializeCurrentSite() { if (activeSiteEtor.MoveNext()) { nextActiveSite = activeSiteEtor.Current; if (nextActiveSite.Location == new Location(1,1)) currentSite = nextActiveSite; else currentSite = inactiveSite; } else { // No active sites currentSite = inactiveSite; } }