示例#1
0
        public override void GetData(object inObject, Stream outStream)
        {
            var wr = inObject as WeakReference;

            inObject = wr.Target;

            // Object -> string に変換
            var converter = new ObjectToStringConverter(ObjectVisualizer.GetLanguageTypes());
            var xmlString = string.Empty;

            if (inObject is Type)
            {
                xmlString = converter.CreateBaseTypeTree(inObject as Type);
            }
            else if (inObject is StackFrame[])
            {
                xmlString = converter.CreateCallTree(inObject as StackFrame[]);
            }
            else
            {
                xmlString = converter.Convert(inObject);
            }

            // シリアライズして渡す
            var writer = new StreamWriter(outStream);

            writer.Write(xmlString);
            writer.Flush();
        }
示例#2
0
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            // 今回渡ってきたデータを、いったん、テキストファイルに保存する
            var workDirectory = Path.Combine(GetDllDirectory(), "ObjectVisualization_Work");
            var infoDirectory = Path.Combine(workDirectory, "ObjectInfo");

            if (!Directory.Exists(infoDirectory))
            {
                Directory.CreateDirectory(infoDirectory);
            }

            var xmlString   = new StreamReader(objectProvider.GetData()).ReadToEnd();
            var historyFile = Path.Combine(infoDirectory, $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fff")}.txt");

            File.WriteAllText(historyFile, xmlString, new UTF8Encoding());

            // 全過去履歴を読み込んで表示する
            var dlg       = new ObjectWindow();
            var converter = new StringToWPFViewConverter(ObjectVisualizer.GetLanguageTypes());
            var observers = new Dictionary <CheckBox, string>();
            var txtFiles  = Directory.GetFiles(infoDirectory, "*.txt");

            var previousXmlString = string.Empty;
            var previousElement   = default(FrameworkElement);

            foreach (var txtFile in txtFiles)
            {
                var fileName   = Path.GetFileNameWithoutExtension(txtFile);
                var datas      = fileName.Split('_');
                var createTime = $"{datas[0]}/{datas[1]}/{datas[2]} {datas[3]}:{datas[4]}:{datas[5]}.{datas[6]}";

                var timeBlock = new TextBlock()
                {
                    Text = createTime, Foreground = Brushes.Gray, HorizontalAlignment = HorizontalAlignment.Left
                };
                var timeCheck = new CheckBox()
                {
                    Content = "履歴に残しておき、次回も表示する", VerticalAlignment = VerticalAlignment.Center
                };
                var timePanel = new StackPanel()
                {
                    Orientation = Orientation.Horizontal
                };
                timePanel.Children.Add(timeBlock);
                timePanel.Children.Add(timeCheck);

                xmlString = File.ReadAllText(txtFile, new UTF8Encoding());
                var element = default(FrameworkElement);

                if (xmlString.StartsWith("BaseTypeTree:"))
                {
                    element = converter.CreateBaseTypeTree(xmlString);
                }
                else if (xmlString.StartsWith("CallTree:"))
                {
                    element = converter.CreateCallTree(xmlString);
                }
                else
                {
                    element = converter.Convert(xmlString);
                }

                // ※MainWindow / Resources 内で中央に寄るように設定している、子コントロールの場合、中央に表示したいため
                // トップコントロールが TextBlock の場合、中央に寄ってしまうので、左寄せに調整
                if (element is TextBlock)
                {
                    var block1 = element as TextBlock;
                    block1.HorizontalAlignment = HorizontalAlignment.Left;
                }

                var grid1 = new Grid();
                grid1.ColumnDefinitions.Add(new ColumnDefinition());
                grid1.RowDefinitions.Add(new RowDefinition()
                {
                    Height = GridLength.Auto
                });
                grid1.RowDefinitions.Add(new RowDefinition()
                {
                    Height = GridLength.Auto
                });

                grid1.Children.Add(timePanel);
                Grid.SetRow(timePanel, 0);
                Grid.SetColumn(timePanel, 0);

                grid1.Children.Add(element);
                Grid.SetRow(element, 1);
                Grid.SetColumn(element, 0);

                // 次の出力結果との間を開けて、見やすく調整する
                grid1.Margin = new Thickness(10, 5, 10, 55);

                dlg.AddData(grid1);
                observers.Add(timeCheck, txtFile);

                // 差異データチェック
                if (!xmlString.StartsWith("BaseTypeTree:") && !xmlString.StartsWith("CallTree:"))
                {
                    if (previousXmlString != xmlString && IsSameTypeLayout(previousXmlString, xmlString))
                    {
                        SetColorDifferenceData(previousElement, element);
                    }

                    // 次用にバックアップ。element 変数に色付けしてしまったので、色付け前をバックアップさせる
                    var dummy = converter.Convert(xmlString);
                    if (dummy is TextBlock)
                    {
                        var block1 = dummy as TextBlock;
                        block1.HorizontalAlignment = HorizontalAlignment.Left;
                    }

                    previousElement = dummy;
                }

                previousXmlString = xmlString;
            }

            dlg.Closed += (s, e) =>
            {
                // 履歴を消していいものは消す
                foreach (var key in observers.Keys)
                {
                    if (!key.IsChecked.HasValue || !key.IsChecked.Value)
                    {
                        var txtFile = observers[key];
                        File.Delete(txtFile);
                    }
                }
            };

            dlg.ShowDialog();
        }