protected int GetDefaultWs(InterlinearMapping mapping)
        {
            int ws;

            switch (mapping.Destination)
            {
            default:
                ws = m_cache.DefaultAnalWs;
                break;

            case InterlinDestination.Ignored:
                ws = 0;
                break;

            case InterlinDestination.Baseline:
            case InterlinDestination.Wordform:
                ws = m_cache.DefaultVernWs;
                break;
            }
            return(ws);
        }
		protected int GetDefaultWs(InterlinearMapping mapping)
		{
			int ws;
			switch (mapping.Destination)
			{
				default:
					ws = m_cache.DefaultAnalWs;
					break;
				case InterlinDestination.Ignored:
					ws = 0;
					break;
				case InterlinDestination.Baseline:
				case InterlinDestination.Wordform:
					ws = m_cache.DefaultVernWs;
					break;
			}
			return ws;
		}
		protected override void OnNextButton()
		{
			if (CurrentStepNumber == 0)
			{
				// Populate m_mappingsList based on the selected files.
				var sfmcounts = new Dictionary<string, int>();
				var sfmOrder = new Dictionary<int, string>(); // key is 100000*fileNum + orderInFile, value is a marker
				int fileNum = 0;
				foreach (var pathName in InputFiles)
				{
					var reader = new SfmFileReaderEx(pathName);
					followedBy = reader.GetFollowedByInfo();
					foreach (string marker in reader.SfmInfo)
					{
						int oldVal;
						if (!sfmcounts.TryGetValue(marker, out oldVal))
						{
							// first time we've seen it: this file determines order;
							sfmOrder[fileNum * 100000 + reader.GetSFMOrder(marker)] = marker;
						}
						sfmcounts[marker] = oldVal + reader.GetSFMCount(marker);
					}
					fileNum++;
				}
				// Read the map file (unless we've been to this pane before...then use the saved settings), integrate with the sfmcount info.
				var savedMappings = new Dictionary<string, InterlinearMapping>();
				m_oldMappings = m_firstTimeInMappingsPane ? LoadSettings() : new List<InterlinearMapping>((m_mappings));
				m_firstTimeInMappingsPane = false;
				foreach (var mapping in m_oldMappings)
					savedMappings[mapping.Marker] = mapping;
				m_mappings.Clear();
				var keys = new List<int>(sfmOrder.Keys);
				keys.Sort();
				foreach (var key in keys)
				{
					var marker = sfmOrder[key];
					InterlinearMapping mapping;
					if (savedMappings.TryGetValue(marker, out mapping))
					{
						mapping = new InterlinearMapping(mapping);
						if (string.IsNullOrEmpty(mapping.WritingSystem))
						{
							var ws = GetDefaultWs(mapping);
							if (ws != 0)
								mapping.WritingSystem = m_cache.WritingSystemFactory.GetStrFromWs(ws);
						}
						else if (mapping.WritingSystem == "{vern}")
							mapping.WritingSystem = m_cache.WritingSystemFactory.GetStrFromWs(m_cache.DefaultVernWs);
					}
					else
						mapping = new InterlinearMapping() {Marker = marker};
					mapping.Count = sfmcounts[marker].ToString();
					m_mappings.Add(mapping);
				}
				m_mappingsList.SuspendLayout();
				m_mappingsList.Items.Clear();
				foreach (var mapping in m_mappings)
				{
					var item = new ListViewItem("\\" + mapping.Marker);
					item.SubItems.Add(mapping.Count);
					item.SubItems.Add(GetDestinationName(mapping.Destination));
					item.SubItems.Add(mapping.WritingSystem != null ? GetWritingSystemName(mapping.WritingSystem) : "");
					item.SubItems.Add(mapping.Converter ?? "");
					m_mappingsList.Items.Add(item);
				}
				if (m_mappingsList.Items.Count > 0)
					m_mappingsList.SelectedIndices.Add(0);
				m_mappingsList.ResumeLayout();
			}
			else if(CurrentStepNumber == 1)
			{
				ICollection<IWritingSystem> currentVernacWSs = m_cache.LanguageProject.VernacularWritingSystems;
				ICollection<IWritingSystem> currentAnalysWSs = m_cache.LanguageProject.AnalysisWritingSystems;
				var vernToAdd = new ArrayList();
				var analysToAdd = new ArrayList();
				int textCount = CalculateTextCount(m_mappings, followedBy);
				foreach(var mapping in m_mappings)
				{
					if (mapping.Destination == InterlinDestination.Ignored)
						continue; // may well have no WS, in any case, we don't care whether it's in our list.
					bool creationCancelled = false;
					var ws = (IWritingSystem)m_cache.WritingSystemFactory.get_Engine(mapping.WritingSystem);
					if (mapping.Destination == InterlinDestination.Baseline || mapping.Destination == InterlinDestination.Wordform)
					{
						if(!currentVernacWSs.Contains(ws) && !vernToAdd.Contains(ws))
						{
							//Show creation dialog for Vernacular
							var result = MessageBox.Show(this,
														 String.Format(ITextStrings.ksImportSFMInterlinNewVernac, ws),
														 String.Format(ITextStrings.ksImportSFMInterlinNewWSTitle, ws), MessageBoxButtons.YesNo);
							if(result == DialogResult.Yes)
							{
								vernToAdd.Add(ws);
							}
							else //if they bail out we won't add any writing systems, they might change them all
							{
								return;
							}
						}
					}
					else
					{
						if(!currentAnalysWSs.Contains(ws) && !analysToAdd.Contains(ws))
						{
							var result = MessageBox.Show(this,
														 String.Format(ITextStrings.ksImportSFMInterlinNewAnalysis, ws),
														 String.Format(ITextStrings.ksImportSFMInterlinNewWSTitle, ws), MessageBoxButtons.YesNo);
							if (result == DialogResult.Yes)
							{
								analysToAdd.Add(ws);
							}
							else  //if they bail out we won't add any writing systems, they might change them all
							{
								return;
							}
						}
					}
				}
				NonUndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW(m_cache.ActionHandlerAccessor,
					() => //Add all the collected new languages into the project in their proper section.
					{
						foreach (IWritingSystem analysLang in analysToAdd)
						{
							m_cache.LanguageProject.AddToCurrentAnalysisWritingSystems(analysLang);
						}
						foreach (IWritingSystem vernLang in vernToAdd)
						{
							m_cache.LanguageProject.AddToCurrentVernacularWritingSystems(vernLang);
						}
					});
				if(textCount > 1)
				{
					numberOfTextsLabel.Text = String.Format(ITextStrings.ksImportSFMInterlinTextCount, textCount);
				}
				else
				{
					numberOfTextsLabel.Text = String.Empty;
				}
			}
			base.OnNextButton();
		}
 protected override void OnNextButton()
 {
     if (CurrentStepNumber == 0)
     {
         // Populate m_mappingsList based on the selected files.
         var sfmcounts = new Dictionary <string, int>();
         var sfmOrder  = new Dictionary <int, string>();               // key is 100000*fileNum + orderInFile, value is a marker
         int fileNum   = 0;
         foreach (var pathName in InputFiles)
         {
             var reader = new SfmFileReaderEx(pathName);
             followedBy = reader.GetFollowedByInfo();
             foreach (string marker in reader.SfmInfo)
             {
                 int oldVal;
                 if (!sfmcounts.TryGetValue(marker, out oldVal))
                 {
                     // first time we've seen it: this file determines order;
                     sfmOrder[fileNum * 100000 + reader.GetSFMOrder(marker)] = marker;
                 }
                 sfmcounts[marker] = oldVal + reader.GetSFMCount(marker);
             }
             fileNum++;
         }
         // Read the map file (unless we've been to this pane before...then use the saved settings), integrate with the sfmcount info.
         var savedMappings = new Dictionary <string, InterlinearMapping>();
         m_oldMappings             = m_firstTimeInMappingsPane ? LoadSettings() : new List <InterlinearMapping>((m_mappings));
         m_firstTimeInMappingsPane = false;
         foreach (var mapping in m_oldMappings)
         {
             savedMappings[mapping.Marker] = mapping;
         }
         m_mappings.Clear();
         var keys = new List <int>(sfmOrder.Keys);
         keys.Sort();
         foreach (var key in keys)
         {
             var marker = sfmOrder[key];
             InterlinearMapping mapping;
             if (savedMappings.TryGetValue(marker, out mapping))
             {
                 mapping = new InterlinearMapping(mapping);
                 if (string.IsNullOrEmpty(mapping.WritingSystem))
                 {
                     var ws = GetDefaultWs(mapping);
                     if (ws != 0)
                     {
                         mapping.WritingSystem = m_cache.WritingSystemFactory.GetStrFromWs(ws);
                     }
                 }
                 else if (mapping.WritingSystem == "{vern}")
                 {
                     mapping.WritingSystem = m_cache.WritingSystemFactory.GetStrFromWs(m_cache.DefaultVernWs);
                 }
             }
             else
             {
                 mapping = new InterlinearMapping()
                 {
                     Marker = marker
                 }
             };
             mapping.Count = sfmcounts[marker].ToString();
             m_mappings.Add(mapping);
         }
         m_mappingsList.SuspendLayout();
         m_mappingsList.Items.Clear();
         foreach (var mapping in m_mappings)
         {
             var item = new ListViewItem("\\" + mapping.Marker);
             item.SubItems.Add(mapping.Count);
             item.SubItems.Add(GetDestinationName(mapping.Destination));
             item.SubItems.Add(mapping.WritingSystem != null ? GetWritingSystemName(mapping.WritingSystem) : "");
             item.SubItems.Add(mapping.Converter ?? "");
             m_mappingsList.Items.Add(item);
         }
         if (m_mappingsList.Items.Count > 0)
         {
             m_mappingsList.SelectedIndices.Add(0);
         }
         m_mappingsList.ResumeLayout();
     }
     else if (CurrentStepNumber == 1)
     {
         ICollection <IWritingSystem> currentVernacWSs = m_cache.LanguageProject.VernacularWritingSystems;
         ICollection <IWritingSystem> currentAnalysWSs = m_cache.LanguageProject.AnalysisWritingSystems;
         var vernToAdd   = new ArrayList();
         var analysToAdd = new ArrayList();
         int textCount   = CalculateTextCount(m_mappings, followedBy);
         foreach (var mapping in m_mappings)
         {
             if (mapping.Destination == InterlinDestination.Ignored)
             {
                 continue;                         // may well have no WS, in any case, we don't care whether it's in our list.
             }
             bool creationCancelled = false;
             var  ws = (IWritingSystem)m_cache.WritingSystemFactory.get_Engine(mapping.WritingSystem);
             if (mapping.Destination == InterlinDestination.Baseline || mapping.Destination == InterlinDestination.Wordform)
             {
                 if (!currentVernacWSs.Contains(ws) && !vernToAdd.Contains(ws))
                 {
                     //Show creation dialog for Vernacular
                     var result = MessageBox.Show(this,
                                                  String.Format(ITextStrings.ksImportSFMInterlinNewVernac, ws),
                                                  String.Format(ITextStrings.ksImportSFMInterlinNewWSTitle, ws), MessageBoxButtons.YesNo);
                     if (result == DialogResult.Yes)
                     {
                         vernToAdd.Add(ws);
                     }
                     else                             //if they bail out we won't add any writing systems, they might change them all
                     {
                         return;
                     }
                 }
             }
             else
             {
                 if (!currentAnalysWSs.Contains(ws) && !analysToAdd.Contains(ws))
                 {
                     var result = MessageBox.Show(this,
                                                  String.Format(ITextStrings.ksImportSFMInterlinNewAnalysis, ws),
                                                  String.Format(ITextStrings.ksImportSFMInterlinNewWSTitle, ws), MessageBoxButtons.YesNo);
                     if (result == DialogResult.Yes)
                     {
                         analysToAdd.Add(ws);
                     }
                     else                              //if they bail out we won't add any writing systems, they might change them all
                     {
                         return;
                     }
                 }
             }
         }
         NonUndoableUnitOfWorkHelper.DoUsingNewOrCurrentUOW(m_cache.ActionHandlerAccessor,
                                                            () => //Add all the collected new languages into the project in their proper section.
         {
             foreach (IWritingSystem analysLang in analysToAdd)
             {
                 m_cache.LanguageProject.AddToCurrentAnalysisWritingSystems(analysLang);
             }
             foreach (IWritingSystem vernLang in vernToAdd)
             {
                 m_cache.LanguageProject.AddToCurrentVernacularWritingSystems(vernLang);
             }
         });
         if (textCount > 1)
         {
             numberOfTextsLabel.Text = String.Format(ITextStrings.ksImportSFMInterlinTextCount, textCount);
         }
         else
         {
             numberOfTextsLabel.Text = String.Empty;
         }
     }
     base.OnNextButton();
 }