﻿using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LLVM.ClangTidy
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [CLSCompliant(false), ComVisible(true)]
    public class ClangTidyConfigurationPage : DialogPage
    {
        ClangTidyPropertyGrid Grid = null;
        protected override IWin32Window Window
        {
            get
            {
                if (Grid == null)
                    Grid = new ClangTidyPropertyGrid();
                return Grid;
            }
        }

        protected override void SaveSetting(PropertyDescriptor property)
        {
            base.SaveSetting(property);
        }

        public override void SaveSettingsToStorage()
        {
            if (Grid != null)
                Grid.SaveSettingsToStorage();

            base.SaveSettingsToStorage();
        }

        public override void ResetSettings()
        {
            base.ResetSettings();
        }

        protected override void LoadSettingFromStorage(PropertyDescriptor prop)
        {
            base.LoadSettingFromStorage(prop);
        }

        public override void LoadSettingsFromStorage()
        {
            if (Grid != null)
                Grid.InitializeSettings();
            base.LoadSettingsFromStorage();
        }
    }
}
