Exemplo n.º 1
0
        public RequestHandler(List <string> providedXMLs, ParseRequest requestedMetaData, OSMGeometryType requestedType,
                              Action <string, double> reportProgress, string workerId)
        {
            this.XmlPaths          = providedXMLs;
            this.RequestedMetaData = requestedMetaData;

            // Setup data holders
            this.FoundItemIds = new List <string>();
            this.FoundData    = new Dictionary <OSMTag, List <FoundItem> >();
            foreach (OSMTag metaData in requestedMetaData.Requests)
            {
                this.FoundData[metaData] = new List <FoundItem>();
            }

            // Setup reporting infrastructure
            this.WorkerId       = workerId;
            this.ReportProgress = reportProgress;
            if (providedXMLs[0].Length < 1000) // Don't calculate line lengths when working with tests (e.g. passed by contents not path)
            {
                this.LinesPerFile = ProgressReporting.GetLineLengthsForFiles(providedXMLs, requestedType);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Initilize the gui control.
        /// </summary>
        /// <param name="cache"></param>
        /// <param name="mediator"></param>
        /// <param name="configurationNode">NB: In this case it is the main 'window' element node,
        /// se we have to drill down to find the control definition node(s).</param>
        /// <param name="sourceObject"></param>
        public void Init(Mediator mediator, XmlNode configurationNode, ICmObject sourceObject)
        {
            CheckDisposed();

            Debug.Assert(mediator != null);
            Debug.Assert(configurationNode != null);
            Debug.Assert(sourceObject != null && (sourceObject is IWfiWordform || sourceObject is IWfiAnalysis || sourceObject is IWfiGloss));

            m_cache             = sourceObject.Cache;
            m_mediator          = mediator;
            m_configurationNode = configurationNode;
            m_sourceObject      = sourceObject;
            if (sourceObject is IWfiWordform)
            {
                m_wordform = sourceObject as IWfiWordform;
            }
            else
            {
                IWfiAnalysis anal = null;
                if (sourceObject is IWfiAnalysis)
                {
                    anal = sourceObject as IWfiAnalysis;
                }
                else
                {
                    anal = WfiAnalysis.CreateFromDBObject(m_cache, sourceObject.OwnerHVO);
                }
                m_wordform = WfiWordform.CreateFromDBObject(m_cache, anal.OwnerHVO);
            }

            m_mediator.PropertyTable.SetProperty("IgnoreStatusPanel", true);
            m_mediator.PropertyTable.SetPropertyPersistence("IgnoreStatusPanel", false);
            m_progAdvInd = new ProgressReporting(m_toolStripProgressBar);

            // Gather up the nodes.
            string  xpathBase  = "/window/controls/parameters[@id='guicontrols']/guicontrol[@id='{0}']/parameters[@id='{1}']";
            string  xpath      = String.Format(xpathBase, "WordformConcordanceBrowseView", "WordformInTwficsOccurrenceList");
            XmlNode configNode = m_configurationNode.SelectSingleNode(xpath);
            // And create the RecordClerks.
            RecordClerk clerk = RecordClerkFactory.CreateClerk(m_mediator, configNode);

            clerk.ProgressReporter = m_progAdvInd;
            m_recordClerks[WfiWordform.kclsidWfiWordform]       = clerk;
            m_configurationNodes[WfiWordform.kclsidWfiWordform] = configNode;

            xpath                  = String.Format(xpathBase, "AnalysisConcordanceBrowseView", "AnalysisInTwficsOccurrenceList");
            configNode             = m_configurationNode.SelectSingleNode(xpath);
            clerk                  = RecordClerkFactory.CreateClerk(m_mediator, configNode);
            clerk.ProgressReporter = m_progAdvInd;
            m_recordClerks[WfiAnalysis.kclsidWfiAnalysis]       = clerk;
            m_configurationNodes[WfiAnalysis.kclsidWfiAnalysis] = configNode;

            xpath                  = String.Format(xpathBase, "GlossConcordanceBrowseView", "GlossInTwficsOccurrenceList");
            configNode             = m_configurationNode.SelectSingleNode(xpath);
            clerk                  = RecordClerkFactory.CreateClerk(m_mediator, configNode);
            clerk.ProgressReporter = m_progAdvInd;
            m_recordClerks[WfiGloss.kclsidWfiGloss]       = clerk;
            m_configurationNodes[WfiGloss.kclsidWfiGloss] = configNode;

            int concordOnHvo = sourceObject.Hvo;

            Debug.Assert(m_wordform != null);
            Debug.Assert(concordOnHvo > 0);

            tvSource.Font = new Font("Arial", 9);
            tvTarget.Font = new Font("Arial", 9);

            TreeNode srcTnWf = new TreeNode();
            TreeNode tarTnWf = new TreeNode();

            StringUtils.InitIcuDataDir();               // used for normalizing strings to NFC
            tarTnWf.Text = srcTnWf.Text = StringUtils.NormalizeToNFC(MEStrings.ksNoAnalysis);
            tarTnWf.Tag  = srcTnWf.Tag = m_wordform.Hvo;
            tvSource.Nodes.Add(srcTnWf);
            tvTarget.Nodes.Add(tarTnWf);
            if ((int)srcTnWf.Tag == concordOnHvo)
            {
                tvSource.SelectedNode = srcTnWf;
            }
            int cnt = 0;

            // Note: the left side source tree only has human approved analyses,
            // since only those can have instances from text-land pointing at them.
            foreach (int humanApprovedAnalId in m_wordform.HumanApprovedAnalyses)
            {
                IWfiAnalysis anal      = WfiAnalysis.CreateFromDBObject(m_wordform.Cache, humanApprovedAnalId);
                TreeNode     srcTnAnal = new TreeNode();
                TreeNode     tarTnAnal = new TreeNode();
                tarTnAnal.Text = srcTnAnal.Text = StringUtils.NormalizeToNFC(
                    String.Format(MEStrings.ksAnalysisX, (++cnt).ToString()));
                tarTnAnal.Tag = srcTnAnal.Tag = anal.Hvo;
                srcTnWf.Nodes.Add(srcTnAnal);
                tarTnWf.Nodes.Add(tarTnAnal);
                if ((int)srcTnAnal.Tag == concordOnHvo)
                {
                    tvSource.SelectedNode = srcTnAnal;
                }
                foreach (WfiGloss gloss in anal.MeaningsOC)
                {
                    TreeNode     srcTnGloss = new TreeNode();
                    TreeNode     tarTnGloss = new TreeNode();
                    ITsString    tss        = gloss.Form.BestAnalysisAlternative;
                    ITsTextProps props      = tss.get_PropertiesAt(0);
                    int          nVar;
                    int          ws       = props.GetIntPropValues((int)FwTextPropType.ktptWs, out nVar);
                    string       fontname = m_wordform.Cache.LanguageWritingSystemFactoryAccessor.get_EngineOrNull(ws).DefaultMonospace;
                    tarTnGloss.NodeFont = new Font(fontname, 9);
                    srcTnGloss.NodeFont = new Font(fontname, 9);
                    tarTnGloss.Text     = srcTnGloss.Text = StringUtils.NormalizeToNFC(tss.Text);
                    tarTnGloss.Tag      = srcTnGloss.Tag = gloss.Hvo;
                    srcTnAnal.Nodes.Add(srcTnGloss);
                    tarTnAnal.Nodes.Add(tarTnGloss);
                    if ((int)srcTnGloss.Tag == concordOnHvo)
                    {
                        tvSource.SelectedNode = srcTnGloss;
                    }
                }
            }
            tvSource.ExpandAll();
            tvSource.SelectedNode.EnsureVisible();
            tvTarget.ExpandAll();
        }
Exemplo n.º 3
0
		/// <summary>
		/// Initilize the gui control.
		/// </summary>
		/// <param name="cache"></param>
		/// <param name="mediator"></param>
		/// <param name="configurationNode">NB: In this case it is the main 'window' element node,
		/// se we have to drill down to find the control definition node(s).</param>
		/// <param name="sourceObject"></param>
		public void Init(Mediator mediator, XmlNode configurationNode, ICmObject sourceObject)
		{
			CheckDisposed();

			Debug.Assert(mediator != null);
			Debug.Assert(configurationNode != null);
			Debug.Assert(sourceObject != null && (sourceObject is IWfiWordform || sourceObject is IWfiAnalysis || sourceObject is IWfiGloss));

			m_cache = sourceObject.Cache;
			m_mediator = mediator;
			m_configurationNode = configurationNode;
			m_sourceObject = sourceObject;
			if (sourceObject is IWfiWordform)
			{
				m_wordform = sourceObject as IWfiWordform;
			}
			else
			{
				IWfiAnalysis anal = null;
				if (sourceObject is IWfiAnalysis)
					anal = sourceObject as IWfiAnalysis;
				else
					anal = WfiAnalysis.CreateFromDBObject(m_cache, sourceObject.OwnerHVO);
				m_wordform = WfiWordform.CreateFromDBObject(m_cache, anal.OwnerHVO);
			}

			m_mediator.PropertyTable.SetProperty("IgnoreStatusPanel", true);
			m_mediator.PropertyTable.SetPropertyPersistence("IgnoreStatusPanel", false);
			m_progAdvInd = new ProgressReporting(m_toolStripProgressBar);

			// Gather up the nodes.
			string xpathBase = "/window/controls/parameters[@id='guicontrols']/guicontrol[@id='{0}']/parameters[@id='{1}']";
			string xpath = String.Format(xpathBase, "WordformConcordanceBrowseView", "WordformInTwficsOccurrenceList");
			XmlNode configNode = m_configurationNode.SelectSingleNode(xpath);
			// And create the RecordClerks.
			RecordClerk clerk = RecordClerkFactory.CreateClerk(m_mediator, configNode);
			clerk.ProgressReporter = m_progAdvInd;
			m_recordClerks[WfiWordform.kclsidWfiWordform] = clerk;
			m_configurationNodes[WfiWordform.kclsidWfiWordform] = configNode;

			xpath = String.Format(xpathBase, "AnalysisConcordanceBrowseView", "AnalysisInTwficsOccurrenceList");
			configNode = m_configurationNode.SelectSingleNode(xpath);
			clerk = RecordClerkFactory.CreateClerk(m_mediator, configNode);
			clerk.ProgressReporter = m_progAdvInd;
			m_recordClerks[WfiAnalysis.kclsidWfiAnalysis] = clerk;
			m_configurationNodes[WfiAnalysis.kclsidWfiAnalysis] = configNode;

			xpath = String.Format(xpathBase, "GlossConcordanceBrowseView", "GlossInTwficsOccurrenceList");
			configNode = m_configurationNode.SelectSingleNode(xpath);
			clerk = RecordClerkFactory.CreateClerk(m_mediator, configNode);
			clerk.ProgressReporter = m_progAdvInd;
			m_recordClerks[WfiGloss.kclsidWfiGloss] = clerk;
			m_configurationNodes[WfiGloss.kclsidWfiGloss] = configNode;

			int concordOnHvo = sourceObject.Hvo;

			Debug.Assert(m_wordform != null);
			Debug.Assert(concordOnHvo > 0);

			tvSource.Font = new Font("Arial", 9);
			tvTarget.Font = new Font("Arial", 9);

			TreeNode srcTnWf = new TreeNode();
			TreeNode tarTnWf = new TreeNode();
			StringUtils.InitIcuDataDir();	// used for normalizing strings to NFC
			tarTnWf.Text = srcTnWf.Text = StringUtils.NormalizeToNFC(MEStrings.ksNoAnalysis);
			tarTnWf.Tag = srcTnWf.Tag = m_wordform.Hvo;
			tvSource.Nodes.Add(srcTnWf);
			tvTarget.Nodes.Add(tarTnWf);
			if ((int)srcTnWf.Tag == concordOnHvo)
				tvSource.SelectedNode = srcTnWf;
			int cnt = 0;
			// Note: the left side source tree only has human approved analyses,
			// since only those can have instances from text-land pointing at them.
			foreach (int humanApprovedAnalId in m_wordform.HumanApprovedAnalyses)
			{
				IWfiAnalysis anal = WfiAnalysis.CreateFromDBObject(m_wordform.Cache, humanApprovedAnalId);
				TreeNode srcTnAnal = new TreeNode();
				TreeNode tarTnAnal = new TreeNode();
				tarTnAnal.Text = srcTnAnal.Text = StringUtils.NormalizeToNFC(
					String.Format(MEStrings.ksAnalysisX, (++cnt).ToString()));
				tarTnAnal.Tag = srcTnAnal.Tag = anal.Hvo;
				srcTnWf.Nodes.Add(srcTnAnal);
				tarTnWf.Nodes.Add(tarTnAnal);
				if ((int)srcTnAnal.Tag == concordOnHvo)
					tvSource.SelectedNode = srcTnAnal;
				foreach (WfiGloss gloss in anal.MeaningsOC)
				{
					TreeNode srcTnGloss = new TreeNode();
					TreeNode tarTnGloss = new TreeNode();
					ITsString tss = gloss.Form.BestAnalysisAlternative;
					ITsTextProps props = tss.get_PropertiesAt(0);
					int nVar;
					int ws = props.GetIntPropValues((int)FwTextPropType.ktptWs, out nVar);
					string fontname = m_wordform.Cache.LanguageWritingSystemFactoryAccessor.get_EngineOrNull(ws).DefaultMonospace;
					tarTnGloss.NodeFont = new Font(fontname, 9);
					srcTnGloss.NodeFont = new Font(fontname, 9);
					tarTnGloss.Text = srcTnGloss.Text = StringUtils.NormalizeToNFC(tss.Text);
					tarTnGloss.Tag = srcTnGloss.Tag = gloss.Hvo;
					srcTnAnal.Nodes.Add(srcTnGloss);
					tarTnAnal.Nodes.Add(tarTnGloss);
					if ((int)srcTnGloss.Tag == concordOnHvo)
						tvSource.SelectedNode = srcTnGloss;
				}
			}
			tvSource.ExpandAll();
			tvSource.SelectedNode.EnsureVisible();
			tvTarget.ExpandAll();
		}
Exemplo n.º 4
0
		/// <summary>
		/// Initilize the gui control.
		/// </summary>
		/// <param name="mediator"></param>
		/// <param name="configurationNode">NB: In this case it is the main 'window' element node,
		/// se we have to drill down to find the control definition node(s).</param>
		/// <param name="sourceObject"></param>
		public void Init(Mediator mediator, XmlNode configurationNode, ICmObject sourceObject)
		{
			CheckDisposed();

			Debug.Assert(mediator != null);
			Debug.Assert(configurationNode != null);
			Debug.Assert(sourceObject != null && (sourceObject is IWfiWordform || sourceObject is IWfiAnalysis || sourceObject is IWfiGloss));

			m_cache = sourceObject.Cache;
			m_mediator = mediator;
			m_configurationNode = configurationNode;
			if (sourceObject is IWfiWordform)
			{
				m_wordform = (IWfiWordform)sourceObject;
			}
			else
			{
				var anal = sourceObject is IWfiAnalysis
										? (IWfiAnalysis)sourceObject
										: sourceObject.OwnerOfClass<IWfiAnalysis>();
				m_wordform = anal.OwnerOfClass<IWfiWordform>();
			}

			helpProvider.HelpNamespace = m_mediator.HelpTopicProvider.HelpFile;
			helpProvider.SetHelpNavigator(this, HelpNavigator.Topic);
			helpProvider.SetHelpKeyword(this, m_mediator.HelpTopicProvider.GetHelpString(s_helpTopic));
			helpProvider.SetShowHelp(this, true);


			m_mediator.PropertyTable.SetProperty("IgnoreStatusPanel", true);
			m_mediator.PropertyTable.SetPropertyPersistence("IgnoreStatusPanel", false);
			m_progAdvInd = new ProgressReporting(m_toolStripProgressBar);

			// Gather up the nodes.
			const string xpathBase = "/window/controls/parameters[@id='guicontrols']/guicontrol[@id='{0}']/parameters[@id='{1}']";
			var xpath = String.Format(xpathBase, "WordformConcordanceBrowseView", "WordformInSegmentsOccurrenceList");
			var configNode = m_configurationNode.SelectSingleNode(xpath);
			// And create the RecordClerks.
			var clerk = RecordClerkFactory.CreateClerk(m_mediator, configNode, true);
			clerk.ProgressReporter = m_progAdvInd;
			m_recordClerks[WfiWordformTags.kClassId] = clerk;
			m_configurationNodes[WfiWordformTags.kClassId] = configNode;

			xpath = String.Format(xpathBase, "AnalysisConcordanceBrowseView", "AnalysisInSegmentsOccurrenceList");
			configNode = m_configurationNode.SelectSingleNode(xpath);
			clerk = RecordClerkFactory.CreateClerk(m_mediator, configNode, true);
			clerk.ProgressReporter = m_progAdvInd;
			m_recordClerks[WfiAnalysisTags.kClassId] = clerk;
			m_configurationNodes[WfiAnalysisTags.kClassId] = configNode;

			xpath = String.Format(xpathBase, "GlossConcordanceBrowseView", "GlossInSegmentsOccurrenceList");
			configNode = m_configurationNode.SelectSingleNode(xpath);
			clerk = RecordClerkFactory.CreateClerk(m_mediator, configNode, true);
			clerk.ProgressReporter = m_progAdvInd;
			m_recordClerks[WfiGlossTags.kClassId] = clerk;
			m_configurationNodes[WfiGlossTags.kClassId] = configNode;

			Debug.Assert(m_wordform != null);
			Debug.Assert(sourceObject != null);

			tvSource.Font = new Font(MiscUtils.StandardSansSerif, 9);
			tvTarget.Font = new Font(MiscUtils.StandardSansSerif, 9);

			var srcTnWf = new TreeNode();
			var tarTnWf = new TreeNode();
			tarTnWf.Text = srcTnWf.Text = TsStringUtils.NormalizeToNFC(MEStrings.ksNoAnalysis);
			tarTnWf.Tag = srcTnWf.Tag = m_wordform;
			tvSource.Nodes.Add(srcTnWf);
			tvTarget.Nodes.Add(tarTnWf);
			if (srcTnWf.Tag == sourceObject)
				tvSource.SelectedNode = srcTnWf;
			var cnt = 0;
			// Note: the left side source tree only has human approved analyses,
			// since only those can have instances from text-land pointing at them.
			foreach (var anal in m_wordform.HumanApprovedAnalyses)
			{
				var srcTnAnal = new TreeNode();
				var tarTnAnal = new TreeNode
									{
										Text = srcTnAnal.Text = TsStringUtils.NormalizeToNFC(
																	String.Format(MEStrings.ksAnalysisX, (++cnt))),
										Tag = srcTnAnal.Tag = anal
									};
				srcTnWf.Nodes.Add(srcTnAnal);
				tarTnWf.Nodes.Add(tarTnAnal);
				if (srcTnAnal.Tag == sourceObject)
					tvSource.SelectedNode = srcTnAnal;
				foreach (var gloss in anal.MeaningsOC)
				{
					var srcTnGloss = new TreeNode();
					var tarTnGloss = new TreeNode();
					var tss = gloss.Form.BestAnalysisAlternative;
					var props = tss.get_PropertiesAt(0);
					int nVar;
					var ws = props.GetIntPropValues((int)FwTextPropType.ktptWs, out nVar);
					var fontname = m_wordform.Cache.ServiceLocator.WritingSystemManager.Get(ws).DefaultFontName;
					tarTnGloss.NodeFont = new Font(fontname, 9);
					srcTnGloss.NodeFont = new Font(fontname, 9);
					tarTnGloss.Text = srcTnGloss.Text = TsStringUtils.NormalizeToNFC(tss.Text);
					tarTnGloss.Tag = srcTnGloss.Tag = gloss;
					srcTnAnal.Nodes.Add(srcTnGloss);
					tarTnAnal.Nodes.Add(tarTnGloss);
					if (srcTnGloss.Tag == sourceObject)
						tvSource.SelectedNode = srcTnGloss;
				}
			}
			tvSource.ExpandAll();
			tvSource.SelectedNode.EnsureVisible();
			tvTarget.ExpandAll();
		}
Exemplo n.º 5
0
        /// <summary>
        /// Initilize the gui control.
        /// </summary>
        /// <param name="mediator"></param>
        /// <param name="propertyTable"></param>
        /// <param name="configurationNode">NB: In this case it is the main 'window' element node,
        /// se we have to drill down to find the control definition node(s).</param>
        /// <param name="sourceObject"></param>
        public void Init(Mediator mediator, PropertyTable propertyTable, XmlNode configurationNode, ICmObject sourceObject)
        {
            CheckDisposed();

            Debug.Assert(mediator != null);
            Debug.Assert(configurationNode != null);
            Debug.Assert(sourceObject != null && (sourceObject is IWfiWordform || sourceObject is IWfiAnalysis || sourceObject is IWfiGloss));

            m_cache             = sourceObject.Cache;
            m_mediator          = mediator;
            m_propertyTable     = propertyTable;
            m_configurationNode = configurationNode;
            if (sourceObject is IWfiWordform)
            {
                m_wordform = (IWfiWordform)sourceObject;
            }
            else
            {
                var anal = sourceObject is IWfiAnalysis
                                                                                ? (IWfiAnalysis)sourceObject
                                                                                : sourceObject.OwnerOfClass <IWfiAnalysis>();
                m_wordform = anal.OwnerOfClass <IWfiWordform>();
            }

            helpProvider.HelpNamespace = m_propertyTable.GetValue <IHelpTopicProvider>("HelpTopicProvider").HelpFile;
            helpProvider.SetHelpNavigator(this, HelpNavigator.Topic);
            helpProvider.SetHelpKeyword(this, m_propertyTable.GetValue <IHelpTopicProvider>("HelpTopicProvider").GetHelpString(s_helpTopic));
            helpProvider.SetShowHelp(this, true);


            m_propertyTable.SetProperty("IgnoreStatusPanel", true, true);
            m_propertyTable.SetPropertyPersistence("IgnoreStatusPanel", false);
            m_progAdvInd = new ProgressReporting(m_toolStripProgressBar);

            // Gather up the nodes.
            const string xpathBase  = "/window/controls/parameters[@id='guicontrols']/guicontrol[@id='{0}']/parameters[@id='{1}']";
            var          xpath      = String.Format(xpathBase, "WordformConcordanceBrowseView", "WordformInSegmentsOccurrenceList");
            var          configNode = m_configurationNode.SelectSingleNode(xpath);
            // And create the RecordClerks.
            var clerk = RecordClerkFactory.CreateClerk(m_mediator, m_propertyTable, configNode, true);

            clerk.ProgressReporter = m_progAdvInd;
            m_recordClerks[WfiWordformTags.kClassId]       = clerk;
            m_configurationNodes[WfiWordformTags.kClassId] = configNode;

            xpath                  = String.Format(xpathBase, "AnalysisConcordanceBrowseView", "AnalysisInSegmentsOccurrenceList");
            configNode             = m_configurationNode.SelectSingleNode(xpath);
            clerk                  = RecordClerkFactory.CreateClerk(m_mediator, m_propertyTable, configNode, true);
            clerk.ProgressReporter = m_progAdvInd;
            m_recordClerks[WfiAnalysisTags.kClassId]       = clerk;
            m_configurationNodes[WfiAnalysisTags.kClassId] = configNode;

            xpath                  = String.Format(xpathBase, "GlossConcordanceBrowseView", "GlossInSegmentsOccurrenceList");
            configNode             = m_configurationNode.SelectSingleNode(xpath);
            clerk                  = RecordClerkFactory.CreateClerk(m_mediator, m_propertyTable, configNode, true);
            clerk.ProgressReporter = m_progAdvInd;
            m_recordClerks[WfiGlossTags.kClassId]       = clerk;
            m_configurationNodes[WfiGlossTags.kClassId] = configNode;

            Debug.Assert(m_wordform != null);
            Debug.Assert(sourceObject != null);

            tvSource.Font = new Font(MiscUtils.StandardSansSerif, 9);
            tvTarget.Font = new Font(MiscUtils.StandardSansSerif, 9);

            var srcTnWf = new TreeNode();
            var tarTnWf = new TreeNode();

            tarTnWf.Text = srcTnWf.Text = TsStringUtils.NormalizeToNFC(MEStrings.ksNoAnalysis);
            tarTnWf.Tag  = srcTnWf.Tag = m_wordform;
            tvSource.Nodes.Add(srcTnWf);
            tvTarget.Nodes.Add(tarTnWf);
            if (srcTnWf.Tag == sourceObject)
            {
                tvSource.SelectedNode = srcTnWf;
            }
            var cnt = 0;

            // Note: the left side source tree only has human approved analyses,
            // since only those can have instances from text-land pointing at them.
            foreach (var anal in m_wordform.HumanApprovedAnalyses)
            {
                var srcTnAnal = new TreeNode();
                var tarTnAnal = new TreeNode
                {
                    Text = srcTnAnal.Text = TsStringUtils.NormalizeToNFC(
                        String.Format(MEStrings.ksAnalysisX, (++cnt))),
                    Tag = srcTnAnal.Tag = anal
                };
                srcTnWf.Nodes.Add(srcTnAnal);
                tarTnWf.Nodes.Add(tarTnAnal);
                if (srcTnAnal.Tag == sourceObject)
                {
                    tvSource.SelectedNode = srcTnAnal;
                }
                foreach (var gloss in anal.MeaningsOC)
                {
                    var srcTnGloss = new TreeNode();
                    var tarTnGloss = new TreeNode();
                    var tss        = gloss.Form.BestAnalysisAlternative;
                    var props      = tss.get_PropertiesAt(0);
                    int nVar;
                    var ws       = props.GetIntPropValues((int)FwTextPropType.ktptWs, out nVar);
                    var fontname = m_wordform.Cache.ServiceLocator.WritingSystemManager.Get(ws).DefaultFontName;
                    tarTnGloss.NodeFont = new Font(fontname, 9);
                    srcTnGloss.NodeFont = new Font(fontname, 9);
                    tarTnGloss.Text     = srcTnGloss.Text = TsStringUtils.NormalizeToNFC(tss.Text);
                    tarTnGloss.Tag      = srcTnGloss.Tag = gloss;
                    srcTnAnal.Nodes.Add(srcTnGloss);
                    tarTnAnal.Nodes.Add(tarTnGloss);
                    if (srcTnGloss.Tag == sourceObject)
                    {
                        tvSource.SelectedNode = srcTnGloss;
                    }
                }
            }
            tvSource.ExpandAll();
            tvSource.SelectedNode.EnsureVisible();
            tvTarget.ExpandAll();
        }