﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using System.Runtime.InteropServices;
using System.Windows.Controls;
using Microsoft.VisualStudio.LanguageServices;
using Microsoft.VisualStudio.Shell;
using Roslyn.Hosting.Diagnostics.PerfMargin;
using Roslyn.Utilities;

namespace Roslyn.VisualStudio.DiagnosticsWindow
{
    [Guid("b2da68d7-fd1c-491a-a9a0-24f597b9f56c")]
    public sealed class DiagnosticsWindow : ToolWindowPane
    {
        public VisualStudioWorkspace? Workspace { get; private set; }

        /// <summary>
        /// Standard constructor for the tool window.
        /// </summary>
        public DiagnosticsWindow(object _)
            : base(null)
        {
            // Set the window title reading it from the resources.
            Caption = Resources.ToolWindowTitle;
            // Set the image that will appear on the tab of the window frame
            // when docked with an other window
            // The resource ID correspond to the one defined in the resx file
            // while the Index is the offset in the bitmap strip. Each image in
            // the strip being 16x16.
            BitmapResourceID = 301;
            BitmapIndex = 1;

            // This is the user control hosted by the tool window; Note that, even if this class implements IDisposable,
            // we are not calling Dispose on this object. This is because ToolWindowPane calls Dispose on 
            // the object returned by the Content property.
            var perfMarginPanel = new TabItem()
            {
                Header = "Perf",
                Content = new PerfMarginPanel()
            };

            var telemetryPanel = new TabItem()
            {
                Header = "Telemetry",
                Content = new TelemetryPanel()
            };

            var workspacePanel = new TabItem()
            {
                Header = "Workspace",
                Content = new WorkspacePanel(this)
            };

            var tabControl = new TabControl
            {
                TabStripPlacement = Dock.Bottom
            };

            tabControl.Items.Add(perfMarginPanel);
            tabControl.Items.Add(telemetryPanel);
            tabControl.Items.Add(workspacePanel);

            Content = tabControl;
        }

        public void Initialize(VisualStudioWorkspace workspace)
        {
            Contract.ThrowIfFalse(Workspace == null);
            Workspace = workspace;
        }
    }
}
