public MainWindow()
        {
            InitializeComponent();

            this.analyzer = new AnswerSheetAnalyzer();
            this.visualizer = new AnswerSheetVisualizer(analyzer);
        }
 /// <summary>
 /// Initialization with the result
 /// </summary>
 /// <param name="analysis"></param>
 /// <param name="c"></param>
 public AnswerGroupWindow(AnswerSheetAnalyzer a, AnswerSheetVisualizer v)
     : this()
 {
     this.analyzer = a;
     this.visualizer = v;
     this.currentMethod = AnswerSheetAnalyzer.ClassificationFeature.Proposed;
     ChangeMethod(this.currentMethod);
 }
        /// <summary>
        /// Initialization with answer information
        /// </summary>
        /// <param name="ans"></param>
        /// <param name="controller"></param>
        /// <param name="w"></param>
        public AnswerSheetItemData(AnswerSheet ans, AnswerSheetVisualizer v, AnswerGroupWindow w)
        {
            this.parentWindow = w;
            this.answerData = ans;
            this.visualizer = v;
            this.strokes = new StrokeCollection();
            foreach (AnalysisPenStroke s in ans.Strokes)
            {
                this.strokes.Add(s.GetStrokeObject(Config.OutputThumbnailCanvasWidth, Config.OutputThumbnailCanvasHeight));
            }
            this.NameLabel = ans.Name;
            this.timeLabel = "Time: " + ((double)ans.AnswerTime / 1000.0).ToString("f3") + "(sec)";

            double writingRatio = ans.WritingRatio;
            this.writingTime = new GridLength(MaxWritingTime * writingRatio * 2.5);
            this.writingTimeLabel = (writingRatio * 100.0).ToString("F2") + "%";

            double speedAvg = ans.WritingSpeedAvg;
            this.writingSpeedAvg = new GridLength(MaxWritingTime * (speedAvg - 0.5));
            this.writingSpeedAvgLabel = speedAvg.ToString("F4");

            double speedVar = ans.WritingSpeedVar;
            this.writingSpeedVar = new GridLength(MaxWritingTime * speedVar);
            this.writingSpeedVarLabel = speedVar.ToString("F4");
        }
        /// <summary>
        /// Initialization with group information
        /// </summary>
        /// <param name="group"></param>
        /// <param name="controller"></param>
        /// <param name="w"></param>
        public AnswerGroupItemData(AnswerSheetGroup group, AnswerSheetVisualizer visualizer, AnswerGroupWindow w)
        {
            this.answerGroupData = group;
            this.groupNameLabel = group.Name;
            this.timeLabel = "Average Time: " + (group.GetAverageAnswerTime() / 1000.0).ToString("f3") + "(sec)";

            this.AnswerSheetData = new ObservableCollection<AnswerSheetItemData>();
            foreach (AnswerSheet ans in group.AnswerSheetList)
            {
                this.AnswerSheetData.Add(new AnswerSheetItemData(ans, visualizer, w));
            }

            // sort item by answer time
            this.AnswerSheetData = new ObservableCollection<AnswerSheetItemData>(this.AnswerSheetData.OrderBy(n => n.AnswerData.AnswerTime));
        }