/// <summary>
        /// Make sure cluster is visible on screen.
        /// </summary>
        /// <param name="cluster">Cluster to performance.</param>
        public void MakeSureVisible(CostNodeCluster cluster)
        {
            if (CostNodeClusterGlyphs == null || CostNodeClusterGlyphs.Count == 0)
            {
                return;
            }

            foreach (CostNodeClusterGlyph cnc in CostNodeClusterGlyphs)
            {
                if (cnc.CostNodeCluster == cluster)
                {
                    if (cnc.Rectangle.Left < this.HorizontalScroll.Value ||
                        cnc.Rectangle.Left > (this.HorizontalScroll.Value + this.Width))
                    {
                        // unvisible now
                        int locate = cnc.Rectangle.Left - (this.Width / 2);
                        locate = Math.Max(locate, 0);
                        if (locate != 0)
                        {
                            locate += cnc.Rectangle.Width;
                        }

                        this.HorizontalScroll.Value = Math.Min(locate, HorizontalScroll.Maximum);
                        this.Refresh();

                        // this.HorizontalScroll.Value = Math.Min(locate, HorizontalScroll.Maximum);
                        // this.Refresh();
                        // Application.DoEvents();
                    }

                    return;
                }
            }
        }
        /// <summary>
        /// Handle Tag.CandidateDump.
        /// </summary>
        /// <param name="utterance">Utterance to fill in.</param>
        /// <param name="line">Section starting line.</param>
        /// <param name="tr">Text data.</param>
        /// <returns>Next tag, or null for end.</returns>
        private static string HandleTagCandidateDump(TtsUtterance utterance,
            string line, TextReader tr)
        {
            Debug.Assert(ParseTag(line) == Tag.CandidateDump);
            while ((line = tr.ReadLine()) != null)
            {
            DO_WITH_CANDIDATE:

                if (string.IsNullOrEmpty(line))
                {
                    continue;
                }

                if (IsTag(line))
                {
                    return line;
                }

                if (line.StartsWith("candidate", StringComparison.Ordinal))
                {
                    CostNodeCluster cluster = new CostNodeCluster();

                    string[] items = line.Split(new char[] { ' ' },
                        StringSplitOptions.RemoveEmptyEntries);
                    cluster.Index = int.Parse(items[1], CultureInfo.InvariantCulture);
                    cluster.TtsUnit = utterance.Script.Units[cluster.Index];
                    while ((line = tr.ReadLine()) != null)
                    {
                        if (string.IsNullOrEmpty(line))
                        {
                            continue;
                        }

                        if (line.StartsWith("unit", StringComparison.Ordinal))
                        {
                            CostNode node = ParseCostNode(line);
                            node.ClusterIndex = cluster.Index;
                            cluster.AddNode(node);
                            continue;
                        }

                        break;
                    }

                    utterance.Viterbi.CostNodeClusters.Add(cluster);

                    goto DO_WITH_CANDIDATE;
                }
            }

            return MoveToNextTag(tr);
        }